• 使用stm32cubemx实现GD32 DAC信号输出和ADC信号采集


    stm32 cubemx用stm32f103VCT6芯片,生成的代码。可以直接烧录到GD32f303、307上面。

    用GD32提供的库函数写的话,307的程序303用不了。

    管脚对应

    画的pcb板子,引脚PA4对应DAC,PC1对应ADC。

    cubemx里面,也要这么对应。

    在这里插入图片描述

    在这里插入图片描述

    RCC和SYS配置

    在这里插入图片描述

    sys里面debug选项默认是no debug,一定要记得改。

    在这里插入图片描述

    ADC+TIM+DMA配置

    这里采用选择TIM3的TRGO信号触发。

    在这里插入图片描述

    DMA设置normal,采完指定数就停。

    在这里插入图片描述

    TIM3配置。

    在这里插入图片描述

    DAC+TIM+DMA配置

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    USART、时钟树和其他配置

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    代码

    生成代码之后,修改或添加如下代码。

    main.c

    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    #include "math.h"
    #include "stdlib.h"
    #define POINTS 120
    
    /* USER CODE END Includes */
    
    /* USER CODE BEGIN PV */
    uint16_t SineWaveTable[POINTS+1];
    uint16_t adc_buff[120];
    __IO uint8_t AdcConvEnd = 0;
    /* USER CODE END PV */
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    void SineWaveGen(uint32_t NPoints, float VMaxRange, uint16_t* SineWaveTable)
    {
    #ifndef PI
    #define PI 3.1415926
    #endif
    
    	int    i       = 0;
    	double radian  = 0;  // 弧度
    	double setup   = 0;  // 弧度和弧度之间的大小
    	double voltage = 0;  // 输出电压
    
    	setup = (2 * PI) / NPoints;  // 两点之间的间距
    
    	while (i < NPoints)
    	{
    		voltage = VMaxRange / 2.0 * (sin(radian) + 1.0);             // 计算电压
    		printf("%lf\r\n",voltage);//可以删
    		SineWaveTable[i] = (uint16_t)(voltage * 4096 / 3);       //3还是3.3根据电路图来看
    		radian += setup;                                            // 下一个点的弧度
    		i++;
    	}
    }
    
    /* USER CODE END 0 */
    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_DMA_Init();
      MX_DAC_Init();
      MX_TIM6_Init();
      MX_USART1_UART_Init();
      MX_ADC1_Init();
      MX_TIM3_Init();
      /* USER CODE BEGIN 2 */
    	SineWaveGen(POINTS, 1, SineWaveTable);
    	HAL_TIM_Base_Start(&htim6);
    	HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)SineWaveTable, POINTS, DAC_ALIGN_12B_R);
    
    	HAL_TIM_Base_Start(&htim3);                           //开启定时器3
    	HAL_ADCEx_Calibration_Start(&hadc1);                  //AD校准,F4不用校准没用这行函数。
    	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_buff, 120); //让ADC1去采集120个数,存放到adc_buff数组里
    	while (!AdcConvEnd)                                   //等待转换完毕
        ;
    	for (uint16_t i = 0; i < 120; i++)
    	{
        printf("%.3f\n", adc_buff[i] * 3.0 / 4095); //数据打印,查看结果
    	}
    
    
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97

    usart.c

    在这里插入图片描述

    /* USER CODE BEGIN 0 */
    #include "stdio.h"
    /* USER CODE END 0 */
    /* USER CODE BEGIN 1 */
    int fputc(int ch, FILE *f)
    {
      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
      return ch;
    }
    /* USER CODE END 1 */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    stm32f1xx_it.c

    /* USER CODE BEGIN PV */
    extern uint8_t AdcConvEnd;//引入外部变量
    /* USER CODE END PV */
    void DMA1_Channel1_IRQHandler(void)
    {
      /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
    
      /* USER CODE END DMA1_Channel1_IRQn 0 */
      HAL_DMA_IRQHandler(&hdma_adc1);
      /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
      AdcConvEnd=1;
    
      /* USER CODE END DMA1_Channel1_IRQn 1 */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    结果

    将串口输出整理后。

    左侧是DAC输出,右侧是经过一些电路后ADC读取的电压。

    在这里插入图片描述

  • 相关阅读:
    精品基于Uniapp+SSM实现的日常饮食管理APP
    【立创机械狗从0到成品PCB画图总结】
    成都瀚网科技:抖店怎么快速出体验分?
    什么是温度传感器?温度传感器原理是什么?一文带你全部搞懂
    AWNet: Attentive Wavelet Network for Image ISP AWNet:图像 ISP 的注意力小波网络(个人笔记,勿喷)
    数据库问题汇总
    css3-浮动和display、父级边框塌陷
    基于Ubuntu20.04安装GoogleTest及其运行Sample
    【Unity】Unity开发进阶(七)双刃剑:扩展方法
    ESP8266-Arduino编程实例-开发环境搭建(基于PlatformIO)
  • 原文地址:https://blog.csdn.net/qq_40828914/article/details/125633617