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

cubemx配置的串口中断发送HAL_UART_Transmit_IT问题(搞定见#21)

[复制链接]
ss1969 提问时间:2016-1-24 00:24 /
阅读主题, 点击返回1楼
收藏 评论26 发布时间:2016-1-24 00:24
26个回答
ss1969 回答时间:2016-1-26 17:30:49
大概搞清楚了问题所在。。。还是直接跟踪代码最靠谱。
详细解释如下:

首先我先做好的是非中断模式的处理,因为用了一个buffer做xprintf的格式解析,所以做了一个mutex来保护;
然后改成中断函数发送之后。。。。出问题就是因为这个mutex在TX End ISR里面做give不行。。改成giveSemaphoreFromISR也不行(这有点奇怪,尚不知原因)
最后必须用网上例程那种简单的int变量来阻塞才行(TX ISR直接把这个int设1)。

还有一点比较奇怪的就是,CubeMX配置的FreeRTOS工程,即使按照上面的说法用中断方式,在main.c里面*连续*调用2次中断函数发送就会失败,原因是第二次调用发送函数之前,取状态while(busy=SET){}的时候,会一直卡住,第一次发送的完成中断直接无法进入,就无法把busy设成UNSET。在StartDefaultTask里面发送就没有问题。这点也需要高人解惑。如果只调用1次就没问题,第二次call之前一定能够把busy设为UNSET。
ss1969 回答时间:2016-1-26 17:31:43
watershade 发表于 2016-1-26 09:31
我用401做一个实验一下

搞定,见21楼
ss1969 回答时间:2016-1-26 17:31:58
mr.hs 发表于 2016-1-26 15:43
还有其实重定向比这个好用

请举例说一下重定向是怎么做的呢?
田边人 回答时间:2017-9-20 09:47:10
ss1969 发表于 2016-1-26 17:30
大概搞清楚了问题所在。。。还是直接跟踪代码最靠谱。
详细解释如下:

互斥信号量只能用在任务之间,不能用在中断服务函数内,你可以试试其他信号量!!
moneng 回答时间:2018-10-11 16:24:48
  1.     HAL_UART_Transmit_IT(UARTx, (uint8_t*)buffer_it, strlen(buffer_it));
  2.    
  3.     while(UARTx->gState != HAL_UART_STATE_READY)
  4.     {
  5.         Delay_ms(10);
  6.     }
复制代码
ppgpos 回答时间:2020-3-24 18:09:47
ppgpos 回答时间:2020-3-24 18:14:51
那位老哥说的对
  1. HAL_UART_Transmit_IT(&huart1, (uint8_t *)Buffer, (uint16_t)strlen(Buffer));
  2.         while(huart1.gState != HAL_UART_STATE_READY)
  3.                 osDelay(1);
复制代码

这样就可以,但如果HAL_UART_STATE_READY的判断在发送的前面就不行,醉了
123

所属标签

相似问题

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