硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2802|回复: 9
收起左侧

[DMA] H7使用DMA传输外设数据到memory,内存首地址为0x24000350,但是内存数据无法改变

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2021-5-4 18:26:40 | 显示全部楼层 |阅读模式
H7使用DMA传输外设数据到memory,内存地址为0x24000350,但是内存0x24000350到0x2400035f的数据无法随外设数据改变。使用SCB_CleanInvalidateDCache_by_Addr或者SCB_CleanInvalidateDCache都无法刷新内存数据。关闭Cache后,内存0x24000350到0x2400035f的数据随外设数据改变。该内存使用malloc申请,空间大小10个字节,返回uint16_t *。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-5-5 09:16:30 | 显示全部楼层
基础操作,按说没什么问题,上程序看看。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2021-5-5 15:45:08 | 显示全部楼层
eric2013 发表于 2021-5-5 09:16
基础操作,按说没什么问题,上程序看看。

uint16_t *p = NULL;

void main()
{
     p = (uint16_t *)malloc(10);
     HAL_DMA_Start(&DmaHandle,GPIOH_BASE,p,3);

    while(1)
    {
          SCB_CleanDCache_by_Addr((uint32_t *) p, 10);

          for(uint8_t i = 0; i < 5; i++)
          {
               printf("%x\r\n",p);
          }
         
          HAL_Delay(10);
    }
}

你好!代码逻辑就是这样子,DMA使用循环模式,有外设触发就将数据传到内存中,怀疑是内存地址对齐问题,但是又不知道malloc申请的内存地址怎么对齐
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-5-6 07:37:48 | 显示全部楼层
阿亮之家 发表于 2021-5-5 15:45
uint16_t *p = NULL;

void main()

稍完整点的程序,程序太少,看不出问题来。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2021-5-6 08:52:03 | 显示全部楼层
eric2013 发表于 2021-5-6 07:37
稍完整点的程序,程序太少,看不出问题来。

别的程序就剩初始化dma和触发源了,配置程序没问题。如果不使能Cache,数据传输正常,但是使用Cache后,有一部分内存数据无法与实际数据统一。怀疑是申请空间地址没有做32字节对齐,影响了SCB_CleanInvalidateDCache_by_Addr函数的功能。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2021-5-6 09:16:32 | 显示全部楼层
eric2013 发表于 2021-5-6 07:37
稍完整点的程序,程序太少,看不出问题来。

你好!我还想请教malloc申请的空间地址怎么做32字节对齐,我看例程上使用ALIGN_32BYTES初始化数组,但是我现在使用malloc申请空间,能不能也用ALIGN_32BYTES对齐?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-5-6 09:30:00 | 显示全部楼层
阿亮之家 发表于 2021-5-6 08:52
别的程序就剩初始化dma和触发源了,配置程序没问题。如果不使能Cache,数据传输正常,但是使用Cache后, ...

首先这句就有点小问题
HAL_DMA_Start(&DmaHandle,GPIOH_BASE,p,3);执行后,在不知道DMA是否执行完毕的情况下,直接执行SCB_CleanDCache_by_Addr((uint32_t *) p, 10);
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2021-5-6 09:49:44 | 显示全部楼层
eric2013 发表于 2021-5-6 09:30
首先这句就有点小问题
HAL_DMA_Start(&DmaHandle,GPIOH_BASE,p,3);执行后,在不知道DMA是否执行完毕的 ...

这种会出现固定地址数据无法刷新的问题吗?按道理这种可能会出现不固定地址的数据不一致问题,但是应该不会出现固定地址内数据无法刷新的问题。我现在的现象是固定地址的数据不变。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106934
QQ
发表于 2021-5-6 10:28:21 | 显示全部楼层
阿亮之家 发表于 2021-5-6 09:49
这种会出现固定地址数据无法刷新的问题吗?按道理这种可能会出现不固定地址的数据不一致问题,但是应该不 ...

这就是前面说的问题了,你的代码贴的不全。

你的配置的地址空间开Cache了,是读Cache和写Cache都开了,还是仅开了读Cache
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2021-5-6 13:59:42 | 显示全部楼层
eric2013 发表于 2021-5-6 10:28
这就是前面说的问题了,你的代码贴的不全。

你的配置的地址空间开Cache了,是读Cache和写Cache都开了 ...

ALIGN_32BYTES(uint16_t *p) = NULL;
DMA_HandleTypeDef DmaHandle         = {0};  /* DMA句柄 */

void main ()
{
    /* Enable I-Cache */
    SCB_EnableICache();

    /* Enable D-Cache */
    SCB_EnableDCache();

        /* HAL初始化 */
        HAL_Init();

        /* 时钟初始化 */
        SystemClock_Config();

        DMA_Init();

     p = (uint16_t *)malloc(10);
     HAL_DMA_Start(&DmaHandle,GPIOH_BASE,p,3);

    while(1)
    {
          SCB_CleanDCache_by_Addr((uint32_t *) p, 10);

          for(uint8_t i = 0; i < 5; i++)
          {
               printf("%x\r\n",p);
          }
         
          HAL_Delay(10);
    }
}

void DMA_Init(void)
{

    DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    DmaHandle.Init.MemDataAlignment    = DMA_PDATAALIGN_HALFWORD;
    DmaHandle.Instance       = DMA1_Stream0;
    DmaHandle.Init.Request   = DMA_REQUEST_TIM1_TRIG;
    DmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY;
    DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;
    DmaHandle.Init.MemInc    = DMA_MINC_ENABLE;
    DmaHandle.Init.Mode      = DMA_CIRCULAR;
    DmaHandle.Init.Priority  = DMA_PRIORITY_VERY_HIGH;
    DmaHandle.Init.FIFOMode  = DMA_FIFOMODE_DISABLE;
    Assert (HAL_DMA_Init(&DmaHandle) != HAL_OK);

    __HAL_LINKDMA(&TimHandle,hdma[TIM_DMA_ID_TRIGGER],DmaHandle);
}

DMA配置和主函数测试代码如上。硬件会有方波作为触发源,触发DMA传输。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-10 14:56 , Processed in 0.187826 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表