arels 发表于 2017-1-3 16:59:45

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

大家的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函数
我也只做了这几步,进入调试发现这个回掉函数不仅没起作用,连断点都设置不了,这是为什么呢?

arels 发表于 2017-1-6 13:54:49

找到问题了 void USART3_IRQHandler(void)
{

HAL_UART_IRQHandler(&huart3);

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

wenyangzeng 发表于 2017-1-4 13:19:21

本帖最后由 wenyangzeng 于 2017-1-4 13:20 编辑

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

haifeng-388081 发表于 2017-1-3 18:26:34

不会帮顶。。。。

逍遥李 发表于 2017-1-3 19:21:38

这个还真不清楚,断点调试用的很少

feiante 发表于 2017-1-4 00:05:51

可以设置的,断点设置不了,可能是你配置不对,导致回调函数没有被调用

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函数

any012 发表于 2017-1-4 10:21:23

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

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);
配置中断应该只有两句 ...

你可以追踪下代码看看有没有被执行到
页: [1] 2 3
查看完整版本: 有用过HAL库的串口中断接收的朋友吗