端口复用&NVIC中断优先级管理

一、什么是端口复用

STM32的很多内置外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO作为内置外设的功能引脚的时候就叫做复用(GPIO作为引脚使用时)例如:串口1的发送接收接收引脚是PA9、PA10,当我们把PA9、PA10不用作GPIO,而用作复用功能串口1的发送接收引脚的时候,叫端口复用。

 

二、STM32F4的端口复用映射原理

1、STM32F4系列微控制器IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的IO口。这样可以确保共用同一个IO引脚的外设之间不会发生冲突。

2、每个IO引脚都有一个复用器,该复用器采用16路复用功能输入(AF0到AF15),可通过GPIOx_AFRL(针对引脚0-7)和GPIOx_AFRH(针对引脚8-15)寄存器对这些输入进行配置,每四位控制一路复用。

例如:PA2引脚可以通过复用器复用串口USART2_TX/定时器九TIM9_CH1等等

 

三、AFRL寄存器及其配置

AFRL与AFRH寄存器都是32位,每一个IO口要用到4位(AFRL与AFRH配置一样,只是AFRL配置IO口引脚0-7,AFRH为8-15)

 

例如:配置GPIOA2,映射为串口2(USART2)对应为AF7,则需要将AFRL2中的第8至11位赋值为0111,即复用器连接到串口2

          复用功能映射配置

1、系统功能

将IO连接到AF0,然后根据所用功能进行配置

——JTAG或SWD:在各器件复位后,会将这些引脚指定为专用引脚,可供片上调试模块立即使用(不受GPIO控制器控制)

——RTC_REFIN:此引脚应配置为输入浮空模式

——MCO1和MCO2:这些引脚必须配置为复用功能

2、GPIO

在GPIOx_MODER寄存器中将所需IO配置为输入或输出

3、外设复用功能

对于ADC和DAC,在GPIOx_MODER寄存器中将所需IO配置为模拟通道

对于其它外设:

——在GPIOx_MODER寄存器中将所需IO配置为复用功能

——通过GPIOx_OTYPER、GPIOx_PUPDR、GPIOx_OSPEEDER寄存器,分别选择类型、上拉或下拉以及输出速度

——在GPIOx_AFRL或GPIOx_AFRH寄存器中,将IO连接到所需AFx

端口复用为复用功能配置过程

以PA9、PA10配置为串口1为例

1、GPIO端口时钟使能

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE)

2、复用外设时钟使能(STM32F4中使用任何一个复用外设时都要使能时钟)

将端口PA9、PA10复用为串口,要使能串口时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)

3、端口模式配置为复用功能。GPIO_Init()函数(除了ADC和DAC要配置为模拟输入以外其它所有端口模式都要配置为复用功能)

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF

4、配置GPIOx_AFRL或者GPIOx_AFRH寄存器,将IO连接到所需的AFx

PA9连接到AF7,复用为UASART1_TX

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1)

PA10连接到AF7,复用为USART1_RX

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1)

PA9、PA10复用为串口1的配置过程

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

//USART1端口配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin10;//GPIOA9与GPIOA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//速度50MHz
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽复用输出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9,PA10

//串口1对应引脚复用映射
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIOA9复用为USATRT1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIO10复用为USART1

四、中断管理方法

首先,对STM32中断进行分组,组0~4.同时,对每个中断设置一个抢占优先级和一个响应优先级。

分组配置是在寄存器SCB-->AIRCR中配置:

 

AIORCR【10:8】:第八位到底十位设置相关的值(设置优先级分组后就确定了每一个中断的响应优先级和抢占优先级别)

IP bit【7:4】:每一个中断都有IP寄存器,确定组后自动确认IP(例如: 2:2代表两位抢占优先级,两位响应优先级;3:1代表三位抢占优先级,一位响应优先级)

五、抢占优先级&响应优先级区别:

1、高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的

2、抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断

3、如果两个中断的抢占优先级和响应优先级都是一样的,则哪个中断先发生就先执行

(抢占优先级是等级,响应优先级是序号,所有事情开始排队,高等级可以插低等级的队,同等级的按序号排队)

抢占优先级0~3,等级最高为0,最低为3;响应优先级0~3,按序号0号比3号靠前

特别说明:

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,设置好分组后一般不会再改变。

六、设置中断优先级分组步骤:

1、系统运行后先设置中断优先级分组。调用函数:

void NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup);

2、针对每个人中断,设置对应的抢占优先级和响应优先级:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStrct);例如:

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//

NVIC_InitStructure.NVIC_IRQChannelPreemtionPriority=1;//

NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//

NVIC_Init(&NVIC_InitStructure);

3、如果需要挂起或解挂,查看中断当前激活状态,分别调用相关函数即可;

(STM32F4开发指南,4.5小节)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值