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

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

[复制链接]
ss1969 提问时间:2016-1-24 00:24 /
本帖最后由 ss1969 于 2016-1-26 17:31 编辑

为何HAL_UART_Transmit可发送,改成HAL_UART_Transmit_IT就不行了
cube配置的stm32f407系统
其他代码均一样

        while(HAL_OK != HAL_UART_Transmit_IT(DEFAULT_UART, (uint8_t*)UartTxBuffer, index));    //不行
        while(HAL_OK != HAL_UART_Transmit(DEFAULT_UART, (uint8_t*)UartTxBuffer, index, 0xFFFF));  //可以




----
搞定,见21楼
收藏 评论26 发布时间:2016-1-24 00:24

举报

26个回答
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.     }
复制代码
ss1969 回答时间:2016-1-25 10:08:13
回到未来~ 发表于 2016-1-25 08:41
可以把代码传上来或者截图大家好看下,另外你板子用的是哪个?

板子是某stm32的开发板,因为是别人给我的,恕我直言,真不知道是什么型号,只知道是F407

代码如下,自写xprintf:


int xprintf(const char *format, ...)
{
        unsigned int index = 0;
        int k;
        va_list marker;

        /* the first parameter location is after passing format
         */
        va_start(marker, format);

        /* wait until Tx Available
        translate into string - vxprintf
         */
        UartCheckTxAvailable();

        k = vxprintf(UartTxBuffer, &index, format, marker);
        va_end(marker);

        /* put out to uart
        */
//        while(HAL_OK != HAL_UART_Transmit_IT(DEFAULT_UART, (uint8_t*)UartTxBuffer, index));
        while(HAL_OK != HAL_UART_Transmit(DEFAULT_UART, (uint8_t*)UartTxBuffer, index, 0xFFFF));
        UartSetTxAvailable();

        return k;
}
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。
mark0668 回答时间:2016-1-24 12:49:30
改为中断发送,首先你开启串口的中断没有?
ss1969 回答时间:2016-1-24 18:06:54
mark0668 发表于 2016-1-24 12:49
改为中断发送,首先你开启串口的中断没有?

开启了的,USART1 global interrupt有勾选(Cube里面只有这一个)
同时RX用中断方式接受无问题。
回到未来~ 回答时间:2016-1-25 08:41:46
可以把代码传上来或者截图大家好看下,另外你板子用的是哪个?
watershade 回答时间:2016-1-25 09:08:52
当然不行,应该在IT里面写中断处理程序
回到未来~ 回答时间:2016-1-25 10:11:10
ss1969 发表于 2016-1-25 10:08
板子是某stm32的开发板,因为是别人给我的,恕我直言,真不知道是什么型号,只知道是F407

代码如下,自 ...

你只有这段代码没用啊,UartSetTxAvailable(); 是要干嘛?初始化怎么处理的?配置怎么处理的,建议还是从基础多练习几个例程吧,使用HAL库的话不管你用什么板子只要配置好了,应该都没问题的
ss1969 回答时间:2016-1-25 10:11:18
watershade 发表于 2016-1-25 09:08
当然不行,应该在IT里面写中断处理程序

中断模式发送,只是在IT Handler里面设置成可以再次调用吧?
而且就算我没有在HAL_UART_TxCpltCallback里面处理后续,第一次也肯定应该发送得出去才对。。
但是第一次也必然发不出

同时rx一切正常,中断里面一次抓一个,enqueue
xmshao 回答时间:2016-1-25 10:45:43
楼主 其实那两个函数并不一样。

上面各位的建议都非常 好,看看注释,借助例程自己捣鼓几下就知道差别了。
废鱼 回答时间:2016-1-25 11:06:16
仿真一下,进入串口发送以后,周到哪一步出的错。
watershade 回答时间:2016-1-25 22:21:07
ss1969 发表于 2016-1-25 10:11
中断模式发送,只是在IT Handler里面设置成可以再次调用吧?
而且就算我没有在HAL_UART_TxCpltCallback里 ...

我看错了,你说的对。你确定中断设置的对吗?
watershade 回答时间:2016-1-25 22:26:28
ss1969 发表于 2016-1-25 10:11
中断模式发送,只是在IT Handler里面设置成可以再次调用吧?
而且就算我没有在HAL_UART_TxCpltCallback里 ...

我之前做过一个虚拟串口的,觉得程序写得也对,就是调不通,每次接受到的数也都正常但是发送出去被电脑串口终端接收就不成。后来发觉是串口终端的问题。但是推测你这个不是这个原因。你在调试的时候时钟卡在while那个地方吗?还是while那个地方已经过去了,但是收不到数据?
ss1969 回答时间:2016-1-25 23:32:22
回到未来~ 发表于 2016-1-25 10:11
你只有这段代码没用啊,UartSetTxAvailable(); 是要干嘛?初始化怎么处理的?配置怎么处理的,建议还是从 ...

UartSetTxAvailable 取mutex而已,后面是give mutex
初始化都是用的cubemx生成的,配置你要说有问题吧,直接block的函数发送又是正常的
说中断配置有问题吧,rx中断又是正常的,rx也是用中断收的。
ss1969 回答时间:2016-1-25 23:33:52
xmshao 发表于 2016-1-25 10:45
楼主 其实那两个函数并不一样。

上面各位的建议都非常 好,看看注释,借助例程自己捣鼓几下就知道差别了。 ...

我已经读过函数的说明了,例程没有找到完全可用的,都只是代码片段
而且似乎都是直接用_IT函数发送就成功了,没人提到不行

再次强调,我rx中断方式ok,tx 非中断也ok!
ss1969 回答时间:2016-1-25 23:36:26
安 发表于 2016-1-25 11:06
仿真一下,进入串口发送以后,周到哪一步出的错。

手里只有stlink可以仿真吗?

顺便请教这个函数是否是 先填好内容,最后到
    /* Enable the UART Transmit data register empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_TXE);

这里启动发送过程?
12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版