第4章LED灯控制与KeilMDK工程框架1STM32F103通用目的输入输出口2STM32F103库函数用法3KeilMDK工程框架4LED灯闪烁实例目录4.1STM32F103通用目的输入输出口STM32F103ZET6微控制器具有7个16位的GPIO口,记为GPIOx(x=A,B,...,G),共占用了112个管脚图4-1GPIO端口结构4.1.1GPIO寄存器这里的x=A,B,...,G,各个GPIO端口寄存器的基地址可查图2-4,每个寄存器的读写操作必须按整个字(32位)进行每个GPIO口具有7个寄存器2个32位的配置寄存器(GPIOx_CRL和GPIOx_CRH)2个32位的数据寄存器(GPIOx_IDR和GPIOx_ODR)1个32位的置位/清零寄存器(GPIOx_BSRR)1个16位的清零寄存器(GPIOx_BRR)1个32位的配置锁定寄存器(GPIOx_LCKR)偏移地址名称类型复位值说明0x00CRL读/写0x44444444配置寄存器低位(每个端口4位)0x04CRH读/写0x44444444配置寄存器高位(每个端口4位)0x08IDR读0x000016位输入数据寄存器0x0CODR读/写0x000016位输出数据寄存器0x10BSRR写0x00000000位置位/复位寄存器0x14BRR写0x0000位复位(清零)寄存器0x18LCKR读/写0x00000配置锁定寄存器4.1.1GPIO寄存器注:(1)ODR=1:上拉,ODR=0:下拉(2)01/10/11依次对应最大输出频率为10MHz/2MHz/50MHzCNF[1:0]MODE[1:0]输入配置CNF[1:0]MODE[1:0](2)输出配置0000模拟输入0001/10/11通用推挽输出0100浮空输入(复位状态)0101/10/11通用开漏输出1000上拉/下拉输入(1)1001/10/11复用推挽输出1100保留1101/10/11复用开漏输出每个端口的4个配置位是CNF[1:0]和MODE[1:0]图4-4端口置位/清零寄存器GPIOx_RSRR图中的BRy和BSz写入0无效;BRy写入1,则清零相应的端口管脚;BSz写入1,则置位相应的端口管脚。例如,使GPIOE的第5管脚输出高电平,则使用语句“GPIOE_RSRR=(1uL5);”;使GPIOE端口的第11管脚输出低电平,则使用语句“GPIOE_RSRR=(1uL11)16;”。如果使用端口输出数据寄存器GPIOE_ODR,则上述两个操作为“读出—修改—写回”处理,其语句为“GPIOE_ODR&=~(1uL5);”和“GPIOE_ODR|=(1uL11)”,显然,直接写寄存器GPIOE_RSRR速度更快。上述使用GPIOx_RSRR清零某个GPIO端口的特定管脚时,有一个左移16位(“16”)的操作,因为清零寄存器位于GPIOx_RSRR的高16位,为了省掉这个操作,GPIO模块还具有一个16位的端口清零寄存器GPIOx_BRR(偏移地址:0x14,复位值为0x0),每位记为BRy(y=0,1,...,15),各位写入0无效,写入1清零相应的端口管脚。例如,使GPIOE端口的第11管脚输出低电平,则可使用语句“GPIOE_BRR=(1uL11);”。配置锁定寄存器GPIOx_LCKR(偏移地址:0x18,复位值为0x0),用于锁定配置寄存器GPIOx_CRL和GPIOx_CRH的值,如图4-5所示。图4-5配置锁定寄存器GPIOx_LCKR在图4-5中,LCK[15:0]对应着GPIO端口的16个管脚,例如,LCKy=1,则GPIO端口的第y脚的配置被锁定,如果LCKy=0,则其配置是可以更新的。一旦某个GPIO管脚的配置被锁定,只有再次“复位GPIO口”,才能解锁。锁定某个管脚的配置的方法为,使该管脚对应的LCKy为1,然后,向LCKK顺序执行:写入1、写入0、写入1、读出0、读出1(其间LCK[15:0]的值不能改变)。例如,要锁定GPIOE端口的第5脚和第11脚的配置,则使用以下语句:GPIOE_LCKR=(1uL11)|(1uL5);GPIOE_LCKR=(1uL16)|(1uL11)|(1uL5);GPIOE_LCKR=(1uL11)|(1uL5);GPIOE_LCKR=(1uL16)|(1uL11)|(1uL5);v1=GPIOE_LCKR;v2=GPIOE_LCKR;//(这里v1和v2为无符号32位整型)。上面提到的“复位GPIO口”是由复位与时钟控制模块(RCC)管理的,此外,GPIO模块(或其他外设模块)在使用前,必须通过RCC给相应的模块提供时钟源,相关的寄存器有APB2外设复位寄存器(RCC_APB2RSTR,偏移地址:0x0C)和APB2外设时钟有效寄存器(RCC_APB2ENR,偏移地址:0x18),由图2-4可知,RCC模块的基地址为0x40021000。图4-6APB2外设复位寄存器RCC_APB2RSTR图4-7APB2外设时钟有效寄存器RCC_APB2ENRAPB2外设复位寄存器RCC_APB2RSTR(复位值为0x0)和APB2外设时钟有效寄存器RCC_APB2ENR(复位值为0x0)如图4-6和图4-7所示。对于图4-6中的RCC_APB2RSTR寄存器,各位写入0无效,写入1则复位相应的片上外设;对于图4-7的RCC_APB2ENR寄存器,各位写入0关闭相应外设的时钟,写入1开放相应外设的时钟。例如,要使用GPIOE口,则需要执行语句:RCC_APB2ENR|=RCC_APB2ENR|(1uL6);启动GPIOE口的时钟源。4.1.2AFIO寄存器(AlternateFunction)AFIO寄存器的基地址为0x40010000,STM32F103ZET6共包括7个AFIO寄存器(复位值均为0x0):事件控制寄存器AFIO_EVCR(偏移地址:0x0)替换功能重映射寄存器AFIO_MAPR(偏移地址:0x04)外部中断配置寄存器AFIO_EXTICR1(偏移地址:0x08)外部中断配置寄存器AFIO_EXTICR2(偏移地址:0x0C)外部中断配置寄存器AFIO_EXTICR3(偏移地址:0x10)外部中断配置寄存器AFIO_EXTICR4(偏移地址:0x14)替换功能重映射寄存器AFIO_MAPR2(偏移地址:0x1C)位号名称属性含义31:8保留7EVOE可读可写设为1,Cortex内核的EVENTOUT事件输出端配置到PORT[2:0]和PIN[3:0]指定的管脚6:4PORT[2:0]可读可写可设为000b、001b、…、100b依次对应PA、PB、…、PE口3:0PIN[3:0]可读可写可设为0000b、0001b、…、1111b依次对应选定GPIO口的第0位、第1位、…、第15位对应的管脚表4-1事件控制寄存器AFIO_EVCR事件控制寄存器AFIO_EVCR如表4-1所示。表4-2替换功能重映射寄存器AFIO_MAPR位号名称属性含义31:27保留26:24SWJ_CFG[2:0]只写可设为000b~100b,依次表示JTAG和SW功能可用、JTAG和SW功能可用(无NJTRST)、只有SW可用、JTAG和SW不可用23:21保留20ADC2_ETRG_REMAP可读可写清0表示ADC2外部常规触发端为EXTI11,置1表示ADC2外部常规触发端为TIM8_TRGO19ADC2_ETRGINJ_REMAP可读可写清0表示ADC2外部注入触发端为EXTI15,置1表示ADC2外部注入触发端为TIM8_Channel418ADC1_ETRG_REMAP可读可写清0表示ADC1外部常规触发端为EXTI11,置1表示ADC1外部常规触发端为TIM8_TRGO17ADC1_ETRGINJ_REMAP可读可写清0表示ADC1外部注入触发端为EXTI15,置1表示ADC1外部注入触发端为TIM8_Channel416TIM5CH4_IREMAP可读可写清0表示定时器5通道4与PA3连接,置1表示定时器5通道4与LSI时钟连接15保留14:13CAN_REMAP[1:0]可读可写为00b,关闭CAN通道;为01b表示CAN_RX与PB8连接、CAN_TX与PB9连接;为10b表示CAN_RX与PD0连接、CAN_TX与PD1连接12TIM4_REMAP可读可写清0表示TIM4无重映射;置1表示TIM4_CH1、TIM4_CH2、TIM4_CH3和TIM4_CH4依次映射到PD12~PD1511:10TIM3_REMAP[1:0]可读可写为00b表示TIM3无重映射;为01b保留;为10b表示部分映射(CH1/PB4、CH2/PB5);为11b表示全映射(CH1/PC6、CH4/PC7、CH3/PC8、CH4/PC9)9:8TIM2_REMAP[1:0]可读可写为00b表示TIM2无重映射;为01b表示部分映射(CH1/ETR/PA15、CH2/PB3);为10b表示部分映射(CH3/PB10、CH4/PB11);为11b表示全映射(CH1/ETR/PA15、CH2/PB3、CH3/PB10、CH4/PB11)9:8TIM2_REMAP[1:0]可读可写为00b表示TIM2无重映射;为01b表示部分映射(CH1/ETR/PA15、CH2/PB3);为10b表示部分映射(CH3/PB10、CH4/PB11);为11b表示全映射(CH1/ETR/PA15、CH2/PB3、CH3/PB10、CH4/PB11)7:6TIM1_REMAP[1:0]可读可写为00b表示TIM1无重映射;为01b表示部分映射(BKIN/PA6、CH1N/PA7、CH2N/PB0、CH3N/PB1);为10b保留;为11b表示全映射(ETR/PE7、CH1/PE9、CH2/PE11、CH3/PE13、CH4/PE14、BKIN/PE15、CH1N/PE8、CH2N/PE10、CH3N/PE12)5:4USART3_REMAP[1:0]可读可写为00b表示USART3无重映射;为01b表示部分映射(TX/PC10、RX/PC11、CK/PC12);为10b保留;为11b表示全映射(TX/PD8、RX/PD9、CK/PD10、CTS/PD11、RTS/PD12)3USART2_REMAP可读可写清0表示USART2无重映射;置1表示映射关系(CTS/PD3、RTS/PD4、TX/PD5、RX/PD6、CK/PD7)2USART1_REMAP可读可写清0表示USART1无重映射;置1表示映射关系(TX/PB6、RX/PB7)1I2C1_REMAP可读可写清0表示I2C1无重映射;置1表示映射关系(SCL/PB8、SDA/PB9)0SP11_REMAP可读可写清0表示SPI无重映射;置1表示映射关系(NSS/PA15、SCK/PB3、MISO/PB4、MOSI/PB5)外部中断配置寄存器AFIO_EXTICR1、AFIO_EXTICR2、AFIO_EXTICR3和AFIO_EXTICR4的含义如表4-3所示。寄存器位号名称含义AFIO_EXTICR431:16保留EXTIm[3:0],m=0,1,...,15表示外部中断m,可取值为000b、001b、…、0110b,依次表示PA口、PB口、…、PG口。例如,设置PE口的第3管脚为外部中断3的输入端,则配置EXTI3[3:0]为4(即0100b)。15:12EXTI15[3:0]11:8EXTI14[3:0]7:4EXTI13[3:0]3:0EXTI12[3:0]AFIO_EXTICR331:16保留表4-3外部中断配置寄存器AFIO_EXTICR1~4AFIO_EXTICR231:16保留15:12EXTI7[3:0]11:8EXTI6[3:0]7:4EXTI5[3:0]3:0EXTI4[3:0]AFIO