硬汉嵌入式论坛

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

[ADC] 参考dma双缓冲AD7706读adc数据,数据不更新

[复制链接]

7

主题

20

回帖

41

积分

新手上路

积分
41
发表于 2022-10-10 14:52:36 | 显示全部楼层 |阅读模式
使用的是H7B0   adc用的是ads8556


内存是这样弄的
LR_IROM1 0x08000000 0x00020000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00020000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  
  ;RW data - 128KB DTCM
  RW_IRAM1 0x20000000 0x00020000  {
   .ANY (+RW +ZI)
  }
  
  ;RW data - 1024KB AX1 SRAM
  RW_IRAM2 0x24000000 0x00100000  {
   *(.RAM_D1)
  }
  
  ;RW data - 64KB SRAM1(0x30000000) + 64KB SRAM2(0x30010000)
  RW_IRAM3 0x30000000 0x00020000  {
   *(.RAM_D2)
  }
  
  ;RW data - 32KB SRD_SRAM(0x38000000)
  RW_IRAM4 0x38000000 0x00008000  {
   *(.RAM_D3)
  }
}

RAM_D1用来做显存
dma没法直接操作RW_IRAM1

所以 adc_buff 定义到 D2

__attribute__((section (".RAM_D2"))) int8_t adc_buff[16];

HAL_DMA_Start_IT(&TIMDMA, (uint32_t)0x60000000, (uint32_t)adc_buff, 16);

开始获取数据
但是出现了一个问题  在软件开始初始化 数组adc_buff 为0后 DMA不会把数据放进去 数组里面数据全是0
不对 adc_buff 做初始化处理 通过MDK 在线观察 adc_buff 一直更新
在 回调函数中 对 adc_buff 进行搬运  又出现 adc_buff只显示1次 后面不更新了

把 关于 adc_buff处理 的地方注释掉不做任何处理又可以实时更新了

不知道那个地方设置不对 求教

fmc用的是8bit总线


dma配置参考的例子
    /* 定时器UP更新触发DMA传输 */        
    TIMDMA.Instance                 = DMA1_Stream2;      /* 例化使用的DMA数据流 */
    TIMDMA.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;     /* 使能FIFO*/
    TIMDMA.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL; /* 用于设置阀值 */
    TIMDMA.Init.MemBurst            = DMA_MBURST_INC8;           /* 用于存储器突发 */
    TIMDMA.Init.PeriphBurst         = DMA_PBURST_INC8;           /* 用于外设突发 */
    TIMDMA.Init.Request             = DMA_REQUEST_TIM5_UP;     /* 请求类型 - TIM5_up */  
    TIMDMA.Init.Direction           = DMA_PERIPH_TO_MEMORY;    /* 传输方向是从外设到存储器 */  
    TIMDMA.Init.PeriphInc           = DMA_PINC_DISABLE;        /* 外设地址自增禁止 */
    TIMDMA.Init.MemInc              = DMA_MINC_ENABLE;         /* 存储器地址自增使能 */  
    TIMDMA.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; /* 外设数据传输位宽选择字节,即8bit */
    TIMDMA.Init.MemDataAlignment    = DMA_PDATAALIGN_BYTE; /* 存储器数据传输位宽选字节,即8bit */   
    TIMDMA.Init.Mode                = DMA_CIRCULAR;            /* 循环模式 */
    TIMDMA.Init.Priority            = DMA_PRIORITY_LOW;        /* 优先级低 */



/* DMA传输完成回调函数 */
void adc_dma_call_back(DMA_HandleTypeDef *hdma)
{
    TIM_HandleTypeDef TimHandle = {0};

    TimHandle.Instance = TIM5;

    adc_list[0][sample_cnt] = adc_buff[8] + (adc_buff[9] << 8);
    adc_list[1][sample_cnt] = adc_buff[10] + (adc_buff[11] << 8);
    adc_list[2][sample_cnt] = adc_buff[12] + (adc_buff[13] << 8);
    adc_list[3][sample_cnt] = adc_buff[14] + (adc_buff[15] << 8);

    sample_cnt++;
    if(sample_cnt == SAMPLE_LEN)
    {
        sample_cnt = 0;
        HAL_TIM_PWM_Stop(&TimHandle, TIM_CHANNEL_1);
    }
}

/* DMA半传输完成回调函数 */
void adc_dma_half_call_back(DMA_HandleTypeDef *hdma)
{
    adc_list[0][sample_cnt] = adc_buff[0] + (adc_buff[1] << 8);
    adc_list[1][sample_cnt] = adc_buff[2] + (adc_buff[3] << 8);
    adc_list[2][sample_cnt] = adc_buff[4] + (adc_buff[5] << 8);
    adc_list[3][sample_cnt] = adc_buff[6] + (adc_buff[7] << 8);
    sample_cnt++;
}


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2022-10-10 15:21:42 | 显示全部楼层
你的这个D2域的SRAM时钟使能了没,要优先使能,不使能会有一些奇葩问题。
回复

使用道具 举报

7

主题

20

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2022-10-10 17:00:06 | 显示全部楼层
eric2013 发表于 2022-10-10 15:21
你的这个D2域的SRAM时钟使能了没,要优先使能,不使能会有一些奇葩问题。

/****************************************************************************************************/
/**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow :
  *            System Clock source            = PLL (HSE)
  *            SYSCLK(Hz)                     = 280000000 (CPU Clock)
  *            HCLK(Hz)                       = 280000000 (AXI and AHBs Clock)
  *            AHB Prescaler                  = 1 (AHB  Clock  280MHz)
  *            D1 APB3 Prescaler              = 2 (APB3 Clock  140MHz)
  *            D2 APB1 Prescaler              = 2 (APB1 Clock  140MHz)
  *            D2 APB2 Prescaler              = 2 (APB2 Clock  140MHz)
  *            D3 APB4 Prescaler              = 2 (APB4 Clock  140MHz)
  *            HSE Frequency(Hz)              = 25000000
  *            PLL_M                          = 5
  *            PLL_N                          = 112
  *            PLL_P                          = 2
  *            PLL_Q                          = 2
  *            PLL_R                          = 2
  *            VDD(V)                         = 3.3
  *            Flash Latency(WS)              = 7
  * @param  None
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  
  /** Supply configuration update enable
  */
  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 5;
  RCC_OscInitStruct.PLL.PLLN = 112;
  RCC_OscInitStruct.PLL.PLLP = 2;
  RCC_OscInitStruct.PLL.PLLQ = 2;
  RCC_OscInitStruct.PLL.PLLR = 2;
  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  RCC_OscInitStruct.PLL.PLLFRACN = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
  {
    Error_Handler(__FILE__, __LINE__);
  }

        __HAL_RCC_D2SRAM1_CLK_ENABLE();
        __HAL_RCC_D2SRAM2_CLK_ENABLE();

}

这样使能了 也不行   还是不能对 adc_buff 进行操作

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2022-10-10 17:18:03 | 显示全部楼层
调整状态看下DMA的NDTR寄存器更新不
回复

使用道具 举报

7

主题

20

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2022-10-10 19:27:23 | 显示全部楼层
eric2013 发表于 2022-10-10 17:18
调整状态看下DMA的NDTR寄存器更新不

ndtr 一直循环变化  
回复

使用道具 举报

7

主题

20

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2022-10-10 19:30:43 | 显示全部楼层
eric2013 发表于 2022-10-10 17:18
调整状态看下DMA的NDTR寄存器更新不

DMA1_Stream0_IRQHandler  中断进入正常  明天用逻辑分析 抓fmc信号看看
回复

使用道具 举报

7

主题

20

回帖

41

积分

新手上路

积分
41
 楼主| 发表于 2022-10-11 14:22:10 | 显示全部楼层
问题解决了

不更新的是时候fmc 信号也正常

是配置MPU搞错了
配置好后 adc_buff 读写也可以实时更新了
  MPU_Region_InitTypeDef MPU_InitStruct = {0};
       
  /* Disables the MPU */
  HAL_MPU_Disable();
  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.BaseAddress = 0x30000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_64KB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_HFNMI_PRIVDEF);
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107046
QQ
发表于 2022-10-11 15:46:28 | 显示全部楼层
rainsyeah 发表于 2022-10-11 14:22
问题解决了

不更新的是时候fmc 信号也正常

好的,关闭了读写Cache。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 10:43 , Processed in 0.187414 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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