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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版