请教,hal库的串口空闲中断怎么写?另,串口中断函数看...
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart){
uint32_t isrflags = READ_REG(huart->Instance->SR);
uint32_t cr1its = READ_REG(huart->Instance->CR1);
uint32_t cr3its = READ_REG(huart->Instance->CR3);
uint32_t errorflags = 0x00U;
uint32_t dmarequest = 0x00U;
/* If no error occurs 没有校验错误、帧错误、过载错误、噪声错误*/
errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
if(errorflags == RESET)
{
/* UART in mode Receiver 如果接收非空标志置位,调用接收中断函数-------------------------------------------------*/
if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{
UART_Receive_IT(huart);
return;
}
}
/* If some errors occur 如果有错误,且CR3错误中断使能或CR1的非空中断或校验错误中断使能,不明白这里为什么加上非空中断*/
if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
{
/* UART parity error interrupt occurred校验错误 ----------------------------------*/
if(((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
{
huart->ErrorCode |= HAL_UART_ERROR_PE;
}
/* UART noise error interrupt occurred 噪声错误-----------------------------------*/
if(((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
{
huart->ErrorCode |= HAL_UART_ERROR_NE;
}
/* UART frame error interrupt occurred 帧错误-----------------------------------*/
if(((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
{
huart->ErrorCode |= HAL_UART_ERROR_FE;
}
/* UART Over-Run interrupt occurred 过载错误--------------------------------------*/
if(((isrflags & USART_SR_ORE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
{
huart->ErrorCode |= HAL_UART_ERROR_ORE;
}
/* Call UART Error Call back function if need be 调用错误处理回调函数--------------------------*/
if(huart->ErrorCode != HAL_UART_ERROR_NONE)
{
/* UART in mode Receiver 这里不是和函数一开始那句重了吗?!-----------------------------------------------*/
if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
{
UART_Receive_IT(huart);
}
...
}
这个中断函数,先是判断串口SR寄存器有没有错误,没有错误的话,调用串口中断接收函数UART_Receive_IT(huart);
后面在SR寄存器有错误标识的情况下,进行了一堆判断,结果还是调用UART_Receive_IT(huart)这个函数?
第52行和第14行不是重了吗?
没有错误的情况下,如果处于接收状态,且接收非空标志被置位了,调用中断接收函数;
如果有错误,判断错误类型,如果处于接收状态,且接收非空标志被置位了,调用中断接收函数?
直接在it文件里在HAL库的中断处理之前加上空闲中断的处理 之后行吗? 我理解的是,上面满足后就跳出了,如果上面不满足,会走下面的代码,处理UART_Receive_IT用的是同样的标志位,是不同的处理过程。 谢谢。 any012 发表于 2018-11-22 10:29
之后行吗?
建议放前边,自己的代码把空闲中断处理完就可以退出中断服务函数了,不需要再走HAL库的处理过程 官方给的串口中断程序 串口空闲中断
页:
[1]