STM32F103VET6基于STM32CubeMX 配置DMA方式获取内部温度

STM32F103VET6基于STM32CubeMX 配置DMA方式获取内部温度


  • 🎬STM32CubeMX 参数配置演示(没有包含串口1的配置内容)
    在这里插入图片描述

🚩请注意:以演示中没有展现串口1的开启演示过程,需要自己勾选USART1

STM32CubeMX 配置解析

  • 内部温度和参考电压都属于独占一个通道。
    在这里插入图片描述
  • 参数设置
    在这里插入图片描述

对应的初始化函数代码:

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 */

  /** Common config
  */
  hadc1.Instance = ADC1;//ADC工作模式:ADC1和ADC2工作在独立模式
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;//在单通道下,禁止扫描模式
  hadc1.Init.ContinuousConvMode = ENABLE;//使能连续转换
  hadc1.Init.DiscontinuousConvMode = DISABLE;//模数模式工作在单次转换模式
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;//转换由软件启动
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;//ADC数据右对齐
  hadc1.Init.NbrOfConversion = 1;//转换ADC通道的数目
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;//转换时间
  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)
{

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

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

    /* ADC1 DMA Init */
    /* ADC1 Init */
    hdma_adc1.Instance = DMA1_Channel1;//DMA通道
    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_WORD;//外设数据长度
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;//储存数据长度
    hdma_adc1.Init.Mode = DMA_CIRCULAR;//循环传输模式
    hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;//优先级
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    /* ADC1 interrupt Init */
    HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);//优先级分组
    HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
}

📖业务代码补充

  1. 在main.c中添加有关宏和变量定义
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
//对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0x6EE
#define V25  0x6EE	 

// 每摄氏度4.3mV 对应每摄氏度0x05
#define AVG_SLOPE 0x05 
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t ADC_Value,Current_Temp;
float ADC_ConvertedValueLocal,Temperature;

/* USER CODE END PV */
  1. 🌿在main.c中的主函数main中开启ADC DMA转换
HAL_ADCEx_Calibration_Start(&hadc1);//开启ADC前对ADC进行校准
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 1);//开启DMA转换
  1. 🌿在usart.c中添加printf重映射代码,并且在target选项中勾选Use Micro LIB选项。在使用printf函数的地方包含stdio.h头文件。
/* USER CODE BEGIN 1 */
#include <stdio.h>
int fputc(int ch,FILE *f)
{
    uint32_t temp = ch;
 
    HAL_UART_Transmit(&huart1,(uint8_t *)&temp,1,0xFFFF);        //huart1是串口的句柄
    HAL_Delay(2);
 
    return ch;
}

/* USER CODE END 1 */
  1. 🌿在主循环while中添加信息输出
HAL_Delay(1000);
   Current_Temp=(V25 - ADC_Value)/AVG_SLOPE + 25;//计算方法1		
		ADC_ConvertedValueLocal =(float) ADC_Value/4096*3.3;//实际电压值
		Temperature = (1.43 - ADC_Value*3.3/4096)/0.0043 + 25 ;//计算方法2
		
		printf("The Current AD_value : %u \r\n",ADC_Value);		
		 printf("voltage: %.1fV \r\n",ADC_ConvertedValueLocal);//实际电压值
		printf("MCU Temperature:%.2f ℃,Current_Temp=%u \r\n", Temperature,Current_Temp);	

  • ✅串口打印信息
    在这里插入图片描述

🌼工程源码

链接:https://pan.baidu.com/s/1HlLTlvS21Hyk8PuwCG_5vQ 
提取码:gc70
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值