无聊再总结一篇 ^ _ ^
1 首先我们先设置中断优先级分组,这个其实跟51里面的中断服务函数后面跟的那个一一样,不过32比较复杂,函数如下:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
注意:分组一旦分好就不要改变,因此这个函数只能调用一次,将其放在主函数main()中
2 接下来初始化中断函数:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
** 参数为结构体类型因此我们需要定义结构体.:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断(中断通道) NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能**
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存
3 随后我们编写中断服务函数就可以了,这个函数stm32已经给定,我们直接将对应名调用完善即可:例如文中用的是串口以1,我们就去内核code文件中找:USART1_IRQHandler().
相关配置步骤:
1 首先串口时钟使能:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1)
2 GPIO端口初始化:
GPIO_Init():设置为复用推挽输出
3 串口参数设置:
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
串口初始化为结构体因此我们要初始化结构体:
USART_InitStructure.USART_BaudRate = bound; //波特率设置; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl_Non;//无硬件控流
4开启串口相应中断并初始化:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) ,第二个参数为产生中断的类型
NVIC_Init(&NVIC_InitStructure);//初始化中断
5使能串口:
USART_Cmd();
6编写中断处理函数:这里我们用到的是串口1中断:USART1_IRQHandler
7对于串口数据的发送与接受:
发送:void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
接收: uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
8查看串口的状态:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG):例如
USART_GetFlagStatus(USART1, USART_FLAG_RXNE); 查看是否接收到数据
USART_GetFlagStatus(USART1, USART_FLAG_TC); 查看是否发送完数据
9对于进入中断后 一般我们都会判断,是否产生了这一中断
使用的函数是: ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是: if(USART_GetITStatus(USART1, USART_IT_TC)==SET)就说明数据发送完成.