1、第五章第五章 GPIO及外部中断的使用及外部中断的使用5.1 综述综述通用通用IO复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式(CNFx1:0=01b,MODEx1:0=00b)。复位后,JTAG引脚被置于输入上拉或下拉模式:PA15:JTDI置于上拉模式PA14:JTCK置于下拉模式PA13:JTMS置于上拉模式PB4: JNTRST置于上拉模式单独的位设置或位清除单独的位设置或位清除当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作里,可以只更改一个或多个位。这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是 GPIOx_BRR)
2、中想要更改的位写1来实现的。没被选择的位将不被更改。5.1 综述综述外部中断外部中断/唤醒线唤醒线所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。5.1 综述综述软件重新映射软件重新映射I/O复用功能复用功能为了使不同器件封装的外设I/O功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成(参考AFIO寄存器描述)。这时,复用功能就不再映射到它们的原始引脚上了。GPIO锁定机制锁定机制锁定机制允许冻结IO配置。当在一个端口位上执行了所定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。5.1 综述综述复用功能复用功
3、能(AF)使用默认复用功能前必须对端口位配置寄存器编程。对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入管脚必须由外部驱动对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。5.1 综述综述输入配置当I/O端口配置为输入时:输出缓冲器被禁止施密特触发输入被激活根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器对输入数据寄存器的读访问可得到I/O状态输出配置输出配置当I/O端口被配置为输出时
4、:输出缓冲器被激活施密特触发输入被激活弱上拉和下拉电阻被禁止出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器在开漏模式时,对输入数据寄存器的读访问可得到I/O状态在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。5.1 综述综述复用功能配置复用功能配置5.1 综述当I/O端口被配置为复用功能时:在开漏或推挽式配置中,输出缓冲器被打开内置外设的信号驱动输出缓冲器(复用功能输出)密特触发输入被激活弱上拉和下拉电阻被禁止在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器开漏模式时,读输入数据寄存器时可得到I/O口状态在推挽模式时,读输出数据寄存器时可得到最后
5、一次写的值模拟输入配置当I/O端口被配置为模拟输入配置时:输出缓冲器被禁止;禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为0;弱上拉和下拉电阻被禁止;读取输入数据寄存器时数值为0。5.1 综述5.2 库函数库函数具体函数用法详情见STM32固件库使用手册5.3 IO端口的外设端口的外设把把OSC32_IN/OSC32_OUT作为作为GPIO 端口端口PC14/PC15当LSE振荡器关闭时,LSE振荡器引脚OSC32_IN/OSC32_OUT可以分别用做GPIO的PC14/PC15,LSE功能始终优先于通用I/O口的功能。把把OSC32_IN/OSC32_OUT
6、作为作为GPIO 端口端口PC14/PC15外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现。这个重映射只适用于36、48和64脚的封装(100脚和144脚的封装上有单独的PD0和PD1的引脚,不必重映射)。5.3 IO端口的外设端口的外设5.3 IO端口的外设端口的外设CAN复用功能重映射复用功能重映射CAN信号可以被映射到端口A、端口B或端口D上,如下表所示。对于端口D,在36、48和64脚的封装上没有重映射功能。5.3 IO端口的外设端口的外设JTAG/SWD复用功能重映射复用功能重映射调试接口
7、信号被映射到GPIO端口上,如下表所示。表 调试接口信号5.3 IO端口的外设端口的外设表 调试端口映像5.3 IO端口的外设端口的外设ADC复用功能重映射复用功能重映射ADC1外部触发注入转换复用功能重映射(1)ADC1外部触发规则转换复用功能重映射(1)ADC2外部触发注入转换复用功能重映射(1)5.3 IO端口的外设端口的外设ADC2外部触发规则转换复用功能重映射(1)定时器复用功能重映射定时器复用功能重映射5.3 IO端口的外设端口的外设定时器4的通道1到通道4可以从端口B重映射到端口D。其他定时器的重映射列在下表。参见复用重映射和调试I/O配置寄存器(AFIO_MAPR)定时器5复用
8、功能重映像(1)定时器4复用功能重映像5.3 IO端口的外设端口的外设定时器3复用功能重映像定时器2复用功能重映像定时器1复用功能重映像5.3 IO端口的外设端口的外设5.3 IO端口的外设端口的外设USART复用功能重映射USART3重映像USART2重映像5.3 IO端口的外设端口的外设USART1重映像5.3 IO端口的外设端口的外设I2C 1 复用功能重映射复用功能重映射I2C 1重映像SPI 1复用功能重映射复用功能重映射SPI1重映像5.4 位运算位运算 左移运算符()左移运算符()左移位相当于该数乘以,左移位相当于该数乘以22,152=60,即乘了。但此结论只适用于该数左移时被溢
9、出舍弃的高位中不包含的情况。假设以一个字节(位)存一个整数,若为无符号整型变量,则时,左移一位时溢出的是,而左移位时,溢出的高位中包含。右移运算符右移运算符()右移运算符是a2表示将a的各二进制位右移2位,移到右端的低位被舍弃,对无符号数,高位补0。例如:a=017时:a的值用二进制形式表示为00001111, 舍弃低2位11: a2=00000011右移一位相当于除以2 右移n位相当于除以2n。5.4 位运算位运算5.4 位运算位运算“按位与按位与”运算符()运算符()按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为,则该位的结果值为;否则为。即:,例:并
10、不等于,应该是按位与运算: 00000011(3)& & 00000101(5) 00000001(1) 注意:如果参加如果参加&运算的是负数运算的是负数(如(如-3&-5),则要以补码形式),则要以补码形式表示为二进制数,然后再按位表示为二进制数,然后再按位进行进行“与与”运算。运算。3&5的值得5.4 位运算位运算“按位或按位或”运算符(运算符(|)两个相应的二进制位中只要有一个为,该位的结果值为。即 |,|,|,|例: 060|017,将八进制数60与八进制数17进行按位或运算。 00110000| 00001111 00111111 “取反取反”运算符()运算符() 是一个单目(元)运
11、算符,用来对一个二进制数按位取反,即将变,将变。例如,是对八进制数(即二进制数)按位求反。 0000000000010101() 1111111111101010 (八进制数177752)5.4 位运算位运算“异或异或”运算符(运算符()5.4 位运算位运算异或运算符也称XOR运算符。它的规则是:若参加运算的两个二进制位同号则结果为(假)异号则结果为(真)即:00=0,01=1,10=1, 11=0 00111001 00101010 00010011 即:071052=023 (八进制数)5.5 GPIO控制实例控制实例控制LED闪烁跑马灯按键输入5.6 外部中断和中断控制器外部中断和中断控
12、制器嵌套向量中断控制器嵌套向量中断控制器特性60个可屏蔽中断通道(不包含16个Cortex-M3的中断线);16个可编程的优先等级(使用了4位中断优先级);低延迟的异常和中断处理;电源管理控制;系统控制寄存器的实现;嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理晚到的中断。中断和异常向量5.6 外部中断和中断控制器外部中断和中断控制器STM32F10 xxx产品的向量表5.6 外部中断和中断控制器外部中断和中断控制器5.6 外部中断和中断控制器外部中断和中断控制器5.6 外部中断和中断控制器外部中断和中断控制器5.6 外部中断和中断控制器外部中
13、断和中断控制器外部中断外部中断/事件控制器事件控制器(EXTI)外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独立的屏蔽。挂起寄存器保持着状态线的中断要求。主要特性EXTI控制器的主要特性如下:每个中断/事件都有独立的触发和屏蔽每个中断线都有专用的状态位支持多达19个中断/事件请求检测脉冲宽度低于APB2时种宽度的外部信号。参见数据手册中电气特性部分的相关参数。5.6 外部中断和中断控制器外部中断和中断控制器5.6 外部中断和中断控制器外部中断和中断控制器硬件中
14、断选择硬件中断选择通过下面的过程来配置19个线路做为中断源:配置19个中断线的屏蔽位(EXTI_IMR)配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR);配置那些控制映像到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得19个中断线中的请求可以被正确地响应。硬件事件选择硬件事件选择通过下面的过程,可以配置19个线路为事件源配置19个事件线的屏蔽位(EXTI_EMR)配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR)5.6 外部中断和中断控制器外部中断和中断控制器软件中断软件中断/事件的选择事件的选择19个线路可以被配置成软件中断/事件线。下面是
15、产生软件中断的过程:配置19个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR)设置软件中断寄存器的请求位(EXTI_SWIER)5.6 外部中断和中断控制器外部中断和中断控制器NVIC库函数库函数5.6 外部中断和中断控制器外部中断和中断控制器5.6 外部中断和中断控制器外部中断和中断控制器EXTI库函数库函数5.6 外部中断和中断控制器外部中断和中断控制器外部中断实例外部中断实例按键输入按键输入实验目的 1. 熟练掌握单片机GPIO输入输出的使用。 2.掌握外部中断的编程步骤。 3.使用外部中断完成按键程序的编写。5.6 外部中断和中断控制器外部中断和中断控制器硬件设计硬件设计硬件
16、连接图如下,实验板上stm32f103x处理器GPIOC的GPIO_Pin_2连接KEY,通过配置GPIO实现如下功能:按下按键SW1使LED4熄灭,再次按下时点亮。5.6 外部中断和中断控制器外部中断和中断控制器软件设计软件设计步骤一:添加库函数,以及操作函数。添加库函数有:startup/start_stm32f10 x_hd.c;CMSIS/core_cm3.c;system_stm32f10 x.c;FWlib/stm32f10 x_gpio.c;stm32f10 x_rcc.c;stm32f10 x_exti.cFWlib/misc.c。操作函数有:USER/main.c ;stm3
17、2f10 x_it.c ;led.c ;exti.c;EXTI2_IRQHandler()。步骤二:打开system_stm32f10 x.c文件,配置系统时钟为72MHZ。步骤三:打开打开led.c文件,使用函数为LED_GPIO_Config()配置PA10;该函数的实现步骤如下:5.6 外部中断和中断控制器外部中断和中断控制器void LED_GPIO_Config(void)GPIO_InitTypeDef GPIO_InitStructure;配置PB14RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitS
18、tructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_14); / 关闭LED4,熄灭步骤四:在led.h函数中设置宏定义:#define LED4(a)if (a)GPIO_SetBits(GPIOB,GPIO_Pin_14);灭 else GPIO_R
19、esetBits(GPIOB,GPIO_Pin_14)亮5.6 外部中断和中断控制器外部中断和中断控制器步骤五:配置外部中断,打开exti.c文件,在这里我们重点解释函数EXTI_PE5_Config()的配置步骤。void EXTI_PC0_Config(void)GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AF IO,ENABLE); 使能EXTIC线的时钟和第二功能 AF
20、IO时钟NVIC_Configuration();配置EXTIC线的中断优先级配置EXTI 中断线 I/O GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;使用PC2作为外部中断线 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; /上拉输入 GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO初始化GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2); GPIOC外部中断进行初始化选定要配置为 EXTI的 I/O口线和 I
21、/O口的工作模式 EXTI_InitStructure.EXTI_Line = EXTI_Line2;2号中断线 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; /下降沿中断 EXTI_InitStructure.EXTI_LineCmd = ENABLE;使能中断 EXTI_Init(&EXTI_InitStructure); 初始化5.6 外部中断和中断控制器外部中断和中断控制器步骤六:配置嵌套向量中断控制器 NVI
22、C,在步骤三中已调用了函数NVIC_Configuration();NVIC配置步骤:static void NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure;定义结构体 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;配置PC2为中断源 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruc
23、ture.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);5.6 外部中断和中断控制器外部中断和中断控制器步骤七:实现实验结果,操作EXTI2_IRQHandler()函数实现外部中断控制LED4翻转。void EXTI2_IRQHandler(void)if(EXTI_GetITStatus(EXTI_Line2) != RESET) /确保是否产生了EXTI Line中断GPIO_WriteBit(GPIOB, GPIO_Pin_14, / LED4 取反(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_14);EXTI_ClearITPendingBit(EXTI_Line2); /清除中断标志位 下载程序后LED4状态为点亮,第一次按下按键SW1时LED4熄灭,再次按下时LED4点亮。小结小结本章是学习STM32嵌入式单片机的基础,通过本章的学习初步掌握了通用I/O接口及外部中断的使用。应掌握基本的GPIO及外部中断库函数的使用,并能掌握实例程序程序编制的原则,在实例基础上能够进行基本功能的修改及完善。