0、引言
单片机:STM32F407ZGT6;
仿真器:ST Link V2;
开发环境:STM32CubeIDE 1.10.1;
功能说明:使用单片机内部ADC进行一次最基础的模数转换。
前情提要:
STM32Cube学习(1)——点灯&配置
STM32Cube学习(2)——定时器中断
参考资料:
【STM32】HAL库 STM32CubeMX教程九—ADC
STM32 ADC详细篇(基于HAL库)
STM32F4数据手册
0.1、STM32——ADC简介
1、STM32CubeIDE配置
打开CubeIDE,新建工程,选择匹配的芯片
1.1、配置时钟
RCC选择HSE,高速时钟
配置时钟树,外部晶振为8MHz,同时设置PLL、系统时钟等,最终频率为72MHz
1.2、配置ADC功能
选择ADC2——》IN3
按照下图配置ADC
Independent mode 独立模式:我们只采用了一个ADC,故设置为独立模式;如果需要多个ADC同步使用,将配置为其他模式;
Clock Prescaler PCLK2 divided by2
ADC分频后的时钟不要高于36MHz,经APB2分频,得到APB2外设时钟为36M
采样分辨率Resolution配置为默认的12bit;
数据对齐方式Data Alignment 右对齐;
扫描转换模式Scan Conversion Mode该模式通常在多通道ADC采样时使能;
连续转换模式Continuous Conversion Mode该模式使能为连续转换,失能为单次转换,即需要再次触发转换才可以进行转换;
间断模式Discontinuous Conversion Mode在使用单通道采样时可不使用。
规则通道设置ADC_Regular_ConversionMode
转换通道数Number Of Conversion根据实际使用通道配置,当前为1;
外部触发转换源External Trigger Conversion Source
regular conversion launched by softwar软件规则进行转换。
外部触发转换边缘External Trigger Conversion Edge默认
转换顺序 Rank 默认:1(如果是多个ADC通道,可以挨个配置,用于设置每个通道转换顺序)
转换通道Channel默认:根据设置配置3
转换时间Sampling Time默认:3个时钟周期
1.2.1、外部触发转换
除了上述的触发方式外,还有以下触发方式,如定时器1捕获比较事件1
此外在设定了其他触发方式后,触发边缘边可以设置,如下图的
Trigger detection on the rising edge触发器探测上升沿
Trigger detection on the falling edge触发器探测下降沿
Trigger detection on the rising edge and falling edge触发器探测上升沿和下降沿
1.2.2、注入模式(injected)
留坑
1.2.3、看门狗(WatchDog)
使能模拟看门狗模式。在该模式下,当高于阈值(ADC_HTR)或低于阈值(ADC_LTR)便进入中断。
1.2.4、转换结束后中断
1.2.5、管脚配置
1.3、其他配置
点击==‘齿轮’==图标,生成代码。
2、代码添加
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//添加全局变量
uint16_t Get_ADC_Value;
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
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_ADC1_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1); //启动ADC转换
HAL_ADC_PollForConversion(&hadc1, 50); //等待转换完成,50为最大等待时间,单位为ms
//判断ADC是否转换成功
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
Get_ADC_Value = HAL_ADC_GetValue(&hadc1); //获取AD值
}
HAL_Delay(1000);
}
/* USER CODE END 3 */
}