OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6222|回复: 9

dma搬运stm32f103zet6的adc1通道0、1数据

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-3-9
在线时间
11 小时
发表于 2023-3-3 09:12:07 | 显示全部楼层 |阅读模式
1金钱
我在stm32f103战舰开发板上做个小实验,adc1的通道0和通道1连续采集,通过dma1的1通道搬运数据,存至数组a[]中,进入debug调试发现像只搬运了ADC1->DR的低8位,我配置的

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3583
金钱
3583
注册时间
2019-8-14
在线时间
1052 小时
发表于 2023-3-3 10:23:15 | 显示全部楼层
可以参考下这个:【战舰V3_关于ADC和DMA,串口+DMA的结合使用(串口空闲中断+DMA/六路ADC+DMA/12路ADC+DMA)】 http://www.openedv.com/forum.php?mod=viewthread&tid=276626
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2023-3-5 12:18:36 | 显示全部楼层
DMA传输 有一个PSIZE和MSIZE 分别是外设和寄存器的数据长度 通过配置可以选择8位/16位 默认8位 ADC数据长度默认是12位的 所以需要那两项都改成以16位传输
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-3
在线时间
12 小时
发表于 2023-5-3 11:23:36 | 显示全部楼层
babyrabbit 发表于 2023-3-5 12:18
DMA传输 有一个PSIZE和MSIZE 分别是外设和寄存器的数据长度 通过配置可以选择8位/16位 默认8位 ADC数据长度 ...

意思是data width配置为halfword吗,我配置完毕之后还是只传输8位的数据。。
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-5-3 13:37:15 | 显示全部楼层
了不起的亮亮 发表于 2023-5-3 11:23
意思是data width配置为halfword吗,我配置完毕之后还是只传输8位的数据。。

配置贴出来
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-3
在线时间
12 小时
发表于 2023-5-3 15:46:57 | 显示全部楼层

我是通过cubemx直接配置ADC DMA传输的:
配置为:
1、ADC1 采集通道7、8、9;DMA传输
2、ADC扫描模式、连续转换、采集数据右对齐、DMA为连续请求模式
3、ADC1、DMA无中断
4、DMA请求为循环模式,外设地址不变,memory地址递增。数据长度都是半字。

配置完generate code之后,就很奇怪。ADC只能采集一次,且传输到数组中的数据是8位。
while循环中打印结果是:255 0 0 3937
还在调试中,不知道问题出在哪里。。。

主函数代码:

__IO uint32_t adcBuf[3];//ADC采集的数值,分辨�???????12�???????
float adc_vol;//转换的电压�??
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_FSMC_Init();
  MX_ADC1_Init();
  MX_DMA_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  
  TFTLCD_Init();//LCD ��ʼ��
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
        LCD_Clear(WHITE);
  POINT_COLOR=BLUE;
        LCD_ShowString(30,30,240,16,16,"what a nice day!");
        HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adcBuf,3);//start adc dma
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
                HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_SET);
                HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
               
                HAL_Delay(500);
               
                HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9,GPIO_PIN_RESET);
                HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);
               
                HAL_Delay(500);
  printf("%d  %d  %d %d\r\n",adcBuf[0],adcBuf[1],adcBuf[2],HAL_ADC_GetValue(&hadc1));
               
  }
  /* USER CODE END 3 */
}




adc.为:


/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "adc.h"

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

ADC_HandleTypeDef hadc1;
DMA_HandleTypeDef hdma_adc1;

/* ADC1 init function */
void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 3;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_7;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = 2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_9;
  sConfig.Rank = 3;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    __HAL_RCC_ADC1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**ADC1 GPIO Configuration
    PA7     ------> ADC1_IN7
    PB0     ------> ADC1_IN8
    PB1     ------> ADC1_IN9
    */
    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* ADC1 DMA Init */
    /* ADC1 Init */
    hdma_adc1.Instance = DMA2_Stream0;
    hdma_adc1.Init.Channel = DMA_CHANNEL_0;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;
    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{

  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspDeInit 0 */

  /* USER CODE END ADC1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_ADC1_CLK_DISABLE();

    /**ADC1 GPIO Configuration
    PA7     ------> ADC1_IN7
    PB0     ------> ADC1_IN8
    PB1     ------> ADC1_IN9
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7);

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1);

    /* ADC1 DMA DeInit */
    HAL_DMA_DeInit(adcHandle->DMA_Handle);
  /* USER CODE BEGIN ADC1_MspDeInit 1 */

  /* USER CODE END ADC1_MspDeInit 1 */
  }
}
回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2023-5-3 16:17:05 | 显示全部楼层
255 0 0 3937怎么有四个值?3937不对
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-3
在线时间
12 小时
发表于 2023-5-3 16:33:08 | 显示全部楼层
阿侑kevin 发表于 2023-5-3 16:17
255 0 0 3937怎么有四个值?3937不对

哦哦 前三个数值是dma传到数组中的值,
3937是打印的ADC数据寄存器的值。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2023-5-3
在线时间
12 小时
发表于 2023-5-3 16:41:50 | 显示全部楼层
阿侑kevin 发表于 2023-5-3 16:17
255 0 0 3937怎么有四个值?3937不对

cubemx新建了一个project重新配置的,只配置了adc相关的内容。fsmc,timer2等其他的没配置,显示是正常采集并且传输的,可能是配置冲突了?我自己再看下,不好意思麻烦您了,感谢。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2023-5-3
在线时间
3 小时
发表于 2023-5-3 17:02:27 | 显示全部楼层
MA传输 有一个PSIZE和MSIZE 分别是外设和寄存器的数据长度 通过配置可以选择8位/16位 默认8位 ADC数据长度默认是12位的 所以需要那两项都改成以16位传输
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 09:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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