赞
踩
1》中断的过程:
在程序运行过程中:
中断源引发中断
CPU发生现场保护事件
CPU进入中断处理函数
执行完处理函数
CPU发生现场恢复事件
程序继续执行
(现场保护事件和现场恢复事件是CPU自动完成)
2》中断源----引发中断的事件
3》中断嵌套:在中断服务函数运行过程中,有其他的中断源引发中,先去执行其他中断服务函数,再继续执行
4》NVIC:异常控制器
为每个中断源配置两种优先级:(数组越小,优先级越高)
抢占优先级(主优先级):具备抢占功能,高优先级可以抢占低优先级
响应优先级(次优先级):不具备抢占功能,只有当两个同主优先级同时发生时,高优先 级先执行
NVIC为用户提供五种管理中断的方式:
* This parameter can be one of the following values:
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority 主优先级
* 4 bits for subpriority 次优先级 0---F
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority 主优先级 0---1
* 3 bits for subpriority 次优先级 0---7
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority 0---3
* 2 bits for subpriority 0---3
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority 0---7
* 1 bits for subpriority 0---1
* @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority 0---F
* 0 bits for subpriority
5》配置中断的步骤:
1》配置中断源
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState)
2》为中断源配置中断优先级
typedef struct
{
uint8_t NVIC_IRQChannel;//中断通道号----在stm32f10x.h这个头文件中的 typedef enum IRQn 找
uint8_t NVIC_IRQChannelPreemptionPriority; //主优先级
uint8_t NVIC_IRQChannelSubPriority; //次优先级
FunctionalState NVIC_IRQChannelCmd; //使能此通道
} NVIC_InitTypeDef;
NVIC_Init(NVIC_InitTypeDef * NVIC_InitStruct)
3》编写中断服务函数-----放在stm32f10x_it.c中【
void 函数名(在启动文件中已经定义)(void)
{
//具体中断发生后干的事情
}
void USART1_IRQHandler(void)
{
if(SET==USART_GetITStatus(USART1, USART_IT_RXNE)){
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
USART_SendData(USART1,USART_ReceiveData(USART1));
}
}
4》选择一种管理中断的方式-----只需要配置一次,第一个中断需要配置,放在while(1)之前
NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
6》[WEAK] 弱属性标志:被系统赋予这种标志的函数,你可以在外边编写一个同名函数,如果你写了,调用你写的,如果你没写调用系统的
7》B . 相当于c语言中的while(1)
8》如果配置了中断源,必须编写一个正确的中断服务函数,并且判断标志位和清除标志位
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。