你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G070xx的flash分布如下图,打算将Page 63用于保存用户数据。

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1. 使用 CubeMx 创建 ADC 工程
打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.

先配置一下串口,用来打印相关信息

20210129082956474.png


再来配置 ADC

20210129083334250.png


20210129083449121.png


配置DMA
20210129085309510.png


PS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数.

配置时钟

2021012908370231.png


ps:本实验使用内部高速时钟,未使用外部晶振,主频设置为最大的64MHZ.

配置工程相关选项

20210129083821567.png


配置完成后点击右上角 GENERATE CODE完成工程的创建

2. 编程
2.1 串口相关的代码
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"

  3. /* Private includes ----------------------------------------------------------*/
  4. /* USER CODE BEGIN Includes */
  5. #include "stdio.h"
  6. /* USER CODE END Includes */

  7. /* Private typedef -----------------------------------------------------------*/
  8. /* USER CODE BEGIN PTD */

  9. /* USER CODE END PTD */

  10. /* Private define ------------------------------------------------------------*/
  11. /* USER CODE BEGIN PD */
  12. /* USER CODE END PD */

  13. /* Private macro -------------------------------------------------------------*/
  14. /* USER CODE BEGIN PM */

  15. /* USER CODE END PM */

  16. /* Private variables ---------------------------------------------------------*/
  17. ADC_HandleTypeDef hadc1;
  18. DMA_HandleTypeDef hdma_adc1;

  19. UART_HandleTypeDef huart1;

  20. /* USER CODE BEGIN PV */

  21. /* USER CODE END PV */

  22. /* Private function prototypes -----------------------------------------------*/
  23. void SystemClock_Config(void);
  24. static void MX_GPIO_Init(void);
  25. static void MX_DMA_Init(void);
  26. static void MX_ADC1_Init(void);
  27. static void MX_USART1_UART_Init(void);
  28. /* USER CODE BEGIN PFP */

  29. /* USER CODE END PFP */

  30. /* Private user code ---------------------------------------------------------*/
  31. /* USER CODE BEGIN 0 */
  32. __IO uint16_t adcCovValueBuff[30][2] = {0};        //存放ADC的值 2通道  每个通道存放30个值,由DMA循环写入
  33. uint16_t adcAverageBuff[2] = {0};        //对每个通道30个ADC值取平均值


  34. #ifdef __GNUC_
  35. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  36. #else
  37. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  38. #endif
  39. PUTCHAR_PROTOTYPE
  40. {
  41.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);

  42.     return ch;
  43. }

  44. /* USER CODE END 0 */
复制代码


2.2 main 函数
  1. /**
  2.   * @brief  The application entry point.
  3.   * @retval int
  4.   */
  5. int main(void)
  6. {
  7.     /* USER CODE BEGIN 1 */
  8.     float votage = 0;
  9.     uint32_t sum = 0;
  10.     /* USER CODE END 1 */

  11.     /* MCU Configuration--------------------------------------------------------*/

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

  14.     /* USER CODE BEGIN Init */

  15.     /* USER CODE END Init */

  16.     /* Configure the system clock */
  17.     SystemClock_Config();

  18.     /* USER CODE BEGIN SysInit */

  19.     /* USER CODE END SysInit */

  20.     /* Initialize all configured peripherals */
  21.     MX_GPIO_Init();
  22.     MX_DMA_Init();
  23.     MX_ADC1_Init();
  24.     MX_USART1_UART_Init();
  25.     /* USER CODE BEGIN 2 */
  26.     printf("stm32g030f6 adc demo...... \n");
  27.     HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);
  28.     /* USER CODE END 2 */

  29.     /* Infinite loop */
  30.     /* USER CODE BEGIN WHILE */
  31.     while(1)
  32.     {
  33.         for(uint8_t i = 0; i < 2; i++)
  34.         {
  35.             for(uint8_t count = 0; count < 30; count++)
  36.             {
  37.                 sum += adcCovValueBuff[count];
  38.             }
  39.             adcAverageBuff = sum / 30;
  40.             sum = 0;
  41.         }

  42.         printf("---------------------------------------- \n");
  43.         printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);
  44.         votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;
  45.         printf("ADC Channel01 Voltage:%f V \n", votage);
  46.         printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);
  47.         votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;
  48.         printf("ADC Channel02 Voltage:%f V \n", votage);
  49.         printf("---------------------------------------- \n");
  50.         HAL_Delay(1000);
  51.         /* USER CODE END WHILE */

  52.         /* USER CODE BEGIN 3 */
  53.     }
  54.     /* USER CODE END 3 */
  55. }
复制代码

2.3 外设的初始化函数
外设的初始化函数都是由 CubeMx 生成的,因为我们只用 DMA 搬运数据,未使用 DMA 的中断功能,故初始化 DMA 时可将中断配置函数注释。

  1. /**
  2.   * @brief ADC1 Initialization Function
  3.   * @param None
  4.   * @retval None
  5.   */
  6. static void MX_ADC1_Init(void)
  7. {

  8.     /* USER CODE BEGIN ADC1_Init 0 */

  9.     /* USER CODE END ADC1_Init 0 */

  10.     ADC_ChannelConfTypeDef sConfig = {0};

  11.     /* USER CODE BEGIN ADC1_Init 1 */

  12.     /* USER CODE END ADC1_Init 1 */
  13.     /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  14.     */
  15.     hadc1.Instance = ADC1;
  16.     hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  17.     hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  18.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  19.     hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  20.     hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  21.     hadc1.Init.LowPowerAutoWait = DISABLE;
  22.     hadc1.Init.LowPowerAutoPowerOff = DISABLE;
  23.     hadc1.Init.ContinuousConvMode = ENABLE;
  24.     hadc1.Init.NbrOfConversion = 2;
  25.     hadc1.Init.DiscontinuousConvMode = DISABLE;
  26.     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  27.     hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  28.     hadc1.Init.DMAContinuousRequests = ENABLE;
  29.     hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  30.     hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;
  31.     hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;
  32.     hadc1.Init.OversamplingMode = DISABLE;
  33.     hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
  34.     if(HAL_ADC_Init(&hadc1) != HAL_OK)
  35.     {
  36.         Error_Handler();
  37.     }
  38.     /** Configure Regular Channel
  39.     */
  40.     sConfig.Channel = ADC_CHANNEL_7;
  41.     sConfig.Rank = ADC_REGULAR_RANK_1;
  42.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
  43.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  44.     {
  45.         Error_Handler();
  46.     }
  47.     /** Configure Regular Channel
  48.     */
  49.     sConfig.Channel = ADC_CHANNEL_8;
  50.     sConfig.Rank = ADC_REGULAR_RANK_2;
  51.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
  52.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  53.     {
  54.         Error_Handler();
  55.     }
  56.     /* USER CODE BEGIN ADC1_Init 2 */

  57.     /* USER CODE END ADC1_Init 2 */

  58. }

  59. /**
  60.   * @brief USART1 Initialization Function
  61.   * @param None
  62.   * @retval None
  63.   */
  64. static void MX_USART1_UART_Init(void)
  65. {

  66.     /* USER CODE BEGIN USART1_Init 0 */

  67.     /* USER CODE END USART1_Init 0 */

  68.     /* USER CODE BEGIN USART1_Init 1 */

  69.     /* USER CODE END USART1_Init 1 */
  70.     huart1.Instance = USART1;
  71.     huart1.Init.BaudRate = 115200;
  72.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
  73.     huart1.Init.StopBits = UART_STOPBITS_1;
  74.     huart1.Init.Parity = UART_PARITY_NONE;
  75.     huart1.Init.Mode = UART_MODE_TX_RX;
  76.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  77.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  78.     huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  79.     huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  80.     huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  81.     if(HAL_UART_Init(&huart1) != HAL_OK)
  82.     {
  83.         Error_Handler();
  84.     }
  85.     if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  86.     {
  87.         Error_Handler();
  88.     }
  89.     if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  90.     {
  91.         Error_Handler();
  92.     }
  93.     if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  94.     {
  95.         Error_Handler();
  96.     }
  97.     /* USER CODE BEGIN USART1_Init 2 */

  98.     /* USER CODE END USART1_Init 2 */

  99. }

  100. /**
  101.   * Enable DMA controller clock
  102.   */
  103. static void MX_DMA_Init(void)
  104. {

  105.     /* DMA controller clock enable */
  106.     __HAL_RCC_DMA1_CLK_ENABLE();

  107.     /* DMA interrupt init */
  108.     /* DMA1_Channel1_IRQn interrupt configuration */

  109.     //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释 
  110.     //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);

  111. }

  112. /**
  113.   * @brief GPIO Initialization Function
  114.   * @param None
  115.   * @retval None
  116.   */
  117. static void MX_GPIO_Init(void)
  118. {

  119.     /* GPIO Ports Clock Enable */
  120.     __HAL_RCC_GPIOB_CLK_ENABLE();
  121.     __HAL_RCC_GPIOA_CLK_ENABLE();

  122. }
复制代码


3. 实验现象
编译并将程序下载到开发板中,连接串口助手并打开;
实验现象:每秒打印一次当前两个通道的 ADC 值及换算后的电压.


2021012908502456.png

收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版