对串口接收FIFO处理机制的解读( 二 )

怎样才叫做回调函数?回调函数,是一个通过函数指针调用的函数 。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 。
区别指针函数和函数指针:
//指针函数:int *fun(int x,int y)int *x=fun(4,5);在调用指针函数时,需要同类型的指针来接收函数返回值是函数,返回值时指针属于数据类型123456//函数指针:int (*fun)(int x,int y)int x(int x,int y);x=fun;fun=&x;x=(*fun)(1,3);是指针,指向函数 。属于函数名称123456781.初始化串口FIFO对应的相关的变量static void UartVarInit(void) {#if UART1_FIFO_EN == 1g_tUart1.uart = USART1; /* STM32 串口设备 */g_tUart1.pTxBuf = g_TxBuf1; /* 发送缓冲区指针 */g_tUart1.pRxBuf = g_RxBuf1; /* 接收缓冲区指针 */g_tUart1.usTxBufSize = UART1_TX_BUF_SIZE; /* 发送缓冲区大小 */g_tUart1.usRxBufSize = UART1_RX_BUF_SIZE; /* 接收缓冲区大小 */g_tUart1.usTxWrite = 0; /* 发送FIFO写索引 */g_tUart1.usTxRead = 0; /* 发送FIFO读索引 */g_tUart1.usRxWrite = 0; /* 接收FIFO写索引 */g_tUart1.usRxRead = 0; /* 接收FIFO读索引 */g_tUart1.usRxCount = 0; /* 接收到的新数据个数 */g_tUart1.usTxCount = 0; /* 待发送的数据个数 */g_tUart1.SendBefor = 0; /* 发送数据前的回调函数 */g_tUart1.SendOver = 0; /* 发送完毕后的回调函数 */g_tUart1.ReciveNew = 0; /* 接收到新数据后的回调函数 */g_tUart1.Sending = 0; /* 正在发送中标志 */#endif } 1234567891011121314151617181920明确中断服务程序的顺序:中断函数处理:void USART1_IRQHandler(void)—》 UART中断请求:HAL_UART_IRQHandler(UART_HandleTypeDef *huart)—》 中断使能:UART_Receive_IT— 》 中断回调函数 HAL_UART_RxCpltCallback(huart);
#if UART1_FIFO_EN == 1void USART1_IRQHandler(void) //系统中串口的中断函数入口{UartIRQ(&g_tUart1);}#endif1234567 2.编辑自定义的UART中断请求【对串口接收FIFO处理机制的解读】static void UartIRQ(UART_T *_pUart){uint32_t isrflags = READ_REG(_pUart->uart->ISR);uint32_t cr1its = READ_REG(_pUart->uart->CR1);uint32_t cr3its = READ_REG(_pUart->uart->CR3);if ((isrflags & USART_ISR_RXNE) != RESET){/* 从串口接收数据寄存器读取数据存放到接收FIFO */uint8_t ch;ch = READ_REG(pUart->uart->RDR);/* 读串口接收数据寄存器 */_pUart->pRxBuf[_pUart->usRxWrite] = ch;/* 填入串口接收FIFO */if (++_pUart->usRxWrite >= _pUart->usRxBufSize) /* 接收FIFO的写指针+1 */{_pUart->usRxWrite = 0;}if (_pUart->usRxCount < _pUart->usRxBufSize) /* 统计未处理的字节个数 */{_pUart->usRxCount++;}/* 回调函数,通知应用程序收到新数据,一般是发送1个消息或者设置一个标记 */// if (_pUart->usRxWrite == _pUart->usRxRead)// if (_pUart->usRxCount == 1){if (_pUart->ReciveNew){_pUart->ReciveNew(ch); /* 比如,交给MODBUS解码程序处理字节流 */}}}/* 处理发送缓冲区空中断 */if (((isrflags & USART_ISR_TXE) != RESET) && (cr1its & USART_CR1_TXEIE) != RESET){// if (_pUart->usTxRead == _pUart->usTxWrite)if (_pUart->usTxCount == 0) /* 发送缓冲区已无数据可取 */{/* 发送缓冲区的数据已取完时,禁止发送缓冲区空中断 (注意:此时最后1个数据还未真正发送完毕)*/// USART_ITConfig(_pUart->uart, USART_IT_TXE, DISABLE);CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TXEIE); /* 使能数据发送完毕中断 */// USART_ITConfig(_pUart->uart, USART_IT_TC, ENABLE);SET_BIT(_pUart->uart->CR1, USART_CR1_TCIE);}Else /* 还有数据等待发送 */{_pUart->Sending = 1; /* 从发送FIFO取1个字节写入串口发送数据寄存器 */// USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);_pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];if (++_pUart->usTxRead >= _pUart->usTxBufSize){_pUart->usTxRead = 0;}_pUart->usTxCount--;}}/* 数据bit位全部发送完毕的中断 */if (((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)){// if (_pUart->usTxRead == _pUart->usTxWrite)if (_pUart->usTxCount == 0){ /* 如果发送FIFO的数据全部发送完毕,禁止数据发送完毕中断 */// USART_ITConfig(_pUart->uart, USART_IT_TC, DISABLE);CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TCIE); /* 回调函数, 一般用来处理RS485通信,将RS485芯片设置为接收模式,避免抢占总线 */if (_pUart->SendOver){_pUart->SendOver();}_pUart->Sending = 0;}else{ /* 正常情况下,不会进入此分支 *//* 如果发送FIFO的数据还未完毕,则从发送FIFO取1个数据写入发送数据寄存器 */// USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);_pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];if (++_pUart->usTxRead >= _pUart->usTxBufSize){_pUart->usTxRead = 0;}_pUart->usTxCount--;}} /* 清除中断标志 */SET_BIT(_pUart->uart->ICR, UART_CLEAR_PEF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_FEF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_NEF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_OREF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_IDLEF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_TCF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_LBDF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_CTSF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_CMF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_WUF);SET_BIT(_pUart->uart->ICR, UART_CLEAR_TXFECF);}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394


推荐阅读