[STM32F1官方例程讲解2] 模拟看门狗Analog Watchdog

第一章 模拟看门狗简介

在这里插入图片描述

STM32F1中带有的模拟看门狗功能,允许应用程序检测输入电压是否超出事先定义的高低阈值。在编程环节,程序员可根据应用的需求来设置检测的高,低阈值(如上图所示HTR与LTR)。一旦采集到的电压超出该上下限,将会触发模拟看门狗中断。其典型的应用有,检测到电流过大时控制继电器断电,进而保护后续电路。注意,看门狗设置与数据对齐方式无关。

第二章 STM32F1模拟看门狗相关配置函数介绍

void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); //阈值设置
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); //模拟看门狗通道配置
void ADC_TempSensorVrefintCmd(FunctionalState NewState);//温度通道,未使用
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); //配置ADC组与ADC的通道情况
  • ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef ADCx, uint16_t HighThreshold, uint16_t LowThreshold)
  • @brief 配置模拟看门狗的高低阈值
  • @param ADCx: 选择ADC组,ADC1, ADC2, ADC3?
  • @param HighThreshold: 模拟看门狗的高阈值,12bit
  • @param LowThreshold: 模拟看门狗的低阈值,12bit
  • @retval None
  • ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef ADCx, uint8_t ADC_Channel)
  • @brief 配置模拟看门狗与ADC通道对应
  • @param ADCx: 选择ADC组,ADC1, ADC2, ADC3?
  • @param ADC_Channel: 配置给模拟看门狗的ADC通道
  • @retval None
  • ADC_AnalogWatchdogCmd(ADC_TypeDef ADCx, uint32_t ADC_AnalogWatchdog)
  • @brief 使能模拟看门狗,并配置模拟看门狗的所有/单个ADC通道
  • @param ADCx: 选择ADC组,ADC1, ADC2, ADC3?
  • @param ADC_AnalogWatchdog: ADC模拟看门狗通道配置
  • This parameter can be one of the following values:
  • @arg ADC_AnalogWatchdog_SingleRegEnable: 单规则通道的模拟看门狗
  • @arg ADC_AnalogWatchdog_SingleInjecEnable: 单注入通道的模拟看门狗
  • @arg ADC_AnalogWatchdog_SingleRegOrInjecEnable: 单注入通道/规则通道的模拟看门狗
  • @arg ADC_AnalogWatchdog_AllRegEnable: 所有规则通道的模拟看门狗
  • @arg ADC_AnalogWatchdog_AllInjecEnable: 所有注入通道的模拟看门狗
  • @arg ADC_AnalogWatchdog_AllRegAllInjecEnable: 所有注入/规则通道的模拟看门狗
  • @arg ADC_AnalogWatchdog_None: 关闭模拟看门狗
  • @retval None

第三章 电路原理图与库函数配置

3.1 程序逻辑

Created with Raphaël 2.2.0 开始 LED常亮 ADC采样 超出模拟看门狗阈值? 结束 LED闪烁一次(中断) yes no

3.2 硬件原理(LED灯)

Vcc
LED
限流电阻
PA1

3.3 ADC配置

void ADC_Configuration(void)
{
	#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
	/* ADCCLK = PCLK2/2 */
	RCC_ADCCLKConfig(RCC_PCLK2_Div2);
	#else
	/* ADCCLK = PCLK2/4 */
	RCC_ADCCLKConfig(RCC_PCLK2_Div4); 
	#endif

	/* Enable ADC1 clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	/* ADC1 Configuration ------------------------------------------------------*/
	ADC_InitTypeDef  ADC_InitStructure;
	ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanConvMode=DISABLE;
	ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfChannel=1;
	ADC_Init(ADC1,&ADC_InitStructure);
	
	/* Enable ADC1 */
	ADC_Cmd(ADC1, ENABLE);

	 /* ADC1 regular channel14 configuration */ 
	ADC_RegularChannelConfig(ADC1,ADC_Channel_14,1,ADC_SampleTime_13Cycles5);
	/* Configure high and low analog watchdog thresholds */
	ADC_AnalogWatchdogThresholdsConfig(ADC1, 0x0B00, 0x0300);
	/* Configure channel14 as the single analog watchdog guarded channel 正常范围0.62V~2.26V*/
	ADC_AnalogWatchdogSingleChannelConfig(ADC1, ADC_Channel_14);
	/* Enable analog watchdog on one regular channel */
	ADC_AnalogWatchdogCmd(ADC1, ADC_AnalogWatchdog_SingleRegEnable);
	
	/* Enable AWD interrupt */
	ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
	
	/* Enable ADC1 reset calibration register */   
	ADC_ResetCalibration(ADC1);
	/* Check the end of ADC1 reset calibration register */
	while(ADC_GetResetCalibrationStatus(ADC1));
	/* Start ADC1 calibration */
	ADC_StartCalibration(ADC1);
	/* Check the end of ADC1 calibration */
	while(ADC_GetCalibrationStatus(ADC1));
	/* Start ADC1 Software Conversion */ 
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	}

3.4 LED端口配置

#define LED_PIN				GPIO_Pin_1
#define LED_GPIO_PORT		GPIOA
#define LED_GPIO_CLK		RCC_APB2Periph_GPIOA 

void STM_EVAL_LEDInit(void)
{   
	GPIO_InitTypeDef  GPIO_InitStructure;   
	/* Enable the GPIO_LED Clock */
	RCC_APB2PeriphClockCmd(LED_GPIO_CLK, ENABLE);
	/* Configure the GPIO_LED pin */
	GPIO_InitStructure.GPIO_Pin = LED_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);
}

3.5 NVIC中断配置

void NVIC_Configuration(void)
{   
	NVIC_InitTypeDef NVIC_InitStructure;
	/* Configure and enable ADC interrupt */
	#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
	NVIC_InitStructure.NVIC_IRQChannel = ADC1_IRQn;
	#else
	NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
	#endif
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	}

3.6 ADC输入端口PC4配置

void GPIO_Configuration(void)
{
	/* Enable ADC_In clock */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	/* Configure PC.04 (ADC Channel14) as analog input -------------------------*/
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	}

3.7 中断服务函数

位于文件stm32f10x_it.c中

/**
   * @brief  This function handles ADC1 and ADC2 global interrupts requests.
   * @param  None
   * @retval None
   */
 #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)
 void ADC1_IRQHandler(void)
 #else
 void ADC1_2_IRQHandler(void)
 #endif
 {
	 /* Toggle LED1 */
	 GPIO_SetBits(LED_GPIO_PORT,LED_PIN);
	 delay_ms(500);
	 GPIO_ResetBits(LED_GPIO_PORT,LED_PIN);
	 delay_ms(500);
	 /* Clear ADC1 AWD pending interrupt bit */
	 ADC_ClearITPendingBit(ADC1, ADC_IT_AWD);
 }

3.8 主函数

int main(void)
{
	delay_init();
	GPIO_Configuration();
	ADC_Configuration();
	NVIC_Configuration();
	STM_EVAL_LEDInit();
	while(1){
	GPIO_ResetBits(LED_GPIO_PORT,LED_PIN);
	}	
	return 0;
}

相关代码已上传至本人的资源页。

### 回答1: STM32F1标准例程是指针对STMicroelectronics公司的STM32F1系列微控制器开发的一套标准程序代码,通过使用这套例程,开发者可以快速启动并进行STM32F1的开发工作。 STM32F1标准例程为开发者提供了各种功能和模块的实现方法,包括但不限于GPIO控制、定时器和计数器、PWM输出、UART通信、SPI和I2C通信等。这些例程是根据STM32F1系列微控制器的特性和功能设计的,并且经过STMicroelectronics官方的验证和测试。 使用STM32F1标准例程可以实现快速开发和验证。开发者可以在例程中找到许多已经编写好的代码段,根据自己的需求进行修改和定制,从而快速实现特定功能。此外,例程还提供了详细的注释和说明,开发者可以借助这些信息更好地理解代码实现的原理和逻辑。 另外,为了方便开发者使用,STMicroelectronics还提供了一套完整的开发工具链,包括STMCubeMX配置工具、MDK-ARM开发环境等。开发者可以使用这些工具与STM32F1标准例程结合,提高开发效率。 总之,STM32F1标准例程是一套方便开发者使用和定制的代码集合,能够帮助开发者快速启动并实现STM32F1系列微控制器的各种功能。通过使用这些例程,开发者可以节省大量的时间和精力,快速开发出高质量的应用程序。 ### 回答2: stm32f1标准例程是指STM32F1系列微控制器的官方示例代码。它提供了一系列标准例程,展示了STM32F1系列微控制器的各种功能和应用方案。这些例程覆盖了各个核心模块,包括时钟控制、GPIO控制、中断处理、定时器、串口通信、ADC转换、PWM输出等。通过学习和使用这些例程,可以快速了解和上手STM32F1系列微控制器。 标准例程通常有详细的代码注释,结构清晰,易于学习和理解。用户可以通过官方网站或官方提供的软件开发工具下载和使用这些例程。首先,用户需要根据自己的需求选择合适的例程,并下载到开发环境中。然后,根据例程的指导和注释,进行初始化配置和功能实现。用户可以根据自己的需求进行修改和扩展,以满足具体应用的要求。 使用STM32F1标准例程可以节省开发时间,提高开发效率。它为开发者提供了一个学习和实践的平台,帮助他们快速掌握STM32F1系列微控制器的使用方法和开发技巧。同时,标准例程还提供了一些经典应用的范例,可以供开发者参考和借鉴,快速完成项目开发。 总之,STM32F1标准例程是一套官方提供的示例代码,用于演示和学习STM32F1系列微控制器的各种功能和应用方案。通过使用这些例程,开发者可以快速上手STM32F1系列微控制器,提高开发效率,并实现各种应用需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值