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

求助!HAL库函数 串口中断接收!急急急!加入悬赏  

[复制链接]
magnbudie 提问时间:2015-1-16 10:32 /
悬赏30ST金币已解决
首先介绍一下实验环境:单片机为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)
        {
                 用户函数区域
        }
}


实验结果:

发送没有问题,可成功发送。
接收只能收到第一个字节。
接收服务函数老是进入错误服务函数,错误号为数据溢出

已经分析两天了,还是没有找到问题,求大师分析。

最佳答案

查看完整内容

根据现像,乱码一般是时钟配置问题。楼主检查下时钟配置。
收藏 2 评论40 发布时间:2015-1-16 10:32

举报

40个回答
党国特派员 回答时间:2015-1-16 10:32:56
magnbudie 发表于 2015-1-16 13:48
我把原有中断服务函数的标志位处理函数的顺序改了一下。
现在可以收到数据了,但是第一个数据经常出现跟帧 ...

根据现像,乱码一般是时钟配置问题。楼主检查下时钟配置。
党国特派员 回答时间:2015-1-16 10:56:34
HAL_UART_Receive_IT 不要放在HAL_UART_TxCpltCallback 里,放在主函数里,在初始化的时候调用,总之要在HAL_UART_Transmit_IT之前。
magnbudie 回答时间:2015-1-16 11:13:04
党国特派员 发表于 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:27
关注!
波特率降低测试
magnbudie 回答时间:2015-1-16 11:27:05
大秦正声 发表于 2015-1-16 11:25
关注!
波特率降低测试

9600木有问题!
大秦正声 回答时间:2015-1-16 11:30:37
通信距离有多远?用max3232?
党国特派员 回答时间:2015-1-16 11:37:47
本帖最后由 党国特派员 于 2015-1-16 11:40 编辑

HAL_UART_Receive_IT 只需要调用一次。
还有就是你的接收函数里都干了些什么,会不会时间超长了。
党国特派员 回答时间:2015-1-16 12:03:59
如果 是还出现数据溢出的话,那你就用HAL_UART_Receive_DMA吧,最好是双缓冲的。
dsjsjf 回答时间:2015-1-16 12:08:19
用户函数区处理时间太长
12345下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版