void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)//设置优先级分组,整个项目共用一个分组
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
//计算优先级编码值,(组号,抢占优先级,响应优先级)并返回
void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
//设置具体中断源的优先级
void NVIC_EnableIRQ(IRQn_Type IRQn)//使能中断源
配置中断服务函数
void USART1_IRQHandler(void)
{
//接收中断
if((USART1->SR & (1<<5)))//表示接收到了数据
{
USART1->SR &= ~(1<<5);//标志位RXNE 标志也可以通过向该位写入零来清零,接收数据机器置1
arr.str[arr.len++] = USART1->DR;//读取数据放到数组
}
//空闲中断
if((USART1->SR) & (1<<4))//表示触发了接收中断且接收完了数据
{
//顺序清零,读取两个寄存器即可
USART1->SR;
USART1->DR;
arr.str[arr.len] = '\0';
arr.len = 0;
arr.flat = 1;//标志位表示接收完数据
printf("usart1:%s",arr.str);//把接收到的数据打印出来
}
}
触发条件为串口接收数据,且只有接收中断触发后空闲中断才触发一次,特别注意的是串口助手的发送新行,会将数据补上\r\n,注意辨别
ARM中断体系:
NVIC 支持由软件指定的优先级。 通过对中断优先级寄存器的 8 位 PRI_N 区执行写操作,
来将中断的优先级指定为 0~255。(设置占先和次级优先级)
占先优先级和次级优先级公用一个PRI_N区域
为了对具有大量中断的系统加强优先级控制, NVIC 支持优先级分组机制。
分组机制:如图所示
第一步:确定分组 ,写入值写入PRIGROUP寄存器中
第二步:往PRI_N写入值,确定占先级别值和次级级别值
注意:同一个工程,只能设置一个分组
STM32FXX中断体系:
ST公司精简了ARM的分组机制,占先和次级的分配区域为PRI_N高四位
使用的是ST芯片,所以需要遵循ST公司精简过的分组机制