版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大家好第五章通用和复用功能I/O5.1GPIO的工作原理
一、引脚介绍
二、STM32GPIO主要功能三、IO口的基本结构5.2
编程举例5.3GPIO复用功能
一、引脚介绍STM32单片机最多有7个16位的并行I/O端口:PA、PB、PC、PD、PE、PF、PG。STM32F103单片机只有5个16位的并行I/O端口:PA、PB、PC、PD、PE。(实验板型号:TM32F103VET6)通用IO口,又称为GPIO(General-PurposeIOports)CPU的一个接口模块,为一些协议比较简单的外部设备/电路提供了一种控制手段。
5.1GPIO的工作原理每个GPIO管脚都可以由软件配置成输出(推拉或开路)、输入(带或不带上拉或下拉)或其它的外设功能口。多数GPIO管脚都与数字或模拟的外设共用。所有的GPIO管脚都有大电流通过能力。在需要的情况下,I/O管脚的外设功能可以通过一个特定的操作锁定,以避免意外的写入I/O寄存器。在APB2上的I/O脚提供高达18MHz的翻转速度。
一、引脚介绍PA口16脚PB口16脚PC口16脚STM32F103包含5个端口:
PA口
、PB口、PC口、
PD口、
PE口。一、引脚介绍:以STM32F103x为例PD口16脚PE口16脚
5.1GPIO的工作原理一、引脚介绍:以STM32F103VET6为例
5.1GPIO的工作原理补充举例说明,分析流水灯例程—了解库开发流程1)选择GPIO端口2)选择GPIO端口功能3)设置GPIO输出高低电平控制LED灯的亮灭举例说明,分析流水灯例程—了解库开发流程要实现功能选定与LED硬件相连的引脚选定GPIO的特定功能控制LED亮灭相应状态PD6\PD3输出功能设置GPIO引脚电平的高低对应的寄存器配置引脚在D上,选择x=d配置寄存器GPIOx-CRL设置数据寄存器寄存器操作intmain(void){ GPIOB->CRL=0x3<<20;//配置PB5为推挽输出,50MHZ while(1) { GPIOB->ODR=0x0; Delay(0xAFFFF); GPIOB->ODR=0x20; Delay(0xAFFFF); }}举例说明,分析流水灯例程—了解库开发流程1地址映射stm32f10x.h#defineGPIOD_BASE(APB2PERIPH_BASE+0x1400)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#definePERIPH_BASE((uint32_t)0x40000000)#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineGPIOB_BASE(APB2PERIPH_BASE+0x0C00)#defineGPIOC_BASE(APB2PERIPH_BASE+0x1000)#defineGPIOD_BASE(APB2PERIPH_BASE+0x1400)#definePERIPH_BASE((uint32_t)0x40000000)举例说明,分析流水灯例程—了解库开发流程1地址映射STM32固件库对寄存器的封装#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)#defineGPIOC((GPIO_TypeDef*)GPIOC_BASE)#defineGPIOD((GPIO_TypeDef*)GPIOD_BASE)#defineGPIOE((GPIO_TypeDef*)GPIOE_BASE)typedefstruct{__IOuint32_tCRL;-----0x00__IOuint32_tCRH;-----0x04__IOuint32_tIDR;------0x08__IOuint32_tODR;__IOuint32_tBSRR;__IOuint32_tBRR;__IOuint32_tLCKR;}GPIO_TypeDef;举例说明,分析流水灯例程—了解库开发流程2、STM32时钟设置在startup_stm32f10x_hd.s中运行systemInit(),这个函数定义在system_stm32f10x.c,他的作用是设置系统时钟,之后调用SetSysClock()设置具体的系统时钟举例说明,分析流水灯例程—了解库开发流程3、编写用户文件配置gpio口的相关操作:初始化结构体库函数GPIO_InitTypeDefGPIO_InitStructure;typedefstruct库文件利用关键字typedef定义的新类型{uint16_tGPIO_Pin;GPIOSpeed_TypeDefGPIO_Speed;GPIOMode_TypeDefGPIO_Mode;}GPIO_InitTypeDef;举例说明,分析流水灯例程—了解库开发流程3、编写用户文件(1)初始化库函数 GPIO_Init在这个函数内部,把输入的这些参数按照一定的规则转化,进而写入寄存器,实现了配置GPIO端口的功能举例说明,分析流水灯例程—了解库开发流程3、编写用户文件(2)控制I/O口高低电平GPIO_SetBits置1,led亮GPIO_ResetBits举例说明,分析流水灯例程—了解库开发流程3、编写用户文件(3)led.h头文件(4)main文件分析举例说明,分析流水灯例程—了解库开发流程4、总结1)为了控制led,要使用GPIO外设2)了解GPIO外设的功能,如何使用3)知道GPIO的地址映射,挂载在APB24)了解ST官方库对寄存器的封装5)了解时钟树,查看GPIOC时钟来源,PCLK26)在stm32f10x_conf.h文件中用到的头文件stm32f10x_gpio.h和stm32f10x_rcc.h7)添加用户文件led.c文件8)编写驱动初始化函数LED_GPIO_Config(void)举例说明,分析流水灯例程—了解库开发流程4、总结9)开外设时钟10)根据要求填写GPIO_InitStructure11)调用初始化函数GPIO_Init12)编写相应的led.h文件13)编写主函数main14)调试
5.1GPIO的工作原理二、IO口的基本结构1、IO口的基本结构图广每个I/O可以自由编程,单I/O口寄存器必须按32位字被访问。STM32的很多I/O口都是5V兼容的,具体哪些I/O口是5V兼容的可以从芯片手册引脚描述章节查到,I/OLevel标FT的就是5V电平兼容的。保护二极管:避免过高或过低的电压从外部进来时对电路内部的损害;钳制I/O的电压在-0.7V~4.0V之间二、IO口的基本结构
5.1GPIO的工作原理-输入浮空
-输入下拉-输入上拉
-模拟输入
-开漏输出
-推挽式输出
-推挽式复用功能
-开漏复用功能
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑴浮空输入
图中施密特触发器是开启的,IO口的状态可以直接送到输入寄存器中,CPU可以直接读取输入寄存器
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑴浮空输入
在上图上,蓝色以外的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。蓝色的高亮部分显示了数据传输通道,外部的电平信号通过左边编号1的I/O端口进入STM32,经过编号2的施密特触发器的整形,送入编号3的“输入数据寄存器”,在“输入数据寄存器”的另一端(编号4),CPU可以随时读出I/O端口的电平状态。
5.1GPIO的工作原理二、IO口的基本结构
2、
GPIO的8种设置模式⑵上拉输入
5.1GPIO的工作原理二、IO口的基本结构
2、
GPIO的8种设置模式⑵上拉输入上图是STM32的GPIO带上拉输入模式的配置。与前面的浮空输入模式相比,仅仅是数据通道上部,接入了一个上拉电阻,根据STM32的数据手册,这个上拉电阻阻值介于30K~50K欧姆。同样,CPU可以随时在“输入数据寄存器”的4端,读出I/O端口的电平状态
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑶下拉输入
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式配置输入模式的总结:(对应课本5.1.7)(1)输出缓冲器被禁止(2)施密特触发输入被激活(3)根据输入配置(上拉、下拉或浮动)的不同,弱上拉和下拉电阻被连接。(4)出现在I/O口上的数据在每个APB2时钟被采样到输入数据寄存器(5)对输入寄存器的读访问可得到I/O状态
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑷模拟输入模式施密特触发器是关闭的,信号直接到ADC输入
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑷模拟输入模式
STM32的模拟输入通道的配置则更加简单,信号从左边编号1的端口进入,从右边编号2的一端直接进入ADC模块。上拉、下拉电阻和施密特触发器,均处于断开状态,因此“输入数据寄存器”将不能反映端口上的电平状态,也就是说,模拟输入配置下,CPU不能在“输入数据寄存器”上读到有效的数据。输出缓冲器被禁止(对应5.1.9)
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑷模拟输入模式当I/O端口被配置为模拟输入配置时:●输出缓冲器被禁止;●禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为’0’;●弱上拉和下拉电阻被禁止;●读取输入数据寄存器时数值为’0’。
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑸开漏输出模式
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑸开漏输出模式当CPU在编号1端通过“位设置/清除寄存器”或“输出数据寄存器”写入数据后,该数据位将通过编号2的输出控制电路传送到编号4的I/O端口。如果CPU写入的是逻辑“1”,通过输出控制电路,编号3的N-MOS管将处于关闭状态,此时I/O端口的电平将由外部的上拉电阻决定,如果CPU写入的逻辑“0”,则编号3的N-MOS管将处于开启状态,此时I/O端口的电平编号3的N-MOS管拉到了VSS的零电位。在上图的虚线部分,施密特触发器处于开启状态,这意味着CPU可以随时监控I/O端口的状态;通过这个特性,还实现虚拟的I/O端口双向通信;只要CPU输出逻辑“1”,I/O端口的电平将完全由外部电路决定,因此,CPU可以在“输入数据寄存器”读到外部电路的信号,而不是它自己输出的逻辑“1”。开漏输出:输出端相当于三极管的集电极要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑸开漏输出模式开漏输出使用场合:一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度
。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。补充:什么是“线与”?:其实可以简单的理解为:在所有引脚连在一起时,外接一上拉电阻,如果有一个引脚输出为逻辑0,相当于接地,与之并联的回路“相当于被一根导线短路”,所以外电路逻辑电平便为0,只有都为高电平时,与的结果才为逻辑1。
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式(6)推挽输出模式
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式(6)推挽输出模式
当CPU在编号1端通过“位设置/清除寄存器”或“输出数据寄存器”写入数据后,该数据位将通过编号2的输出控制电路传送到编号4的I/O端口。推挽:是指两个管子交替工作。如果CPU写入的是逻辑“1”,则编号3的N-MOS高阻,P-MOS导通,输出1;如果CPU写入的逻辑“0”,则编号3的N-MOS导通,P-MOS高阻,输出0。推挽输出:可以输出高、低电平、连接数字器件
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式当I/O口配置成输出时:(1)输出缓冲器被激活(2)施密特触发输入被激活(3)弱上拉和下拉电阻被禁止(4)出现在I/O口上的数据在每个APB2时钟被采样到输入数据寄存器(5)在开漏模式时,对输入数据寄存器的读访问可得到I/O状态(6)在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置3个最大输出速度-2MHz:
USART串口,若最大波特率只需115.2k
-10MHz:I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的GPIO引脚速度。-50MHz:
SPI接口,若使用18M或9M波特率
这个速度是指GPIO口驱动电路的响应速度,而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式(7)开漏输出复用功能
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑻推挽复用输出模式
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑻推挽复用输出模式
最后是GPIO推挽复用输出模式。同样的道理,编号2的输出控制电路的输入,与复用功能的输出端相连,此时输出数据寄存器被从输出通道断开了,并和片上外设的输出信号相连接。我们将GPIO配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。其它部分与前述模式一直,包括对“输入数据寄存器”的读取之后内容参考手册P105-P106;P113-
5.1GPIO的工作原理二、IO口的基本结构2、
GPIO的8种设置模式⑻推挽复用输出模式复用功能配置(1)在开漏或推挽式配置中,输出缓冲器被打开(2)内置外设的信号驱动输出缓冲器(复用功能输出)、(3)施密特触发输入被激活(4)弱上拉和下拉电阻被禁止(5)出现在I/O口上的数据在每个APB2时钟被采样到输入数据寄存器(6)在开漏模式时,对输入数据寄存器的读访问可得到I/O状态(7)在推挽模式时,对输出数据寄存器的读访问得到最后一次写的值三、STM32GPIO主要功能:
5.1GPIO的工作原理5.1.1通用I/O(GPIO)用,输入输出;最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;5.1.2单独的位设置或位清除;方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx,
GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平;5.1.3外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;三、STM32GPIO主要功能:
5.1GPIO的工作原理5.1.4复用功能(AF),复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O
端口被配置成浮空输入模式:(1)复用的输入功能,可配置成(输入浮空,上拉或下拉);(2)复用的输出功能:必须配置成复用输出模式(推挽或开漏)(3)双向复用功能:必须配置成复用输出模式(推挽或开漏),输入驱动器配置成浮空输入模式
三、STM32GPIO主要功能:5.1.5软件重新映射I/O复用功能:为了使不同器件封装的外设I/O
功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;5.1.6GPIO锁定机制:主要针对复位设定的,当某端口位lock后,复位后将不改变的此端口的位配置。
5.1GPIO的工作原理通常有5种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2)作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
注意如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。5.2库函数具体函数用法详情见STM32固件库使用手册#include"stm32f10x.h"GPIO_InitTypeDefGPIO_InitStructure;#defineLED1_ONGPIO_SetBits(GPIOB,GPIO_Pin_5);#defineLED1_OFFGPIO_ResetBits(GPIOB,GPIO_Pin_5);voidDelay(__IOuint32_tnCount);Intmain(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//将配置为通用推挽输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);While(1){
LED1_ON;Delay(0xAFFFF);LED1_OFF;Delay(0xAFFFF);}}5.2
编程举例/*****************************************************************************名称:voidDelay(__IOuint32_tnCount)*功能:延时函数*入口参数:无*出口参数:无*说明:*调用方法:无****************************************************************************/voidDelay(__IOuint32_tnCount){
for(;nCount!=0;nCount--);}5.2
编程举例(1)GPIO_Mode_AIN
模拟输入
(2)GPIO_Mode_IN_FLOATING
浮空输入
(3)GPIO_Mode_IPD
下拉输入
(4)GPIO_Mode_IPU
上拉输入
(5)GPIO_Mode_Out_OD
开漏输出
(6)GPIO_Mode_Out_PP
推挽输出
(7)GPIO_Mode_AF_OD
复用开漏输出
(8)GPIO_Mode_AF_PP
复用推挽输出STM32GPIO使用操作步骤:1.使能GPIO对应的外设时钟例如://使能GPIOA、GPIOB、GPIOC对应的外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC,ENABLE);2.声明一个GPIO_InitStructure结构体例如: GPIO_InitTypeDefGPIO_InitStructure;3.选择待设置的GPIO管脚例如:/*选择待设置的GPIO第7、8、9管脚位,中间加“|”符号*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;4.
设置选中GPIO管脚的速率例如:/*设置选中GPIO管脚的速率为最高速率2MHz*/ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; //最高速率2MHz5.
设置选中GPIO管脚的模式例如:/*设置选中GPIO管脚的模式为开漏输出模式*/ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; //开漏输出模式6.根据GPIO_InitStructure中指定的参数初始化外设GPIOX例如:/*根据GPIO_InitStructure中指定的参数初始化外设GPIOC*/ GPIO_Init(GPIOC,&GPIO_InitStructure);7.其他应用 例:将端口GPIOA的第10、15脚置1(高电平)GPIO_SetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_15);例:将端口GPIOA的第10、15脚置0(低电平)GPIO_ResetBits(GPIOA,GPIO_Pin_10|GPIO_Pin_15);操作实例做个跑马灯程序,PB.8—PB.11口分别4个LED灯,当I/O为高电平时LED灯点亮。见课本P215#include"stm32f10x.h"voidRCC_Configuration(void);voidDelay(__IOuint32_tnCount);intmain(void){RCC->APB2ENR|=1<<3; GPIOB->CRL=0x3<<20;//配置PB5为推挽输出,50MHZ while(1) { GPIOB->ODR=0x0; Delay(0xAFFFF); GPIOB->ODR=0x20; Delay(0xAFFFF); }}5.2寄存器描述(详见P205)例一:寄存器操作举例
/*****************************************************************************名称:voidRCC_Configuration(void)*功能:系统时钟配置为72MHZ*入口参数:无*出口参数:无*说明:*调用方法:无****************************************************************************/voidRCC_Configuration(void){SystemInit();}/*****************************************************************************名称:voidDelay(__IOuint32_tnCount)*功能:延时函数*入口参数:无*出口参数:无*说明:*调用方法:无****************************************************************************/voidDelay(__IOuint32_tnCount){for(;nCount!=0;nCount--);}#include“stm32f10x.h“位带操作的实例//位绑定的定义
#defineGPIOA_ODR_A(GPIOA_BASE+0x0c)#defineGPIOA_IDR_A(GPIOA_BASE+0x08)#defineGPIOB_ODR_B(GPIOB_BASE+0x0c)#defineGPIOB_IDR_B(GPIOB_BASE+0x08)//位绑定的公式
#defineBitBand(Addr,BitNum)*((volatileunsignedlong*)((Addr&0xf0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))#definePAout(n)BitBand(GPIOA_ODR_A,n)//第几个端口作为输出
#definePAin(n)BitBand(GPIOA_IDR_A,n)//第几个端口作为输如intmain(void){//1.PA.0~PA.7作为推挽输出,50MHZ; //PA.8~PA.15作为输入;
GPIOA->CRL=0x33333333; GPIOA->CRH=0x44444444; //2.输入状态反应到输出引脚上
while(1) { if(PAin(8)==1) PAout(0)=1;elsePAout(0)=0; if(PAin(9)==1)PAout(1)=1;elsePAout(1)=0; }}5.3GPIO复用功能AFIOAlternativeFunctionIO同一管脚,不仅作为GPIO,也可作为其他特殊功能使用即同一管脚,多种应用5.3GPIO复用功能当LSE振荡器关闭时,LSE振荡器引脚OSC32_IN/OSC32_OUT可以分别用做GPIO的PC14/PC15,LSE功能始终优先于通用I/O口的功能。5.3.2BXCAN复用功能重映射CAN信号可以被映射到端口A、端口B或端口D上,如下表所示。对于端口D,在36、48和64脚的封装上没有重映射功能。5.3GPIO复用功能JTAG/SWD复用功能重映射调试接口信号被映射到GPIO端口上,如下表所示。表调试接口信号5.3GPIO复用功能表调试端口映像5.3GPIO复用功能5.3.4定时器复用功能重映射定时器4的通道1到通道4可以从端口B重映射到端口D。其他定时器的重映射列在下表。参见复用重映射和调试I/O配置寄存器(AFIO_MAPR)定时器4复用功能重映像5.3GPIO复用功能定时器3复用功能重映像定时器2复用功能重映像5.3GPIO复用功能定时器1复用功能重映像5.3GPIO复用功能5.3GPIO复用功能5.3GPIO复用功能5.3GPIO复用功能5.3GPIO复用功能使用默认复用功能前必须对端口位配置寄存器编程。●对于复用的输入功能,端口可以配置成:−输入模式(浮空、上拉或下拉)−复用功能输出模式:输入驱动器被配置成浮空输入模式●对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。●对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。如果把一端口配置成复用输出功能,将使引脚和输出寄存器断开,并和片上外设的输出信号连接。如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。5.3GPIO复用功能STM32外部中断ARM
Cortex-m3内核支持256个“中断通道”(16个内核+240个外部)和可编程256级中断优先级设置。
STM32采用Cortex-m3内核,但是STM32并没有使用Cortex-m3的全部资源。
STM32目前支持76个“中断通道”(16个内核+60个外部)和可编程16级中断优先级设置。(参考书册P132,表55)STM32的外部中断通道已经固定分配给相应的外设。STM32外部中断NVIC在内核中的位置1、NVIC相关知识回顾STM32外部中断NVIC在内核中的位置1、NVIC相关知识回顾NVIC的NVIC_Init()库函数封装在misc.c在NVIC初始化,首先定义并填充一个NVIC_InitTypeDef类型的结构体4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组
第0组:所有4bit用于指定响应优先级;
第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;
第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;
第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;
第4组:所有4位用于指定抢占式优先级。由以下函数实现:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)//2位抢占优先级1、NVIC相关知识回顾2、STM32-GPIO外部中断相关知识回顾中断分类STM32的EXTI控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
触发方式:STM32的外部中断是通过边沿来触发的,不支持电平触发。
外部中断分组:STM32的每一个GPIO都能配置成一个外部中断触发源,STM32通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0为第一组,那么依此类推,我们能得出一共有16组,STM32规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。中断和事件(续)
外部中断/事件线路映像80(低密度STM32F10x)或112个(中、高密度STM32F10x)GPIO端口以左图的方式连接到16个外部中断/事件线上:另外三种其他的外部中断/事件控制器的连接如下:EXTI线16连接到PVD输出EXTI线17连接到RTC闹钟事件EXTI线18连接到USB唤醒事件2、STM32-GPIO外部中断相关知识回顾在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0–EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数,参考手册P130表552、STM32-GPIO外部中断相关知识回顾EXTI的EXTI_Init()库函数封装stm32f10x_exti.c在EXTI初始化,首先定义并填充一个EXTI_InitTypeDef类型的结构体2、STM32-GPIO外部中断相关知识回顾使用GPIO外部中断的基本步骤如下:
STM32的每个IO口都可以作为中断输入,这点很好用。要把IO口作为外部中断输入,有以下几个步骤:1)开启IO口时钟和复用时钟由于GPIO并不是专用的中断引脚,这样我们要先开启相应时钟和复用时钟2)初始化IO口为输入。这一步设置你要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。
3)在库函数中,配置
GPIO
与中断线的映射关系的函数
GPIO_EXTILineConfig()来实现的:void
GPIO_EXTILineConfig(uint8_t
GPIO_PortSource,
uint8_t
GPIO_PinSource)该函数将
GPIO
端口与中断线映射起来,使用范例是:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);将中断线
2
与
GPIOE
映射起来,那么很显然是
GPIOE.2
与
EXTI2
中断线连接了。设置好中断线映射之后,那么到底来自这个
IO
口的中断是通过什么方式触发的呢?接下来我们就要设置该中断线上中断的初始化参数了。中断线上中断的初始化是通过函数
EXTI_Init()实现的。EXTI_Init()函数的定义是:void
EXTI_Init(EXTI_InitTypeDef*
EXTI_InitStruct);固件库P993)在库函数中,配置
GPIO
与中断线的映射关系的函数EXTI外部中断配置(中断源的选择,清除中断标志,触发模式)。
这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。中断线上中断的初始化是通过函数
EXTI_Init()实现的。EXTI_Init()函数的定义是:void
EXTI_Init(EXTI_InitTypeDef*
EXTI_InitStruct);固件库P994)配置中断分组(NVIC),并使能中断配置中断分组(NVIC),并使能中断(分组,指定优先级,使能)
这一步,我们就是配置中断的分组,以及使能,对STM32的中断来说,只有配置了NVIC的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。中断控制器的初始化是通过函数
NVIC_Init()来实现
:NVIC_Init(void)
{NVIC_InitTypeDefNVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组
NVIC_InitStructure.NVIC_IRQChannel
=
EXTI2_IRQn;
//使能按键外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority
=
0x02;
//抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority
=
0x02;
//子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd
=
ENABLE;
//使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
5)编写中断服务程序这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。第一个函数是判断某个中断线上的中断是否发生(标志位是否置位)
:ITStatus
EXTI_GetITStatus(uint32_t
EXTI_Line);这个函数一般使用在中断服务函数的开头判断中断是否发生。另一个函数是清除某个中断线上的中断标志位:void
EXTI_ClearITPendingBit(uint32_t
EXTI_Line);这个函数一般应用在中断服务函数结束之前,清除中断标志位。1)设置相应的时钟首先需要打开GPIOB、GPIOC和GPIOE(因为按键另外一端连接的是PE口)。然后由于是要用于触发中断,所以还需要打开GPIO复用的时钟。详细代码如下:voidRCC_Configuration(void){SystemInit();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE,ENABLE);}相应的时钟所需要的RCC函数在stm32f10x_rcc.c中,所以要在工程中添加此文件。2)GPIO配置voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; //LED1V6GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 危重患者护理未来发展趋势
- 剖宫产产妇的便秘护理
- 护理与急救护理
- 快递行业项目部负责人面试手册
- 旅游酒店业酒店总经理招聘要点
- 快递公司办公室管理岗位面试要点详解
- 客户满意度提升计划分行版
- 基于现代技术的农村电商发展研究
- 连锁便利店长候选人资格条件解析
- 旅游行业客户服务专员培训资料
- 全国高考语文(选修)古诗文默写大全:《老子八章》《季氏将伐颛臾》等12篇(附答案)
- 2025年安徽工贸职业技术学院单招职业技能测试题库及一套完整答案
- 护理警示教育培训
- 电动单梁起重机培训
- 腹腔镜结肠癌手术步骤
- 钢构厂房施工合同范本(2024版)
- TB 10752-2018 高速铁路桥涵工程施工质量验收标准
- 应急资源调查研究报告范文
- 定量药理学的发展及其在新药研制与临床合理用药中的课件
- 2023学年完整公开课版《字母表》教学
- 华东师范大学 PPT 37
评论
0/150
提交评论