【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;
}
}
}
}
不错不错哟
什么时候还是搞 H7 的 emwin 啊 ???
hpdell 发表于 2018-4-18 17:03
不错不错哟
什么时候还是搞 H7 的 emwin 啊 ???
官方的这个NUCLEO板子不支持显示屏,也没有带SDRAM,不太方面,后面倒是可以以太网虚拟一个显示屏用。 eric2013 发表于 2018-4-18 17:11
官方的这个NUCLEO板子不支持显示屏,也没有带SDRAM,不太方面,后面倒是可以以太网虚拟一个显示屏用。
期待哟 {:8:} mark 解决了困扰需求的743串口高速接收数据出错问题,谢谢:lol 大神 我用串口DMA收发接收和发送 的数据都是不能更改的是怎么回事 fengxiaoyu 发表于 2020-8-3 13:38
大神 我用串口DMA收发接收和发送 的数据都是不能更改的是怎么回事
注意Cache问题。 eric2013 发表于 2020-8-4 08:34
注意Cache问题。
恩,就是Cache问题,是不是用串口DMA收发就用不了Cache了。 按照这种方式设置还是不行,每次只能接收到1个数据,咋回事啊 lingbuweibu 发表于 2021-4-20 21:11
按照这种方式设置还是不行,每次只能接收到1个数据,咋回事啊
上传你的代码看看。 dma发送数据可以正常发送,但是整个while的执行周期变慢,不知道咋回事 lingbuweibu 发表于 2021-5-7 14:09
dma发送数据可以正常发送,但是整个while的执行周期变慢,不知道咋回事
HSE_VALUE大小和你板子实际晶振大小一致吧,PLL配置后的主屏也没问题吧,如果这都没有问题,那就没问题。
我用你们的V7开发板,有办法做到只用DMA中断,而不用串口中断来接收串口数据吗?我串口接的激光雷达,只要发送了开始数据传输后,串口就一直以接收数据,大概7000个字节每秒,用串口接后中断或空闲中断,中断次数太多。
我移植了你这个例子,将DMA发送关掉,串口中断关掉,只保留DMA接收中断。正常模式。每次都是只能进入中断一次,之后再进行DMA接收HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, 10240);,就收不到数据了,也进不了中断.仿真发现串口RDR没有新的数据进来,但逻辑分析仪一直可以正常抓到数据,说明总线上是有数据的。串口ISR寄存器有溢出错误,在while循环内清除ISR寄存器,可以看到RDR上会进来一个数据,然后再清除一次,进来一个。
请问有遇到过类似的问题吗?
有什么解决方法,或参考例程吗? 大神,有没有LL库的教程 兔子 发表于 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
(出处: 硬汉嵌入式论坛)
HAL_UART_Transmit_DMA发送数据,第一次正常,第二次发送完后就会报usage fault: SCB_CFSR_UFSR:0x01 UNDEFINSTR 这种错误,是什么原因?
例程下载不了了 lingbuweibu 发表于 2021-4-20 21:11
按照这种方式设置还是不行,每次只能接收到1个数据,咋回事啊
我遇到了和你一样的情况,请问解决了?
Qasd 发表于 2024-4-24 12:42
例程下载不了了
例程下载正常,是不是你的浏览器阻拦,同意下载即可。 C:\Users\123\Pictures\Screenshots 本帖最后由 xcn学stm32 于 2024-5-15 15:45 编辑
eric2013 发表于 2024-4-24 14:08
例程下载正常,是不是你的浏览器阻拦,同意下载即可。
重启了可以下载了
串口加DMA发送可以,但是就是接收不到数据怎么回事啊,用中断接收就可以 1316146602 发表于 2024-5-16 10:35
串口加DMA发送可以,但是就是接收不到数据怎么回事啊,用中断接收就可以
MPU/Cache不影响数据的发送和接收,影响的是数据的一致性问题。
很大概率是DMA串口的配置问题,比如接收10个字符才会触发DMA传输完成,测试的时候是发送的10个字符不。 eric2013 发表于 2024-5-17 08:47
MPU/Cache不影响数据的发送和接收,影响的是数据的一致性问题。
很大概率是DMA串口的配置问题,比如接 ...
串口的空闲中断可以触发,DMA的接收中断打开的话也可以触发,但是就是没有数据 Qasd 发表于 2024-4-24 12:43
我遇到了和你一样的情况,请问解决了?
你解决了吗 eric2013 发表于 2024-5-17 08:47
MPU/Cache不影响数据的发送和接收,影响的是数据的一致性问题。
很大概率是DMA串口的配置问题,比如接 ...
我是用电脑发送的,发送的绝对也有10个,可以触发,但是就是没有数据
页:
[1]