1、第2章 STM32单片机IO端口编程2.1 STM322.1 STM32单片机单片机管脚和命名规则管脚和命名规则2.2 STM322.2 STM32单片机单片机时钟时钟 配置配置2.3 STM322.3 STM32单片机单片机I/OI/O端口配置端口配置2.4 STM322.4 STM32单片机单片机I/OI/O端编程步骤端编程步骤 STM32单片机单片机管脚管脚 STM32系列单片机系列单片机命名规则命名规则 2.1 STM322.1 STM32单片机管脚和命名规则单片机管脚和命名规则PA口 16脚PB口16脚PC口3脚PD口2脚STM32F103CBT6 共有共有37个个I/O管脚管脚:P
2、A口 16脚+PB口16脚+PC口3脚+PD口2脚。STM32单片机管脚:以单片机管脚:以STM32F103Cx为例,为例,采用的封装形式采用的封装形式LQFP48一般而言,嵌入式系统在工作前,都要进行初始化工作,其中包括调用RCC_Configuration(复位和时钟设置)函数。用于系统复位和初始化STM32系列微控制器的时钟。2.2 STM322.2 STM32单片机单片机时钟配置时钟配置2.2.1 STM322.2.1 STM32时钟系统时钟系统2.2.2 2.2.2 RCC_ConfigurationRCC_Configuration(复位和时钟设置)(复位和时钟设置)函数函数STM
3、32系列微控制器中,有5个时钟源:HSI (High Speed Internal):高速内部时钟、HSE(High Speed External):高速外部时钟、LSI(Low Speed Internal):低速内部时钟、LSE(Low Speed External):低速外部时钟、PLL(Phase Locked Loop):锁相环倍频输出。其中的HSI、HSE、或PLL可被用来驱动系统时钟。其中的LSI、LSE作为二级时钟源。STM32时钟系统结构图(P56)2.2.1 STM322.2.1 STM32时钟系统时钟系统其中的HSI、HSE、或PLL可被用来驱动系统时钟。实际PLL是来自
4、于HSI、HSE 外设总线:包括APB1(Advanced Peripheral Bus 1)和APB2(Advanced Peripheral Bus 2)APB2:用于高速外设APB1:用于低速外设 AMBA片上总线:已成为一种流行的工业片上总线标准。它包括AHB(Advanced High performance Bus)和APB(Advanced Peripheral Bus),前者作为系统总线,后者作为外设总线。STM32系统结构图系统结构图连接在APB1(低速外设)上的设备:有连接在APB2(高速外设)上的设备:有连接在AHB(Advanced High performance B
5、us)上的设备:有1 1、使能、使能 挂接在挂接在APB1APB1总线总线上的外设上的外设 对应的时钟对应的时钟 命令:命令:RCC_APB1PeriphClockCmd()函数函数 例如,使能例如,使能TIM2对应的时钟:对应的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd()函数函数2 2、使能、使能 挂接在挂接在APB2APB2总线总线上的外设上的外设 对应的时钟对应的时钟 命令:命令:例如,使能例如,使能GPIO端口对应的时钟:端口对应的时钟:RCC_APB2PeriphClock
6、Cmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);3 3、使能、使能 挂接在挂接在AHBAHB总线总线上的外设上的外设 对应的时钟对应的时钟 命令:命令:RCC_AHBPeriphClockCmd()函数函数 例如,使能例如,使能DMA对应的时钟:对应的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA,ENABLE);使用操作符使用操作符“|”可以一次选中上表中的一个或多个取值的组合作为可以一次选中上表中的一个或多个取值的组合作为该参数的值。该参数的值。复位和时钟控制(RCC)STM32F103xx增
7、强型增强型模模块框图块框图基于ARM Cortex内核的MCU 和 普通的8/16位单片机 在系统结构上 最大区别最大区别:普通的8/16位单片机:只有单片机:只有1个系统时钟频率,个系统时钟频率,而基于而基于ARM Cortex内核的内核的MCU:具有多个时钟频率,分别供:具有多个时钟频率,分别供给内核给内核 和和 不同外设模块使用。不同外设模块使用。本课程的学习难点之一:就是本课程的学习难点之一:就是ARM时钟时钟 比比 单片机时钟单片机时钟 复杂得多。复杂得多。为什么ARM时钟这么复杂?原因二:时钟分开有助于实现原因二:时钟分开有助于实现低功耗低功耗。原因一:原因一:高速时钟高速时钟供供
8、中央处理器中央处理器等等高速高速设备使用,设备使用,低速时钟低速时钟供供外设外设等等低速低速设备使用。设备使用。时钟输出使能 STM32处理器因为低功耗低功耗的需要,各模块需要分别独立开启时钟。当需要使用某个外设模块时,记得一定当需要使用某个外设模块时,记得一定要先使能对应的时钟。要先使能对应的时钟。否则,这个外设不能工作。2.2.2 2.2.2 R RC CC C_Configuration_Configuration()函数函数1、RCC复位和时钟配置寄存器组2、枚举类型ErrorStatus 3、RCC_Configuration():(复位和时钟设置)函数(Reset and Cloc
9、k Configuration(),复位和时钟设置复位和时钟设置 函数函数)STM32STM32单片机的单片机的复位和时钟设置复位和时钟设置 :共包括共包括1010个设置寄存器个设置寄存器一个一个32位的位的时钟控制时钟控制寄存器寄存器(RCC_CR)一个一个32位的位的时钟配置时钟配置寄存器寄存器(RCC_CFGR)一个一个32位的位的时钟中断时钟中断寄存器寄存器(RCC_CIR)一个一个32位的位的APB2外设外设复位复位寄存器寄存器(RCC_APB2RSTR)一个一个32位的位的APB1外设外设复位复位寄存器寄存器(RCC_APB1RSTR)一个一个32位的位的AHB外设时钟外设时钟使能
10、使能寄存器寄存器(RCC_AHBENR)一个一个32位的位的APB2外设时钟外设时钟使能使能寄存器寄存器(RCC_APB2ENR)一个一个32位的位的APB1外设时钟外设时钟使能使能寄存器寄存器(RCC_APB1ENR)一个一个32位的位的备份域控制备份域控制寄存器寄存器(RCC_BDCR)一个一个32位的位的控制控制/状态状态寄存器寄存器(RCC_CSR)Backup domain control register(RCC_BDCR)详见详见参考手册参考手册 V10_1 第第P60编程时,时钟的具体配置是从RCC(Reset and Clock Configuration,复位和时钟配置)寄
11、存器组开始。在固件库中,用结构体RCC_TypeDef 定义 RCC寄存器组:在文件“stm32f10 x_map.h”中,定义如下:/*-Real-Time Clock-*/typedef struct vu32 CR;vu32 CFGR;vu32 CIR;vu32 APB2RSTR;vu32 APB1RSTR;vu32 AHBENR;vu32 APB2ENR;vu32 APB1ENR;vu32 BDCR;vu32 CSR;RCC_TypeDef;1、RCC复位和时钟配置寄存器组/*Peripheral base address in the bit-band region*/#define
12、 PERIPH_BASE (u32)0 x40000000)/*Peripheral memory map*/#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE+0 x1 0000)#define AHBPERIPH_BASE (PERIPH_BASE+0 x2 0000)#define RCC_BASE (AHBPERIPH_BASE+0 x1000)#ifdef _RCC#define RCC (RCC_TypeDef*)RCC_BASE)#endif /*_RCC*/该宏定义的功能:在程序中,所有
13、写RCC的地方,编译器的预处理程序,都将它替换为:(RCC_TypeDef*)0 x40021000)2、枚举类型ErrorStatus 在文件“stm32f10 x_type.h”中,包含typedef enum ERROR=0,SUCCESS=!ERROR ErrorStatus;该语句,定义了新枚举类型名ErrorStatus,代表左侧定义的,代表左侧定义的枚举类型。枚举类型。3、RCC_Configuration(复位和时钟设置)函数:在“HelloRobot.h”中ErrorStatus HSEStartUpStatus;void RCC_Configuration(void)/*将
14、外设将外设RCC寄存器组寄存器组重新设置为默认值,即重新设置为默认值,即复位复位 。RCC system reset*/RCC_DeInit();/*打开打开外部高速时钟晶振外部高速时钟晶振HSE ,Enable HSE*/RCC_HSEConfig(RCC_HSE_ON);/*等待等待HSE外部高速时钟晶振外部高速时钟晶振稳定稳定,或者在超时的情况下退出,或者在超时的情况下退出,Wait till HSE is ready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus=SUCCESS)/SUCCESS:HSE晶振晶
15、振稳定就绪稳定就绪 /*设置设置AHB时钟时钟=SYSCLK=48 MHz,HCLK(即(即 AHB时钟)时钟)=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置高速设置高速PCLK2时钟时钟(即即APB2 clock)=AHB时钟时钟/2=24 MHz,PCLK2=HCLK/2*/RCC_PCLK2Config(RCC_HCLK_Div2);/*设置低速设置低速PCLK1时钟时钟(即即APB1 clock)=AHB时钟时钟/4=12 MHz,PCLK1=HCLK/4*/RCC_PCLK1Config(RCC_HCLK_Div4);/RCC_HCLK_D
16、iv4:APB1 clock=HCLK/4=12MHz,此处不同于鸥鹏公司的程序(此处不同于鸥鹏公司的程序(=36MHz)/*设置设置Flash 延时时钟周期数:为延时时钟周期数:为2*/FLASH_SetLatency(FLASH_Latency_2);/*Enable Flash Prefetch Buffer预取指令指令缓冲区,这预取指令指令缓冲区,这2句与句与RCC没有关系没有关系*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*利用锁相环将利用锁相环将HSE外部外部8MHz晶振晶振6倍频到倍频到48 MHz。PLLCLK
17、=8MHz*6=48 MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);/此处不同于鸥鹏此处不同于鸥鹏公司的程序公司的程序:PLLCLK=8MHz*6=48 MHz /*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready,等待,等待 锁相环锁相环 输出输出稳定稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/*Select PLL as system clock source*/RCC_SYSCLKConfig(RCC_
18、SYSCLKSource_PLLCLK);/选择选择PLLCLK作为作为SYSCLK,所以所以SYSCLK为为48 MHz /*Wait till PLL is used as system clock source*/while(RCC_GetSYSCLKSource()!=0 x08)/*Enable peripheral clocks-*/*GPIOA,GPIOB and SPI1 clock enable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1,ENABL
19、E);/*Enable GPIOC,GPIOD clock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);枚举类型变量/*设置低速设置低速PCLK1时钟时钟(即即APB1 clock)=AHB时钟时钟/4=12 MHz,PCLK1=HCLK/4*/RCC_PCLK1Config(RCC_HCLK_Div4);/RCC_HCLK_Div4:APB1 clock=HCLK/4=12MHz,此处不同于鸥鹏公司的程序此处不同于鸥鹏公司的程序(=36MHz)/*设置设置Flash 延时时钟周期数:为延时
20、时钟周期数:为2*/FLASH_SetLatency(FLASH_Latency_2);/*Enable Flash Prefetch Buffer预取指令指令缓冲区,预取指令指令缓冲区,这这2句与句与RCC没有关系没有关系*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*利用锁相环将利用锁相环将HSE外部外部8MHz晶振晶振6倍频到倍频到48 MHz,作为,作为PLLCLK。PLLCLK=8MHz*6=48 MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_6);/此处不同
21、于鸥鹏公司的程序此处不同于鸥鹏公司的程序:PLLCLK=8MHz*6=48 MHz /*Enable PLL*/RCC_PLLCmd(ENABLE);/*Wait till PLL is ready,等待,等待 锁相环锁相环 输出输出稳定稳定*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)=RESET)/*Select PLL as system clock source*/选择选择PLLCLK作为作为SYSCLK,所以所以SYSCLK为为48 MHz RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*Wait till
22、 PLL is used as system clock source*/while(RCC_GetSYSCLKSource()!=0 x08)/*Enable peripheral clocks-*/*GPIOA,GPIOB and SPI1 clock enable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_SPI1,ENABLE);/*Enable GPIOC,GPIOD clock*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO
23、C|RCC_APB2Periph_GPIOD,ENABLE);以上所见的固件库函数:以上所见的固件库函数:详见详见“中文版:中文版:STM32F10 xxx_固件库函数固件库函数 V2.pdf P193”固件库函数的具体实现:见文件固件库函数的具体实现:见文件“stm32f10 x_rcc.h”其中RCC_DeInit();/*Function Name :RCC_DeInit*Description :Resets the RCC clock configuration to the default reset state.*Input :None*Output :None*Return :
24、None*/void RCC_DeInit(void)/*Set HSION bit*/RCC-CR|=(u32)0 x00000001;/*Reset SW1:0,HPRE3:0,PPRE12:0,PPRE22:0,ADCPRE1:0 and MCO2:0 bits*/RCC-CFGR&=(u32)0 xF8FF0000;/*Reset HSEON,CSSON and PLLON bits*/RCC-CR&=(u32)0 xFEF6FFFF;/*Reset HSEBYP bit*/RCC-CR&=(u32)0 xFFFBFFFF;/*Reset PLLSRC,PLLXTPRE,PLLMUL3
25、:0 and USBPRE bits*/RCC-CFGR&=(u32)0 xFF80FFFF;/*Disable all interrupts*/RCC-CIR=0 x00000000;2.3 STM322.3 STM32单片机单片机I/OI/O端口配置端口配置 2.32.3.1.1 STM32单片机的单片机的 I/OI/O端口端口和管脚和管脚 2.32.3.2.2 STM32单片机的单片机的 I/OI/O端口配置端口配置 2.32.3.1.1 STM32单片机的单片机的 I/OI/O端口端口和管脚和管脚 STM32单片机单片机 最多有最多有7个个16位位的并行的并行 I/OI/O端口端口:P
26、A、PB、PC、PD、PE、PF、PG。STM32F103Cx单片机单片机 只有只有4个个16位位的并行的并行 I/OI/O端口端口:PA、PB、PC、PD。PA口 16脚PB口16脚PC口3脚PD口2脚STM32F103CBT6 包含包含4个端口:PA口、PB口、PC口、PD口,共共有有37个个I/O管脚管脚:PA口 16脚+PB口16脚+PC口3脚+PD口2脚。STM32单片机的单片机的I/OI/O端口端口和管脚:和管脚:以以STM32F103Cx为例为例每个每个GPIOx端口端口:共有共有7 7个设置寄存器个设置寄存器两个两个32位的配置寄存器位的配置寄存器(GPIOx_CRL,GPIO
27、x_CRH)(GPIOx_CRL)(x=A.G):GPIOx configuration register low,GPIOx端口低配置寄存器,用于配置端口低配置寄存器,用于配置GPIOx端口的第端口的第0位位第第7位。位。两个两个32位的数据寄存器(位的数据寄存器(GPIOx_IDR,GPIOx_ODR)(GPIOx_IDR)(x=A.G):GPIOx input data register 一个一个32位的置位位的置位/复位寄存器复位寄存器(GPIOx_BSRR)(GPIOx_BSRR)(x=A.G):GPIOx bit set/reset register一个一个16位的复位寄存器位的复
28、位寄存器(GPIOx_BRR)一个一个32位的锁定寄存器位的锁定寄存器(GPIOx_LCKR)(GPIOx_LCKR)(x=A.G):GPIOx configuration lock register 在在MCS-51MCS-51单片机中,每个单片机中,每个IO端口端口:只有只有1 1个设置寄存器个设置寄存器P0P0端口:端口:P0P0端口寄存器端口寄存器-P0,-P0,P1P1端口:端口:P1P1端口寄存器端口寄存器-P1,-P1,P2P2端口:端口:P2P2端口寄存器端口寄存器-P2,-P2,P3P3端口:端口:P3P3端口寄存器端口寄存器-P3-P3。对应对应STM32STM32单片机的
29、单片机的数据寄存器数据寄存器两个两个32位的数据寄存器(位的数据寄存器(GPIOx_IDR,GPIOx_ODR)(GPIOx_IDR)(x=A.G):GPIOx input data register MCS-51MCS-51单片机单片机I0I0端口的输入、输出数据寄存器端口的输入、输出数据寄存器共用共用1 1个寄个寄存器存器PxPx,而,而STM32STM32单片机的输入、输出数据单片机的输入、输出数据寄存器是寄存器是分开分开的。的。MCS-51单片机的特殊功能寄存器单片机的特殊功能寄存器在在固件函数库固件函数库的的“stm32f10 x_map.h”文件中,文件中,对应的定义对应的定义:/
30、*-General Purpose IO-*/typedef struct vu32 CRL;/configuration register low(GPIOx_CRL)(x=AE)vu32 CRH;vu32 IDR;vu32 ODR;vu32 BSRR;vu32 BRR;vu32 LCKR;GPIO_TypeDef;/用结构体GPIO_TypeDef定义GPIOx端口,(即定义 GPIOx端口的7个设置寄存器)2.32.3.2.2 STM32单片机的单片机的 I/OI/O端口配置端口配置5、在使用、在使用GPIOGPIO端口时,端口时,首先要使能该外设对应的时钟首先要使能该外设对应的时钟1、
31、GPIOx 端口端口 定义定义 2、GPIO_Pin_x 管脚管脚 定义定义 3、GPIO_InitTypeDef 初始化端口参数初始化端口参数 定义定义4、GPIO_Init 初始化端口初始化端口 定义定义6、GPIO编程编程 步骤步骤1、编程时,GPIOx端口的具体配置是从GPIOA、GPIOB、GPIOC、GPIOD、或或 GPIOE寄存器组开始。首先,在固件库中,用结构体GPIO_TypeDef定义GPIOx端口,(即定义 GPIOx端口的7个设置寄存器):在文件“stm32f10 x_map.h”中,定义如下:/*-General Purpose IO-*/typedef struc
32、t vu32 CRL;/configuration register low32(GPIOx_CRL)(x=AE)vu32 CRH;vu32 IDR;vu32 ODR;vu32 BSRR;vu32 BRR;vu32 LCKR;GPIO_TypeDef;/用结构体GPIO_TypeDef定义 GPIOx端口 /或称或称用结构体GPIO_TypeDef定义 GPIOx寄存器组GPIOx端口的7个设置寄存器端口配置低寄存器(GPIOx_CRL)(x=A.E):表表3.11:端口位配置表:端口位配置表配置模式配置模式CNF1CNF0MODE1:0PxODR寄存寄存器器通用输出通用输出推挽推挽00011
33、011参照参照表表3.120或或1开漏开漏10或或1复用功能复用功能输出输出推挽推挽10任意任意开漏开漏1任意任意输入输入模拟输入模拟输入0000任意任意输入浮空输入浮空1任意任意输入下拉输入下拉100输入上拉输入上拉1表表3.12:输出模式位:输出模式位MODE1:0含义含义00保留保留01最大输出速率最大输出速率10MHz10最大输出速率最大输出速率2MHz11最大输出速率最大输出速率50MHz#define GPIOA_BASE (APB2PERIPH_BASE+0 x0800)#define GPIOB_BASE (APB2PERIPH_BASE+0 x0C00)#define GPI
34、OC_BASE (APB2PERIPH_BASE+0 x1000)#define GPIOD_BASE (APB2PERIPH_BASE+0 x1400)#define GPIOE_BASE (APB2PERIPH_BASE+0 x1800)#define GPIOF_BASE (APB2PERIPH_BASE+0 x1C00)#define GPIOG_BASE (APB2PERIPH_BASE+0 x2000)GPIOA、GPIOB、GPIOC、GPIOD、或或 GPIOE寄存器组 的首地址:/*Peripheral base address in the bit-band region*
35、/#define PERIPH_BASE (u32)0 x40000000)/*Peripheral memory map*/#define APB1PERIPH_BASE PERIPH_BASE#define APB2PERIPH_BASE (PERIPH_BASE+0 x10000)#define AHBPERIPH_BASE (PERIPH_BASE+0 x20000)0 x400110000 x400108000 x40010C000 x400114000 x400118000 x40011C000 x40012000#ifdef _GPIOA#define GPIOA (GPIO_T
36、ypeDef*)GPIOA_BASE)#endif/*_GPIOA*/#ifdef _GPIOB#define GPIOB (GPIO_TypeDef*)GPIOB_BASE)#endif/*_GPIOB*/#ifdef _GPIOC#define GPIOC (GPIO_TypeDef*)GPIOC_BASE)#endif/*_GPIOC*/#ifdef _GPIOD#define GPIOD (GPIO_TypeDef*)GPIOD_BASE)#endif/*_GPIOD*/#ifdef _GPIOE#define GPIOE (GPIO_TypeDef*)GPIOE_BASE)#endi
37、f/*_GPIOE*/#ifdef _GPIOF#define GPIOF (GPIO_TypeDef*)GPIOF_BASE)#endif/*_GPIOF*/#ifdef _GPIOG#define GPIOG (GPIO_TypeDef*)GPIOG_BASE)#endif/*_GPIOG*/在文件在文件“stm32f10 x_gpio.h”中,定义中,定义2、GPIO_Pin_x 管脚管脚 定义:定义:/*Exported constants-*/*GPIO pins define-*/#define GPIO_Pin_0 (u16)0 x0001)/*Pin 0 selected*/#
38、define GPIO_Pin_1 (u16)0 x0002)/*Pin 1 selected*/#define GPIO_Pin_2 (u16)0 x0004)/*Pin 2 selected*/#define GPIO_Pin_3 (u16)0 x0008)/*Pin 3 selected*/#define GPIO_Pin_4 (u16)0 x0010)/*Pin 4 selected*/#define GPIO_Pin_5 (u16)0 x0020)/*Pin 5 selected*/#define GPIO_Pin_6 (u16)0 x0040)/*Pin 6 selected*/#
39、define GPIO_Pin_7 (u16)0 x0080)/*Pin 7 selected*/#define GPIO_Pin_8 (u16)0 x0100)/*Pin 8 selected*/#define GPIO_Pin_9 (u16)0 x0200)/*Pin 9 selected*/#define GPIO_Pin_10 (u16)0 x0400)/*Pin 10 selected*/#define GPIO_Pin_11 (u16)0 x0800)/*Pin 11 selected*/#define GPIO_Pin_12 (u16)0 x1000)/*Pin 12 selec
40、ted*/#define GPIO_Pin_13 (u16)0 x2000)/*Pin 13 selected*/#define GPIO_Pin_14 (u16)0 x4000)/*Pin 14 selected*/#define GPIO_Pin_15 (u16)0 x8000)/*Pin 15 selected*/#define GPIO_Pin_All (u16)0 xFFFF)/*All pins selected*/使用使用按位或按位或运算符运算符“|”可以一次选中多个管脚。可以一次选中多个管脚。可以使用上表中的任意可以使用上表中的任意组合。组合。3、GPIO_InitTypeDe
41、f 初始化端口参数初始化端口参数 定义定义(1)枚举类型枚举类型GPIOSpeed_TypeDef:用于定义用于定义GPIO管脚管脚 的的 响应速度响应速度(2)枚举类型枚举类型GPIOMode_TypeDef:用于定义用于定义GPIO管脚管脚 的的 工作模式工作模式(3)结构体结构体GPIO_InitTypeDef:用于用于初始化端口参数初始化端口参数 难点难点在文件“stm32f10 x_gpio.h”中,定义:typedef enum GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHzGPIOSpeed_TypeDef;/定义定义GPI
42、O管脚管脚 的的 响应速度响应速度(1)枚举类型枚举类型GPIOSpeed_TypeDef:用于定义用于定义GPIO管脚管脚 的的 响应速度响应速度 typedef enum GPIO_Mode_AIN=0 x0,GPIO_Mode_IN_FLOATING=0 x04,GPIO_Mode_IPD=0 x28,GPIO_Mode_IPU=0 x48,GPIO_Mode_Out_OD=0 x14,GPIO_Mode_Out_PP=0 x10,GPIO_Mode_AF_OD=0 x1C,GPIO_Mode_AF_PP=0 x18GPIOMode_TypeDef;/定义定义GPIO管脚管脚 的的 工作
43、模式工作模式(2)枚举类型枚举类型GPIOMode_TypeDef:用于定义用于定义GPIO管脚管脚 的的 工作模式工作模式STM32单片机的每一个输入/输出引脚(即GPIO端口的每一位)可以配置成以下8种模式(4输入+2输出+2复用输出):STM32单片机的单片机的GPIO端口模式:端口模式:p输入浮空:输入浮空:IN_FLOATINGp输入上拉:输入上拉:IPU(In Push-Up)p输入下拉输入下拉:IPD(In Push-Down)p模拟输入模拟输入:AIN (Analog In)p开漏输出:开漏输出:Out_OD (Open Drain Output)p推挽式输出推挽式输出:Out
44、_PP (Push-Pull Output)p推挽式复用功能推挽式复用功能:AF_PP (Push-Pull Output Alternate-Function)p开漏复用功能开漏复用功能:AF_OD (Open Drain Output Alternate-Function)输输 入入输输 出出复用输复用输 出出/*Configuration Mode enumeration-*/typedef enum GPIO_Mode_AIN =0 x0,GPIO_Mode_IN_FLOATING=0 x04,GPIO_Mode_IPD =0 x28,GPIO_Mode_IPU =0 x48,GPIO
45、_Mode_Out_OD =0 x14,GPIO_Mode_Out_PP =0 x10,GPIO_Mode_AF_OD =0 x1C,GPIO_Mode_AF_PP =0 x18GPIOMode_TypeDef;/定义定义GPIO管脚管脚 的的 工作模式工作模式工作模式:用低工作模式:用低4位位 区分。区分。输输 入入输输 出出输入、输出:输入、输出:高高4位为位为1-输出,否则为输入。输出,否则为输入。I/OI/O端口端口位位的基本结构的基本结构 输入数据寄存器输入数据寄存器输出数据寄存器输出数据寄存器位置位位置位/复位寄存器复位寄存器I/O端口位位的输入输入电路电路I/O端口位位的输出输出
46、电路电路I/O端口位位的输入输入电路电路 I/O端口位位的浮空浮空/上拉上拉/下拉下拉输入输入电路电路 I/O端口位位的高阻抗高阻抗模拟模拟 输入输入电路电路图图3.11:I/O端口位位的输入输入浮空浮空/上拉上拉/下拉配置下拉配置激活激活施密特触发输入施密特触发输入输出缓冲器被输出缓冲器被禁止禁止根据输入配置根据输入配置(上拉,下拉或浮空上拉,下拉或浮空)的不同,弱上拉和下拉电阻的不同,弱上拉和下拉电阻被连接被连接在每个在每个APB2时钟周期,出时钟周期,出现在现在I/O脚上的数据被采样脚上的数据被采样到到输入数据寄存器输入数据寄存器-参见“!STM32F10 x_中文版_参考手册 V10_
47、1(2010年1月10日).pdf”P108图图3.14:I/O端口位位的高阻抗模拟高阻抗模拟输入输入配置配置输出缓冲器被输出缓冲器被禁止禁止禁止禁止施密特触发输入。施密特触发输入。施密特触发输出值被强置为施密特触发输出值被强置为0弱上拉和下拉电阻被弱上拉和下拉电阻被禁止禁止读取输入数据寄存器时数读取输入数据寄存器时数值为值为0I/O端口位位的输出输出电路电路 I/O端口位位的开漏开漏输出电路输出电路 I/O端口位位的推挽推挽输出电路输出电路 I/O端口位位的复用功能复用功能的的推挽推挽输出电路和输出电路和开漏开漏输出电路输出电路图图3.12 I/O端口位位的开漏开漏输出输出配置配置开漏模式:
48、开漏模式:P-MOS从不被从不被激活激活,仅,仅N-MOS工作。工作。开漏模式:输出寄存器上的开漏模式:输出寄存器上的0激活激活N-MOS,输出低电平;而,输出低电平;而输出寄存器上的输出寄存器上的1将端口置于高阻状态将端口置于高阻状态(P-MOS从不被激活从不被激活)。激活激活施密特触发输入施密特触发输入在每个在每个APB2时钟周期,出时钟周期,出现在现在I/O脚上的数据被采样脚上的数据被采样到到输入数据寄存器输入数据寄存器图图3.12 I/O端口位位的推挽推挽输出输出配置配置推挽模式:输出寄存器上的推挽模式:输出寄存器上的0激活激活N-MOS,而输出寄存器上,而输出寄存器上的的1将激活将激
49、活P-MOS。激活激活施密特触发输入施密特触发输入弱上拉和下拉电阻被弱上拉和下拉电阻被禁止禁止在每个在每个APB2时钟周期,出时钟周期,出现在现在I/O脚上的数据被采样脚上的数据被采样到到输入数据寄存器输入数据寄存器图图3.13:I/O端口位位的复用功能配置复用功能配置激活激活施密特触发输入施密特触发输入弱上拉和下拉电阻被弱上拉和下拉电阻被禁止禁止在每个在每个APB2时钟周期,出现在时钟周期,出现在I/O脚脚上的数据被采样到上的数据被采样到输入数据寄存器输入数据寄存器复用功能复用功能Input到片上外设到片上外设自片上外设自片上外设l 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,如果
50、把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。并和片上外设的输出信号连接。图图3.13:I/O端口位位的复用功能配置复用功能配置l 仅有输出,才有复用功能。仅有输出,才有复用功能。复用功能复用功能Input到片上外设到片上外设自片上外设自片上外设l开漏输出、推挽输出开漏输出、推挽输出 和和 复用功能复用功能的的开漏开漏输出、输出、推挽推挽输出输出 不同之处不同之处:引脚和输出寄存器断开,并和片上外设的输出信号连接。引脚和输出寄存器断开,并和片上外设的输出信号连接。增加了增加了复用功能复用功能Input/*GPIO Init structure definitio