eric2013 发表于 2018-4-18 09:50:41

【STM32H743实验例程】实验14:STM32H743串口DMA方式收发,DMA方式问题比较多,要注意数据一致性

实验介绍
开发平台:官方STM32H743 NUCLEO板子
开发环境:MDK5.25正式版
软件版本:
(1)CMSIS软件包 V5.3.0
(2)H7的HAL库版本 V1.2.0

例程说明:

   DMA使用的memory空间使能了Cache的话,空间要做32位字节对齐。同时为了保持数据一致性
   1、AXI RAM空间MPU直接设置为WT模式。
   2、DMA接收后,使用函数SCB_InvalidateDCache_by_Addr做接收缓冲区无效化。
   
   正常情况下,二选一即可,实际测试都不选也能使用,估计是没有被Cache缓存,如果缓存了的话,要注意。


例程下载:

http://www.armbbs.cn/static/image/hrline/4.gif

#if1
      ALIGN_32BYTES(__attribute__((section (".RAM_D2"))) uint8_t aRxBuffer) = "ARM";
#else
      __attribute__((section(".RAM_D2"))) uint8_t tt= 20;
      __attribute__((section(".RAM_D2"))) uint8_t aRxBuffer = "KEY_DOWN_K1\r\n";
#endif


/*
*********************************************************************************************************
*      函 数 名: main
*      功能说明: 标准c程序入口。
*      形    参: 无
*      返 回 值: 无
*********************************************************************************************************
*/
int main(void)
{      
      uint8_t ucKeyCode;                /* 按键代码 */
      
      
      bsp_Init(); /* 外设初始化 */

      bsp_StartAutoTimer(0, 100);      /* 启动1个100ms的自动重装的定时器 */      
      
      HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, 5);
      while (1)
      {
                bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */

                if (bsp_CheckTimer(0))      /* 判断定时器超时时间 */
                {
                        /* 每隔100ms 进来一次 */
                        bsp_LedToggle(1);                        
                }
               
                if(g_ucRecieveFlag == 1)
                {
                        g_ucRecieveFlag = 0;
                        bsp_LedToggle(3);
                        
                        /* 设置新的接收,并将接收到发送回去 */
                        /* CPU访问前,将Cache对应的区域无效化 */
                        SCB_InvalidateDCache_by_Addr ((uint32_t *)aRxBuffer, 5);
                        HAL_UART_Transmit_DMA(&UartHandle, aRxBuffer, 5);
                        HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, 5);
                }
               
                /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
                ucKeyCode = bsp_GetKey();      /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
                if (ucKeyCode != KEY_NONE)
                {
                        switch (ucKeyCode)
                        {
                              case KEY_DOWN_K1:                        /* K1键按下 */
                                        HAL_UART_Transmit_DMA(&UartHandle, aRxBuffer, 13);
                                        bsp_LedToggle(2);
                                        break;

                              case KEY_UP_K1:                              /* K1键弹起 */
                                        bsp_LedToggle(2);
                                        break;

                              case KEY_LONG_K1:                        /* K1长按   */
                                        printf("K1按键长按\r\n");
                                        break;

                              default:
                                        /* 其它的键值不处理 */
                                        break;
                        }
                }
      }
}

hpdell 发表于 2018-4-18 17:03:59

不错不错哟
什么时候还是搞 H7 的 emwin 啊 ???

eric2013 发表于 2018-4-18 17:11:23

hpdell 发表于 2018-4-18 17:03
不错不错哟
什么时候还是搞 H7 的 emwin 啊 ???

官方的这个NUCLEO板子不支持显示屏,也没有带SDRAM,不太方面,后面倒是可以以太网虚拟一个显示屏用。

hpdell 发表于 2018-4-19 15:34:11

eric2013 发表于 2018-4-18 17:11
官方的这个NUCLEO板子不支持显示屏,也没有带SDRAM,不太方面,后面倒是可以以太网虚拟一个显示屏用。

期待哟

xiaomeng 发表于 2019-11-21 20:02:32

{:8:} mark

北极星945 发表于 2020-4-6 18:38:23

解决了困扰需求的743串口高速接收数据出错问题,谢谢:lol

fengxiaoyu 发表于 2020-8-3 13:38:53

大神 我用串口DMA收发接收和发送 的数据都是不能更改的是怎么回事

eric2013 发表于 2020-8-4 08:34:01

fengxiaoyu 发表于 2020-8-3 13:38
大神 我用串口DMA收发接收和发送 的数据都是不能更改的是怎么回事

注意Cache问题。

fengxiaoyu 发表于 2020-8-4 08:44:25

eric2013 发表于 2020-8-4 08:34
注意Cache问题。

恩,就是Cache问题,是不是用串口DMA收发就用不了Cache了。

lingbuweibu 发表于 2021-4-20 21:11:37

按照这种方式设置还是不行,每次只能接收到1个数据,咋回事啊

eric2013 发表于 2021-4-21 08:16:36

lingbuweibu 发表于 2021-4-20 21:11
按照这种方式设置还是不行,每次只能接收到1个数据,咋回事啊

上传你的代码看看。

lingbuweibu 发表于 2021-5-7 14:09:07

dma发送数据可以正常发送,但是整个while的执行周期变慢,不知道咋回事

eric2013 发表于 2021-5-8 08:19:26

lingbuweibu 发表于 2021-5-7 14:09
dma发送数据可以正常发送,但是整个while的执行周期变慢,不知道咋回事

HSE_VALUE大小和你板子实际晶振大小一致吧,PLL配置后的主屏也没问题吧,如果这都没有问题,那就没问题。

augustedward 发表于 2021-9-19 15:49:41

我用你们的V7开发板,有办法做到只用DMA中断,而不用串口中断来接收串口数据吗?我串口接的激光雷达,只要发送了开始数据传输后,串口就一直以接收数据,大概7000个字节每秒,用串口接后中断或空闲中断,中断次数太多。
我移植了你这个例子,将DMA发送关掉,串口中断关掉,只保留DMA接收中断。正常模式。每次都是只能进入中断一次,之后再进行DMA接收HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, 10240);,就收不到数据了,也进不了中断.仿真发现串口RDR没有新的数据进来,但逻辑分析仪一直可以正常抓到数据,说明总线上是有数据的。串口ISR寄存器有溢出错误,在while循环内清除ISR寄存器,可以看到RDR上会进来一个数据,然后再清除一次,进来一个。
请问有遇到过类似的问题吗?
有什么解决方法,或参考例程吗?

兔子 发表于 2022-9-29 15:03:48

大神,有没有LL库的教程

eric2013 发表于 2022-9-29 16:16:26

兔子 发表于 2022-9-29 15:03
大神,有没有LL库的教程

就看HAL的就行,HAL本身不是孤立的,很多外设都要HAL调用LL的API

有时间可以看下这期视频教程:

BSP视频教程第20期:串口专题之玩转HAL库,LL库和寄存器方式实现方法以及参考手册几个关键时序图学习(2022-07-16)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=113987&fromuid=58
(出处: 硬汉嵌入式论坛)

ajijie123 发表于 2024-2-7 10:41:52

HAL_UART_Transmit_DMA发送数据,第一次正常,第二次发送完后就会报usage fault: SCB_CFSR_UFSR:0x01 UNDEFINSTR 这种错误,是什么原因?

Qasd 发表于 2024-4-24 12:42:26

例程下载不了了

Qasd 发表于 2024-4-24 12:43:32

lingbuweibu 发表于 2021-4-20 21:11
按照这种方式设置还是不行,每次只能接收到1个数据,咋回事啊

我遇到了和你一样的情况,请问解决了?

eric2013 发表于 2024-4-24 14:08:28

Qasd 发表于 2024-4-24 12:42
例程下载不了了

例程下载正常,是不是你的浏览器阻拦,同意下载即可。

xcn学stm32 发表于 7 天前

C:\Users\123\Pictures\Screenshots

xcn学stm32 发表于 7 天前

本帖最后由 xcn学stm32 于 2024-5-15 15:45 编辑

eric2013 发表于 2024-4-24 14:08
例程下载正常,是不是你的浏览器阻拦,同意下载即可。
重启了可以下载了

1316146602 发表于 6 天前

串口加DMA发送可以,但是就是接收不到数据怎么回事啊,用中断接收就可以

eric2013 发表于 5 天前

1316146602 发表于 2024-5-16 10:35
串口加DMA发送可以,但是就是接收不到数据怎么回事啊,用中断接收就可以

MPU/Cache不影响数据的发送和接收,影响的是数据的一致性问题。

很大概率是DMA串口的配置问题,比如接收10个字符才会触发DMA传输完成,测试的时候是发送的10个字符不。

1316146602 发表于 5 天前

eric2013 发表于 2024-5-17 08:47
MPU/Cache不影响数据的发送和接收,影响的是数据的一致性问题。

很大概率是DMA串口的配置问题,比如接 ...

串口的空闲中断可以触发,DMA的接收中断打开的话也可以触发,但是就是没有数据

1316146602 发表于 5 天前

Qasd 发表于 2024-4-24 12:43
我遇到了和你一样的情况,请问解决了?

你解决了吗

1316146602 发表于 5 天前

eric2013 发表于 2024-5-17 08:47
MPU/Cache不影响数据的发送和接收,影响的是数据的一致性问题。

很大概率是DMA串口的配置问题,比如接 ...

我是用电脑发送的,发送的绝对也有10个,可以触发,但是就是没有数据
页: [1]
查看完整版本: 【STM32H743实验例程】实验14:STM32H743串口DMA方式收发,DMA方式问题比较多,要注意数据一致性