求助!HAL库函数 串口中断接收!急急急!加入悬赏
首先介绍一下实验环境:单片机为stm32f415调试器:st-link
硬件初始化:
*串口波特率为614400
*采用定时器每隔500us触发一次串口中断发送
*发送完成后进入中断接收模式
定时器中断回调函数如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim14)
{
GYRO_Handle.cmd_GYRO=GYRO_CMD;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); 使能发送
HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1); 开启中断发送,然后进入发送模式
}
}
发送完成后进入发送中断完成回调函数:
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart3)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); 使能接收
HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7); 开启中断接收,然后进入接收模式
}
}
接收中断完成回调函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart3)
{
用户函数区域
}
}
实验结果:
发送没有问题,可成功发送。
接收只能收到第一个字节。
接收服务函数老是进入错误服务函数,错误号为数据溢出
已经分析两天了,还是没有找到问题,求大师分析。
magnbudie 发表于 2015-1-16 13:48
我把原有中断服务函数的标志位处理函数的顺序改了一下。
现在可以收到数据了,但是第一个数据经常出现跟帧 ...
根据现像,乱码一般是时钟配置问题。楼主检查下时钟配置。 HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HAL_UART_Transmit_IT之前。 党国特派员 发表于 2015-1-16 10:56
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HA ...
改后如下
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim14)
{
GYRO_Handle.cmd_GYRO=GYRO_CMD;
HAL_UART_Receive_IT(&huart3, GYRO_Handle.frame_GYRO, 7);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
HAL_UART_Transmit_IT(&huart3, &GYRO_Handle.cmd_GYRO, 1);
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart3)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
}
}
还是进入错误中断,无法进入接收完成中断 关注!
波特率降低测试 大秦正声 发表于 2015-1-16 11:25
关注!
波特率降低测试
9600木有问题! 通信距离有多远?用max3232? 本帖最后由 党国特派员 于 2015-1-16 11:40 编辑
HAL_UART_Receive_IT 只需要调用一次。
还有就是你的接收函数里都干了些什么,会不会时间超长了。
如果 是还出现数据溢出的话,那你就用HAL_UART_Receive_DMA吧,最好是双缓冲的。 用户函数区处理时间太长