你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

有用过HAL库的串口中断接收的朋友吗

[复制链接]
arels 提问时间:2017-1-3 16:59 /
大家的void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)这个接收完成回掉函数可以设置断点吗hal中断接收我理解只有
1,配置中断
2,在主函数中调用一次HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)开启标志位;
3,编写HAL_UART_RxCpltCallback函数
我也只做了这几步,进入调试发现这个回掉函数不仅没起作用,连断点都设置不了,这是为什么呢?
收藏 2 评论28 发布时间:2017-1-3 16:59

举报

28个回答
arels 回答时间:2017-1-6 13:54:49
找到问题了 void USART3_IRQHandler(void)
{

  HAL_UART_IRQHandler(&huart3);

}
如果在cube中设置了nvic的话这个函数会在-it.c里面自动写好
如果cube中没有设置nvic的话 这个函数要自己写 才能开启中断

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

wenyangzeng 回答时间:2017-1-4 13:19:21
本帖最后由 wenyangzeng 于 2017-1-4 13:20 编辑

这个HAL USART 需要在主循环函数中不断调用HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE),才能响应中断。这与查询方式有何区别?
令人费解!!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wjandsq 回答时间:2017-1-10 11:59:38
本帖最后由 wjandsq 于 2017-1-13 20:09 编辑

HAL库串口中断函数使用说明(For STM32F4xxx)
UART_HandleTypeDef  结构类型,串口句柄
.Instance  USART_TypeDef 结构指针类型,串口硬件寄存器数据结构
. Init      UART_InitTypeDef结构类型,串口通讯参数
. gState    HAL_UART_StateTypeDef 枚举类型,串口状态信息,和发送操作有关联
.RxState    HAL_UART_StateTypeDef枚举类型,串口状态信息,和接收操作有关联
.pTxBuffPtr   uint8_t指针类型,串口发送buffer指针
.TxXferSize    uint16_t类型,串口发送 buffer size
.TxXferCount  uint16_t类型,串口发送计数
.pRxBuffPtr   uint8_t指针类型,串口接收指针
.pRxBuffPtr   uint8_t指针类型,串口接收buffer指针
.RxXferSize    uint16_t类型,串口接收 buffer size
.RxXferCount  uint16_t类型,串口接收计数
HAL_UART_Init         串口初始化
HAL_UART_Receive_IT   串口中断接收API,BSP层调用
HAL_UART_Transmit_IT  串口中断发送API,BSP层调用
HAL_UART_IRQHandler  串口中断处理函数,所有硬件串口共用
UART_Receive_IT    串口中断接收处理函数,所有硬件串口共用
UART_Transmit_IT    串口中断发送处理函数,所有硬件串口共用
UART_EndRxTransfer  串口终止接收处理函数,所有硬件串口共用
UART_EndTransmit_IT  串口终止发送处理函数,所有硬件串口共用
HAL_UART_ErrorCallback 串口错误处理函数,所有硬件串口共用
HAL_UART_TxCpltCallback 串口发送回调函数,所有硬件串口共用
HAL_UART_RxCpltCallback 串口数据接收完成回调,所有硬件串口共用
串口中断处理函数(HAL_UART_IRQHandler)工作流程:
(1)当接收中断打开且接收寄存器非空,进行数据接收,该代码处理和标准外设驱动库一致。
(2)当出现校验位、噪声、溢出错误时,清除错误标志(代码非常完善),调用串口错误处理回掉函数(空函数)。
(3)当使能DMA发送或接收时,进行DMA发送或接收处理,DMA发送或接收的回调函数也可以重写。
(4)当串口接收到预先设置的个数时,调用串口接收回调函数,进行接收完毕的处理。
(5)当发送中断打开,并且发送寄存器为空,进行数据发送,该代码处理和标准外设驱动库一致。
(6)当串口发送完预先设置的个数时,启用发送完成中断,随后调用串口发送回调函数,进行发送完毕的处理。
串口中断bsp层代码设计参考:
可以利用HAL_UART_Receive_IT接收固定长度的串口数据包,但由于串口数据包长度往往不确定,而且需要实时处理(被用户程序实时取走),那么可以在自动生成的HAL串口初始化代码后添加:HAL_UART_Receive_IT(huart, (uint8_t *)USART1_RxBuffer, 1);
如果串口收到一个字符,就会调用HAL_UART_RxCpltCallback,可以在这个函数中实时取走字符,这个串口回调函数也相当于串口接收中断。可以重写这个__weak函数,而不必重写串口中断函数。为保证串口数据的连续接收,HAL_UART_RxCpltCallback函数应增加如下代码:
HAL_UART_Receive_IT(huart, (uint8_t *)USART1_RxBuffer, 1);

参考ST官方USB CDC例程的代码,一个重写的HAL_UART_RxCpltCallback示例代码如下(通过实际调试,可以连续接收):
/**
  * @brief  Rx Transfer completed callback
  * @param  huart: UART handle
  * @note   2016-12-11 wjandsq@163.com
  *              This function is eque to HAL_UARTx_Rx_IRQ
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  {
        /* User Code Begin 1   */
        if(++USART1_RxBufPtrIn == USART1_BuffLength) { USART1_RxBufPtrIn = 0;} /* uart bsp code demo */
        /* User Code End 1  */
        HAL_UART_Receive_IT(huart, (uint8_t *)(USART1_RxBuffer + USART1_RxBufPtrIn), 1);
    }
}
对于串口发送,同样可以重写TxCpltCallback函数,在这个函数里进行RS485的换向IO控制,不需要延时一个字节。



评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

haifeng-388081 回答时间:2017-1-3 18:26:34
不会帮顶。。。。
逍遥李 回答时间:2017-1-3 19:21:38
这个还真不清楚,断点调试用的很少
feiante 回答时间:2017-1-4 00:05:51
可以设置的,断点设置不了,可能是你配置不对,导致回调函数没有被调用

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

arels 回答时间:2017-1-4 09:42:49
feiante 发表于 2017-1-4 00:05
可以设置的,断点设置不了,可能是你配置不对,导致回调函数没有被调用

嗯  感觉是回调函数没有调用 被编译器优化了
海迹天涯 回答时间:2017-1-4 10:09:28
1:到串口的msp初始化函数中看看是否打开了串口中断
2:确定HAL_UART_Receive_IT是否被调用;
3:确定串口是否真的能接受到数据。
在HAL_UART_RxCpltCallback函数中再次调用HAL_UART_Receive_IT函数

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2017-1-4 10:21:23
用过,之前是用串口中断模式接收一个字节的数据,回调函数里做帧头判断,然后再开启接收下一个字节。
结果只接收了第一个字节,然后就进不了回调函数了,后来调试判断出是数据溢出了。是因为接收第一个字节后,回调函数处理部分太大了,还没处理完下一个数据就来了。
后来我改成空闲中断。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

arels 回答时间:2017-1-4 11:14:37
海迹天涯 发表于 2017-1-4 10:09
1:到串口的msp初始化函数中看看是否打开了串口中断
2:确定HAL_UART_Receive_IT是否被调用;
3:确定串口 ...

  HAL_NVIC_SetPriority(USART3_IRQn, 0, 2);
  HAL_NVIC_EnableIRQ(USART3_IRQn);
配置中断应该只有两句代码,是在HAL_UART_MspInit中调用?
arels 回答时间:2017-1-4 11:15:57
any012 发表于 2017-1-4 10:21
用过,之前是用串口中断模式接收一个字节的数据,回调函数里做帧头判断,然后再开启接收下一个字节。
结果 ...

嗯  看了许多留言 说这个回调函数效率太低了
海迹天涯 回答时间:2017-1-4 11:22:49
arels 发表于 2017-1-4 11:14
HAL_NVIC_SetPriority(USART3_IRQn, 0, 2);
  HAL_NVIC_EnableIRQ(USART3_IRQn);
配置中断应该只有两句 ...

你可以追踪下代码看看有没有被执行到
arels 回答时间:2017-1-4 11:37:30
海迹天涯 发表于 2017-1-4 11:22
你可以追踪下代码看看有没有被执行到

都执行了,可能是回调函数有问题
arels 回答时间:2017-1-4 11:47:21
海迹天涯 发表于 2017-1-4 11:22
你可以追踪下代码看看有没有被执行到

嗯 都执行了 我在想是不是回调函数的问题
any012 回答时间:2017-1-4 12:43:53
也许进入了串口接收错误处理回调函数。
lili0000 回答时间:2017-1-4 13:37:42
支持一下
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版