求助,HAL库函数 串口中断接收,求租执业药师证急急急急,加入悬赏

feiante 的ST L035进程贴(串口)-电子产品世界论坛
feiante 的ST L035进程贴(串口)
今天开始试验下串口,试验完成的功能:按下user按键,通过串口发送8个数据,当接收到串口助手发来的数据,并且第8位是0x08时,点亮led灯,如果第8位是0x09时,熄灭led灯。
试验步骤:
第一步:将上一篇的按键中断工程另保存为usart工程,用stm32cube MX配置端口,首先选择PA9为USART1_TX,PA10为USART1_RX。此时PA9和PA10是黄色的,这是因为还没有选择USART1工作模式。
第二步:选择USART模式:
如下图,选择USART1的Mode为异步方式,没有使用硬件流控制。
第三步:配置USART1相关参数,选择波特率为位数据位长度,无奇偶校验,1个停止位。
第四步:配置NVIC,考虑到使用串口接收中断,所以配置NVIC,使能串口中断。
第五步:开始编写程序
1、在main.c的while循环中加入接收中断程序
HAL_UART_Receive_IT(&huart1, RxData,8); /* 采用中断方式接收8个数据 *//
2、编写按键中断回调函数,当按下按键时,发送8个数据
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
& if (GPIO_Pin == GPIO_PIN_13)
& & & HAL_UART_Transmit(&huart1, TxData,8,10);
3、编写串口接收中断回调函数,当接收的数据的第8位为0x08,点亮led灯,当接收的数据第8位为0x09,熄灭led灯
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
&&&&if (RxData[7] == 0x08)
&&&&&&&&HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
&&&&if (RxData[7] == 0x09)
&&&&&&&&HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
我用USART2,直接用板子上下载程序的USB接口通信成功啦, 按你说的用USART1是不是要自己接个串口线啊?
是的,接PA9和PA10
在main.c的while循环中加入接收中断程序,HAL_UART_Receive_IT(&huart1, RxData,8); /* 采用中断方式接收8个数据 *//
我这样做了,但是只能接收到一次,接着就没反应了。中断处理函数也是这样写的。你知道原因么?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
&&&&if (RxData[7] == 0x08)
&&&&&&&&HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
&&&&if (RxData[7] == 0x09)
&&&&&&&&HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
串口实验还要继续啊!这个代码架构还不能应用于自己的项目里。
另 第一行第6个图标就是“插入代码”功能,这样分享的代码就非常舒服了。
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有有用过HAL库的串口中断接收的朋友吗 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 385|回复: 27
有用过HAL库的串口中断接收的朋友吗
在线时间5 小时
主题帖子精华
新手上路, 积分 48, 距离下一级还需 2 积分
新手上路, 积分 48, 距离下一级还需 2 积分
大家的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函数
我也只做了这几步,进入调试发现这个回掉函数不仅没起作用,连断点都设置不了,这是为什么呢?
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间5 小时
主题帖子精华
新手上路, 积分 48, 距离下一级还需 2 积分
新手上路, 积分 48, 距离下一级还需 2 积分
找到问题了 void USART3_IRQHandler(void)
&&HAL_UART_IRQHandler(&huart3);
如果在cube中设置了nvic的话这个函数会在-it.c里面自动写好
如果cube中没有设置nvic的话 这个函数要自己写 才能开启中断
在线时间70 小时
主题帖子精华
金牌会员, 积分 1241, 距离下一级还需 1759 积分
金牌会员, 积分 1241, 距离下一级还需 1759 积分
不会帮顶。。。。
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间214 小时
主题帖子精华
金牌会员, 积分 1685, 距离下一级还需 1315 积分
金牌会员, 积分 1685, 距离下一级还需 1315 积分
这个还真不清楚,断点调试用的很少
ST金币1519
在线时间150 小时
主题帖子精华
金牌会员, 积分 1822, 距离下一级还需 1178 积分
金牌会员, 积分 1822, 距离下一级还需 1178 积分
可以设置的,断点设置不了,可能是你配置不对,导致回调函数没有被调用
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间5 小时
主题帖子精华
新手上路, 积分 48, 距离下一级还需 2 积分
新手上路, 积分 48, 距离下一级还需 2 积分
可以设置的,断点设置不了,可能是你配置不对,导致回调函数没有被调用
嗯&&感觉是回调函数没有调用 被编译器优化了
在线时间63 小时
主题帖子精华
高级会员, 积分 872, 距离下一级还需 128 积分
高级会员, 积分 872, 距离下一级还需 128 积分
1:到串口的msp初始化函数中看看是否打开了串口中断
2:确定HAL_UART_Receive_IT是否被调用;
3:确定串口是否真的能接受到数据。
在HAL_UART_RxCpltCallback函数中再次调用HAL_UART_Receive_IT函数
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间180 小时
主题帖子精华
金牌会员, 积分 1243, 距离下一级还需 1757 积分
金牌会员, 积分 1243, 距离下一级还需 1757 积分
用过,之前是用串口中断模式接收一个字节的数据,回调函数里做帧头判断,然后再开启接收下一个字节。
结果只接收了第一个字节,然后就进不了回调函数了,后来调试判断出是数据溢出了。是因为接收第一个字节后,回调函数处理部分太大了,还没处理完下一个数据就来了。
后来我改成空闲中断。
在线时间5 小时
主题帖子精华
新手上路, 积分 48, 距离下一级还需 2 积分
新手上路, 积分 48, 距离下一级还需 2 积分
1:到串口的msp初始化函数中看看是否打开了串口中断
2:确定HAL_UART_Receive_IT是否被调用;
3:确定串口 ...
&&HAL_NVIC_SetPriority(USART3_IRQn, 0, 2);
&&HAL_NVIC_EnableIRQ(USART3_IRQn);
配置中断应该只有两句代码,是在HAL_UART_MspInit中调用?
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间5 小时
主题帖子精华
新手上路, 积分 48, 距离下一级还需 2 积分
新手上路, 积分 48, 距离下一级还需 2 积分
用过,之前是用串口中断模式接收一个字节的数据,回调函数里做帧头判断,然后再开启接收下一个字节。
嗯&&看了许多留言 说这个回调函数效率太低了
在线时间63 小时
主题帖子精华
高级会员, 积分 872, 距离下一级还需 128 积分
高级会员, 积分 872, 距离下一级还需 128 积分
HAL_NVIC_SetPriority(USART3_IRQn, 0, 2);
&&HAL_NVIC_EnableIRQ(USART3_IRQn);
配置中断应该只有两句 ...
你可以追踪下代码看看有没有被执行到
站长推荐 /1
本课程将涉及前后台系统的设计,详细分析RTOS的基本功能,包括内核调度机制,任务管理,中断管理,任务间的同步与通信机制等。
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by系统发生错误
系统发现一个错误,可能当前页面已失效或被删除!
您可以选择 [HAL库的串口中断问题 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 1509|回复: 7
HAL库的串口中断问题
在线时间7 小时
主题帖子精华
初级会员, 积分 86, 距离下一级还需 114 积分
初级会员, 积分 86, 距离下一级还需 114 积分
用cubemx生成的代码,如果想让MCU在串口接收数据时进入串口中断, 只有在调用HAL_UART_Receive_IT的同时接收到数据才能进入中断吗??
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
ST金币1464
在线时间740 小时
主题帖子精华
是的,新的HAL库和以前的略有不同
在线时间7 小时
主题帖子精华
初级会员, 积分 86, 距离下一级还需 114 积分
初级会员, 积分 86, 距离下一级还需 114 积分
是的,新的HAL库和以前的略有不同
那如果想要用串口中断打断正在运行的程序 , 就要反复调用这个函数吧?&&那岂不是太浪费时间了?
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间201 小时
主题帖子精华
金牌会员, 积分 2242, 距离下一级还需 758 积分
金牌会员, 积分 2242, 距离下一级还需 758 积分
在线时间223 小时
主题帖子精华
金牌会员, 积分 1059, 距离下一级还需 1941 积分
金牌会员, 积分 1059, 距离下一级还需 1941 积分
那如果想要用串口中断打断正在运行的程序 , 就要反复调用这个函数吧?&&那岂不是太浪费时间了? ...
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数的功能是设置接收中断的参数,以及使能接收中断。查看一下它的代码就明白了。
函数的第一个参数是串口实例句柄,第二个参数是用于存储接收数据的指针,第三个则是接收多少个数据之后调用接收完成回调函数HAL_UART_RxCpltCallback( )。
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间223 小时
主题帖子精华
金牌会员, 积分 1059, 距离下一级还需 1941 积分
金牌会员, 积分 1059, 距离下一级还需 1941 积分
本帖最后由 adlu 于
10:49 编辑
使用HAL库进行串口中断接收的基本步骤如下:
1.用CubeMX配置UART参数,包括使能UART接收中断,生成程序框架,这一步完成了UART的初始化
2.调用HAL_UART_Receive_IT( )使能接收中断,设置接收数据存储指针和接收数据量;
3.在HAL_UART_RxCpltCallback( )中编写数据处理代码。
在线时间223 小时
主题帖子精华
金牌会员, 积分 1059, 距离下一级还需 1941 积分
金牌会员, 积分 1059, 距离下一级还需 1941 积分
本帖最后由 adlu 于
10:57 编辑
对于刚使用HAL的用户,要理解它的回调机制并不容易。
可以参考下面这篇文章《使用STM32CubeMX实现中断模式下的串口收发》
还有版主netlhx的《nucleo教程之三:定个时》
欢迎加入STM32/STM8社区技术交流群:&7779516 & &STM32L系列开发群:
在线时间16 小时
主题帖子精华
初级会员, 积分 129, 距离下一级还需 71 积分
初级会员, 积分 129, 距离下一级还需 71 积分
站长推荐 /1
本课程将涉及前后台系统的设计,详细分析RTOS的基本功能,包括内核调度机制,任务管理,中断管理,任务间的同步与通信机制等。
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by}

我要回帖

更多关于 急急急 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信