抓紧时间备赛,冲!
目录
一. STM32CubeMX 配置
1. 配置引脚
2. 设置采样时间
STM32CubeMX配置完成
二. 代码编写
1. adc.c 文件
#include "adc.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
ADC_HandleTypeDef hadc2;
void MX_ADC2_Init(void)
{
/* USER CODE BEGIN ADC2_Init 0 */
/* USER CODE END ADC2_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC2_Init 1 */
/* USER CODE END ADC2_Init 1 */
/** Common config
*/
hadc2.Instance = ADC2;
hadc2.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc2.Init.Resolution = ADC_RESOLUTION_12B;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.GainCompensation = 0;
hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc2.Init.LowPowerAutoWait = DISABLE;
hadc2.Init.ContinuousConvMode = DISABLE;
hadc2.Init.NbrOfConversion = 2;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc2.Init.DMAContinuousRequests = DISABLE;
hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc2.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_17;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_13;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC2_Init 2 */
/* USER CODE END ADC2_Init 2 */
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC2)
{
/* USER CODE BEGIN ADC2_MspInit 0 */
/* USER CODE END ADC2_MspInit 0 */
/* ADC2 clock enable */
__HAL_RCC_ADC12_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**ADC2 GPIO Configuration
PA4 ------> ADC2_IN17
PA5 ------> ADC2_IN13
*/
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN ADC2_MspInit 1 */
/* USER CODE END ADC2_MspInit 1 */
}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
if(adcHandle->Instance==ADC2)
{
/* USER CODE BEGIN ADC2_MspDeInit 0 */
/* USER CODE END ADC2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_ADC12_CLK_DISABLE();
/**ADC2 GPIO Configuration
PA4 ------> ADC2_IN17
PA5 ------> ADC2_IN13
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5);
/* USER CODE BEGIN ADC2_MspDeInit 1 */
/* USER CODE END ADC2_MspDeInit 1 */
}
}
uint16_t get_adc2(void)
{
uint16_t adc;
HAL_ADC_Start(&hadc2);
if(HAL_ADC_PollForConversion(&hadc2,100)==HAL_OK)
{
adc=HAL_ADC_GetValue(&hadc2);
}
return adc;
}
2. adc.h 文件
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern ADC_HandleTypeDef hadc2;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_ADC2_Init(void);
uint16_t get_adc2(void);
3. main.c 文件
放部分关键代码
#include "main.h"
#include "stdio.h"
#include "lcd.h"
#include "tim.h"
#include "adc.h"
//模块计时
__IO uint32_t Lcd_uwTick=0;
/*函数声明------------------------------------------------------------------------------*/
void lcd(void);
/*主函数------------------------------------------------------------------------------*/
int main(void)
{
HAL_Init();
SystemClock_Config();//系统时钟设置
KEY_Init();//按键初始化
TIM2_Init();//定时器2初始化 100ms
HAL_TIM_Base_Start_IT(&htim2);//启动定时器2中断工作模式
MX_ADC2_Init();//ADC2初始化 R37 PB15
LCD_Init();//LCD初始化
LCD_Clear(Black);//清屏
LCD_SetBackColor(Black);//背景颜色
LCD_SetTextColor(White);//文本颜色
while (1)
{
// HAL_Delay(500);
}
}
/*常用函数------------------------------------------------------------------------------*/
void lcd()//LCD显示模块
{
if (uwTick - Lcd_uwTick < 200) return;
Lcd_uwTick = uwTick;
//扩展板ADC电压值显示
sprintf(a," ADC2:%5.3f V %5.3f V",get_adc2()*3.3/4096,get_adc2()*3.3/4096);
LCD_DisplayStringLine(Line0,(unsigned char *)a);
}
//定时器中断处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
lcd();//屏幕显示
}
}
三. 注意事项
(1)由于是双通道,所以第一次读是一个通道(IN17),第二次是第二个通道(IN13)
(2)对应关系:PA4-AO1-RP5-IN17
结语
没想到还比较简单,学的很快
是没想到用sprintf函数运行是从后面的参数开始运行的