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

STM32H7串口DMA无法使用

[复制链接]
理塘djent 提问时间:2024-6-18 16:01 / 已解决

求助一个很奇怪的问题:

用STM32H7A3ZIT6的串口的DMA模式发送数据时,如果发送缓冲是常量,则可以正常发送;如果是变量,则无法发送,返回值是HAL_OK,但是电脑端没有收到任何数据。

HAL_UART_Transmit_DMA(&huart2, "Hello", 5); //成功发送

HAL_UART_Transmit_DMA(&huart2, buffer, 5); //无法发送

怀疑是MPU导致DMA无法访问内存,但配置全部允许访问后仍有这个问题

image.png

求助,真的不知道是哪里出问题了😕

收藏 评论6 发布时间:2024-6-18 16:01

举报

6个回答
理塘djent 回答时间:2024-6-18 23:09:18

已经解决了。我的缓冲区地址0x20000000,在DTCM RAM区,DMA无法访问。把缓冲区定义到0x24000000就可以了

/ STM32H7A3ZITxQ_FLASH.ld /

/* Specify the memory areas */
MEMORY
{
DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
RAM (xrw)      : ORIGIN = 0x24000000, LENGTH = 1024K
ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K
DMA_AREA (rw) : ORIGIN = 0x24000000, LENGTH = 4K
}

/* Define output sections */
SECTIONS
{
  .my_section :
  {
    . = ALIGN(4);
    *(.my_section)
    . = ALIGN(4);
  } > DMA_AREA

/ main.c /

uint8_t buffer[1024] = "Hello" __attribute__((section(".my_section")));

wenyangzeng 回答时间:2024-6-18 16:27:58

buffer必须是一个数组:uint8_t buffer[]="Hello";

理塘djent 回答时间:2024-6-18 16:33:38

wenyangzeng 发表于 2024-6-18 16:27
buffer必须是一个数组:uint8_t buffer="Hello";

buffer我定义的是全局变量

char buffer[1024] = "Hello";

wenyangzeng 回答时间:2024-6-18 20:33:02

数组应该这样赋值吧,需要字符串结束符:

uint8_t buffer[] = "Hello\r\n";

HAL_UART_Transmit_DMA(&huart2, buffer, 7);

xmshao 回答时间:2024-6-19 09:11:03
我觉得很可能是Hello放在了通用DMA访问不到的地方,比方TCM-RAM区域。
这个是编译器自动帮你安排的。


你可以将你的buffer指定其存储空间到DTCM区域试试,很快可以验证。


你现在怀疑MPU配置方面的原因,你可以将DCache关闭后进行验证,如果问题依旧说明
就不是MPU方面的原因。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版