打印
[STM32F4]

STM32 HAL库串口回调函数配置失效

[复制链接]
481|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yutingwei|  楼主 | 2022-11-17 13:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
STM32 HAL库串口回调函数配置失效(HAL_UART_RxCpltCallback)小编实际操作中,用HAL_UART_RxCpltCallback函数配置接收串口数据,在测试过程中用手碰了单片机引脚之后无法再接收到数据,终于找到了解决办法,就是自己使能接收中断和自己定义中断回调函数;
使能中断
    __HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);                //空闲中断使能    __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);                //接收中断使能

使用特权

评论回复
沙发
yutingwei|  楼主 | 2022-11-17 14:04 | 只看该作者
中断回调函数

void user_uart1IT_ReceiveCallback(void)
{
    static uint8_t* pBuff    =    uart1_data.uart1_rxbuff;
    static uint8_t size_cnt=0;
    uint8_t receive_dat;
   
    if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)        //uart rx flag
    {
        receive_dat = (uint16_t) READ_REG(huart1.Instance->DR);
        *(pBuff++) = receive_dat;
        size_cnt++;
        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
    }
   
    if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)        //uart idle flag
    {
        uart1_state.bits.interrupt_idle = ON;                                            //set flag
        uart1_data.uart1_count = size_cnt;
        receive_dat = (uint16_t) READ_REG(huart1.Instance->DR);        //clear reg
        size_cnt=0;
        pBuff    =    uart1_data.uart1_rxbuff;
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    }

}

使用特权

评论回复
板凳
yutingwei|  楼主 | 2022-11-17 14:06 | 只看该作者
本程序包含自己定制的AT指令上图片

使用特权

评论回复
地板
yutingwei|  楼主 | 2022-11-17 14:10 | 只看该作者
源码链接:https://github.com/NoSmallWhite/WL-open-projects

文件名:demo-adc-vet6-20200708-1732 自定义AT指令字取出任意字符串

使用特权

评论回复
5
yutingwei|  楼主 | 2022-11-17 14:12 | 只看该作者
接收大量数据“ORE”位报故障,“ORE:过载错误 (Overrun error)  ”

使用特权

评论回复
6
yutingwei|  楼主 | 2022-11-17 14:12 | 只看该作者
解决办法:添加串口故障回调函数,有故障就清零标志

使用特权

评论回复
7
yutingwei|  楼主 | 2022-11-17 14:14 | 只看该作者
/******************************************************************************************
*** 函数名称: HAL_UART_ErrorCallback
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:故障回调-查看故障状态
*** 调度时间:无
***        编者                                                                                时间                                                                                版本
***        XXXZ                                                                                XXXX/XX/XX                                                        V0.1
******************************************************************************************/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)  
{
        if(huart->Instance == UART4)                                                                                                                                                                        //判断串口错误回调函数,串口是否为IAP串口函数
        {
                if(__HAL_UART_GET_FLAG(UART_IAP, UART_FLAG_ORE) != RESET)                                                //串口过载错误,清零标志并且重新打开串口接收中断
                {
                        __HAL_UART_CLEAR_OREFLAG(UART_IAP);
                }
                __HAL_UART_ENABLE_IT(UART_IAP,UART_IT_RXNE);                                                                                                //接收中断使能,自己可以判断接收标志,第一种中断方式
                __HAL_UART_CLEAR_FLAG(UART_IAP,UART_FLAG_RXNE);                                                                                        //清除接收标志
               
        }
}

使用特权

评论回复
8
yutingwei|  楼主 | 2022-11-17 14:15 | 只看该作者

使用特权

评论回复
9
OKAKAKO| | 2024-6-25 15:44 | 只看该作者
有可能是碰触静电导致内部出问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

364

帖子

0

粉丝