赞
踩
STM32自带CPU的温度数据,需要使用ADC去读取。因此在MX创建项目时如图配置:
模块初始化代码如下:
- 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;
- 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;
- hadc1.Init.NbrOfConversion = 1;
- 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_239CYCLES_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;
- 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_HALFWORD;
- 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);
-
- /* USER CODE BEGIN ADC1_MspInit 1 */
-
- /* USER CODE END ADC1_MspInit 1 */
- }
- }
-
- /
-
- void MX_DMA_Init(void)
- {
-
- /* DMA controller clock enable */
- __HAL_RCC_DMA1_CLK_ENABLE();
-
- /* DMA interrupt init */
- /* DMA1_Channel1_IRQn interrupt configuration */
- HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
- HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
-
- }
给出Main的调用
- //全局变量
- uint32_t CPU_Temp_AD =0;
-
- double CalcCPUTemp(ADC_HandleTypeDef* hadc)
- {
- double temp = 0;
- //需要静态指针保存数据
- HAL_ADC_Start_DMA(hadc, (uint32_t *)&CPU_Temp_AD, 1);
- HAL_Delay(5);
- //采样10次
- for(uint8_t a = 0; a < 10; a++)
- {
- temp += CPU_Temp_AD;
- HAL_Delay(2);
- }
- return (1.43 - (temp/1000/10)) + 25;
- }
-
-
-
- int main(void)
- {
- MX_DMA_Init();
- MX_ADC1_Init();
- while (1) {
- //计算获取温度
- double CPU_TEMP = CalcCPUTemp(&hadc1);
- HAL_Delay(10);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。