赞
踩
前提:有一段时间没有使用STM32了,最近在使用ADC功能,要提高其效率的问题就会用到DMA,但是ST公司的STM32CubeMX软件生成出来的代码,它的排序是有问题的,所以本文章进行记录
MCU:STM32G031P6F6
生成软件工具:STM32CubeMX
前面的部分我就省略了,我就挑重点
之后扫描存储的顺序就会按照你这里设定的通道,从1到3顺序读取和保存到数组中
因为ADC的频率不能超过12M,所以你要在时钟树中修改一下。
请注意,毕竟每个系列或型号多多少少的时钟树上是不同的显示,所以就只管找到ADC所属于的时钟或是APB/AHB之类的
我这里选择21.333333明显是超过了12M,但是ADC的配置中会有分频器的问题,所以最后的频率是21.3333 / 2
如果不会配置的,请参考其他博主的方法,这里我就不提供了
Keil打开代码后,有一行DMA初始化代码要放在ADC初始化的前面才能正常使用DMA+ADC的功能,否则出来的结果都是0!!!
最后贴出部分代码
- int main(void)
- {
-
- /* USER CODE BEGIN 1 */
- float Vin = 0;
- float Vout = 0;
- float Iin = 0;
- uint16_t AD_DMA[3] = {0};
- /* 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_DMA_Init();
- MX_ADC1_Init();
- MX_TIM1_Init();
- // MX_DMA_Init();
- MX_USART1_UART_Init();
- /* USER CODE BEGIN 2 */
-
-
- printf("hello\r\n");
-
- HAL_ADCEx_Calibration_Start(&hadc1);
- HAL_ADC_Start_DMA(&hadc1, (uint32_t*)AD_DMA, 3);
-
- /* USER CODE END 2 */
-
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
-
- /* USER CODE BEGIN 3 */
- HAL_Delay(1000);
- Vin = ((AD_DMA[2]*(3.3/4096));
- Vout = ((AD_DMA[1]*(3.3/4096));
- Iin = ((AD_DMA[0]*(3.3/4096));
-
- printf("Vin = %f\r\n",Vin);
- printf("Vout = %f\r\n",Vout);
- printf("Iin = %f\r\n",Iin);
-
-
- }
- /* USER CODE END 3 */
- }
最后
导致这个问题的原因可能是时钟没有开启,却配置DMA参数。而导致参数并未成功赋值。
我们可以看到MX_DMA_Init函数里面只有三行代码,开启时钟、配置DMA的NVIC、开启DMA的NVIC
按照排除法,应该就是时钟问题
有问题的话请在评论区或是私信,有点要说,CSDN的私信和评论的提醒做的有点拉跨,我在使用的时候没有一眼发现有人私信或是评论。不知道是不是我的设置问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。