做网站公司圣辉友联巩义网站建设定制
2026/6/11 11:27:33 网站建设 项目流程
做网站公司圣辉友联,巩义网站建设定制,wordpress补丁,网络网站建设app1.AD单通道1.相关函数void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//用于配置 ADC#xff08;模数转换器#xff09;时钟源分频的核心函数#xff0c;隶属于 RCC#xff08;复位和时钟控制#xff09;模块#xff0c;作用是将 APB2 总线时钟#xff08;PCLK2#xff09…1.AD单通道1.相关函数void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//用于配置 ADC模数转换器时钟源分频的核心函数隶属于 RCC复位和时钟控制模块作用是将 APB2 总线时钟PCLK2分频后作为 ADC 的工作时钟ADCCLK。void ADC_DeInit(ADC_TypeDef* ADCx);//用于将指定 ADC 外设恢复到默认复位状态的核心函数隶属于 ADC 模块作用是清空 ADC 的所有配置寄存器、关闭 ADC 外设并复位相关硬件逻辑相当于对 ADC 执行 “出厂重置”。void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);//ADC 外设的核心初始化函数用于将用户自定义的配置参数如转换模式、触发方式、数据对齐等写入指定 ADC 的寄存器是 ADC 从 “复位状态” 进入 “可工作状态” 的核心步骤void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);//用于初始化ADC_InitTypeDef结构体的辅助函数作用是将结构体的所有成员赋值为默认复位值避免因结构体未初始化残留随机值导致 ADC 配置异常是规范的 ADC 初始化流程中不可或缺的一步。void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);//用于使能 / 关闭指定 ADC 外设核心工作时钟的关键函数直接控制 ADC 硬件的启动与停止 —— 调用后 ADC 才会进入可工作状态如响应转换触发、执行模数转换是 ADC 从 “配置完成” 到 “可运行” 的最后一步校准前需先使能void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);//用于使能 / 禁用指定 ADC 外设中断的核心函数通过配置 ADC 的中断屏蔽寄存器控制特定中断事件如转换完成、注入转换完成、溢出是否触发中断请求是 ADC 中断驱动开发的关键步骤。void ADC_ResetCalibration(ADC_TypeDef* ADCx);//复位校准FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);void ADC_StartCalibration(ADC_TypeDef* ADCx);//开始校准FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);//ADC 高精度转换的核心配套函数用于执行 ADC 的硬件自校准流程 —— 校准能消除 ADC 内部电路如采样保持、放大器的偏移误差是 ADC 初始化的必选步骤未校准的 ADC 转换结果会存在显著偏差。void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//用于软件触发 ADC 规则通道转换的核心函数通过控制 ADC 的软件触发位启动 / 停止规则通道的模数转换区别于定时器、外部中断等硬件触发方式是软件触发模式下 ADC 开始转换的关键操作。FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);//用于查询 ADC 规则通道软件触发转换状态的辅助函数核心作用是读取 ADC 控制寄存器中软件触发位SWSTART的当前状态判断规则通道是否处于 “软件触发生效中” 的状态常用于转换流程的状态判断和异常处理。基本无用FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);//用于查询 ADC 外设各类状态标志位的核心工具函数通过读取 ADC 状态寄存器ADC_SR的对应位判断 ADC 是否发生特定事件如转换完成、看门狗触发、溢出等是 ADC 轮询模式开发、中断异常处理的关键函数。void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//用于配置 ADC间断模式Discontinuous Mode的核心函数间断模式允许将多通道扫描的总通道数拆分为若干 “批次” 转换而非一次性扫描完所有通道每批次转换需手动 / 硬件触发适用于需要分阶段采集多通道数据、或优先响应高优先级事件的场景如嵌入式测控系统中分批采集传感器数据。void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);//配置 ADC规则通道的核心函数用于指定规则通道的 “转换通道号、转换顺序、采样时间”是多通道扫描、单通道转换的基础配置步骤 —— 规则通道是 ADC 最常用的转换通道区别于注入通道所有常规的模数转换均通过规则通道完成。void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);//用于使能 / 禁用 ADC 规则通道外部硬件触发转换的核心函数控制 ADC 是否响应预先配置的硬件触发源如定时器输出比较、外部中断、EXTI 等是硬件触发模式下 ADC 转换的 “总开关”—— 仅当该函数使能后ADC 才会在硬件触发信号到来时执行转换。uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);//读取 ADC规则通道转换结果的核心函数直接读取 ADC 数据寄存器ADC_DR中的 12 位模数转换值是获取 ADC 采样结果的最终步骤 —— 无论采用软件触发、硬件触发、轮询或中断模式最终都需通过该函数获取实际的转换数值。void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);//用于使能 / 配置 ADC 模拟看门狗功能的核心函数模拟看门狗可监控 ADC 转换结果是否超出预设的上下阈值范围当结果超限后会触发标志位或中断适用于电压过压 / 欠压保护、传感器异常检测等场景如电池电压监控、温度超限报警。void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);//配置 ADC 模拟看门狗上下限阈值的核心函数用于设定 ADC 转换结果的 “正常范围”—— 当转换值超出该范围低于下限 / 高于上限时模拟看门狗会触发ADC_FLAG_AWD标志若使能中断则触发ADC_IT_AWD中断是电压超限保护、传感器异常检测的关键配置步骤。void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);//为 ADC 模拟看门狗指定单通道监控目标的专用函数仅在 “模拟看门狗配置为单通道监控模式”如ADC_AnalogWatchdog_SingleRegEnable时生效 —— 用于明确看门狗仅监控某一个特定的规则 / 注入通道而非所有通道是精准监控单一关键通道如电源电压、核心传感器的核心配置步骤。void ADC_TempSensorVrefintCmd(FunctionalState NewState);//用于使能 / 禁用芯片内部温度传感器和参考电压VREFINT通道的专用函数 —— 这两个通道属于 ADC 内部通道无需外部 GPIO默认处于禁用状态必须通过该函数使能后才能正常采集数据是实现芯片温度监测、ADC 参考电压校准的核心步骤。FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);//管理 ADC 状态标志和中断的核心接口分为 “标志位查询 / 清除” 和 “中断状态查询 / 清除” 两类 —— 用于判断 ADC 转换完成、模拟看门狗超限等事件以及清除对应状态避免重复触发是 ADC 轮询模式、中断模式的基础支撑。2.基础要点1.转换模式单次转换——产生标志位后直接结束 非扫描模式——只对序列1的通道进行转换 连续转换——产生标志位后仍会再次从头进行遍历 扫描模式——从序列1一直扫描直到到达给定的通道数目3.代码1.AD.h/c#ifndef __AD_H #define __AD_H void AD_Init(void); uint16_t AD_GetValue(void); #endif#include stm32f10x.h // Device header void AD_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC1时钟的分频此处为12MHZMAX值为14MHZ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_ModeGPIO_Mode_AIN;//模拟输出 GPIO_InitStruct.GPIO_PinGPIO_Pin_0;//端口选择0 GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz; GPIO_Init(GPIOA,GPIO_InitStruct);//GPIO口的配置初始化 //在序列一的位置写上通道0采样的时间为55Cycles5 ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5); ADC_InitTypeDef ADC_InitStruct; ADC_InitStruct.ADC_ContinuousConvModeDISABLE;//选择转换模式这里为单次转换 ADC_InitStruct.ADC_DataAlignADC_DataAlign_Right;//选择对齐方式这里是右对其 ADC_InitStruct.ADC_ExternalTrigConvADC_ExternalTrigConv_None;//选择使用软件触发 ADC_InitStruct.ADC_ModeADC_Mode_Independent;//ADC独立模式 ADC_InitStruct.ADC_NbrOfChannel1;//给定转换的总通道数目这里为1个通道 ADC_InitStruct.ADC_ScanConvModeDISABLE;//选择扫描模式这里为非扫描模式 ADC_Init(ADC1,ADC_InitStruct); ADC_Cmd(ADC1,ENABLE);//开启ADC1的电源 ADC_ResetCalibration(ADC1);//开始复位校准 while(ADC_GetResetCalibrationStatus(ADC1)SET);//复位校准完成后标志位置为RESET ADC_StartCalibration(ADC1);//开始校准 while(ADC_GetCalibrationStatus(ADC1)SET);//校准完成后标志位置为RESET } uint16_t AD_GetValue(void) { ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)RESET);//读取转化结束标志位EOC大约5.6us return ADC_GetConversionValue(ADC1);//读取DR寄存器后会自动将EOC标志位又置RESET }2.main函数#include stm32f10x.h // Device header寄存器头文件 #include Delay.h #include OLED.H #include AD.h uint16_t ADValue; float Voltage; int main(void) { OLED_Init(); AD_Init(); OLED_ShowString(1,1,ADValue:); OLED_ShowString(2,1,Voltage:0.00V); while(1) { ADValueAD_GetValue(); Voltage(float)ADValue/4095*3.3; OLED_ShowNum(1,9,ADValue,4); OLED_ShowNum(2,9,Voltage,1); OLED_ShowNum(2,11,(uint16_t)(Voltage*100)%100,2); Delay_ms(100); } }2.AD多通道1.基本要点采用传入通道参数的方法将序列一的通道进行更改从而实现单次转换得到多路的数值。2.代码1.AD.h/c(多通道)#ifndef __AD_H #define __AD_H void AD_Init(void); uint16_t AD_GetValue(uint8_t ADC_Channel); #endif#include stm32f10x.h // Device header void AD_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC1时钟的分频此处为12MHZMAX值为14MHZ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_ModeGPIO_Mode_AIN;//模拟输出 GPIO_InitStruct.GPIO_PinGPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//端口选择0123 GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz; GPIO_Init(GPIOA,GPIO_InitStruct);//GPIO口的配置初始化 ADC_InitTypeDef ADC_InitStruct; ADC_InitStruct.ADC_ContinuousConvModeDISABLE;//选择转换模式这里为单次转换 ADC_InitStruct.ADC_DataAlignADC_DataAlign_Right;//选择对齐方式这里是右对其 ADC_InitStruct.ADC_ExternalTrigConvADC_ExternalTrigConv_None;//选择使用软件触发 ADC_InitStruct.ADC_ModeADC_Mode_Independent;//ADC独立模式 ADC_InitStruct.ADC_NbrOfChannel1;//给定转换的总通道数目这里为1个通道 ADC_InitStruct.ADC_ScanConvModeDISABLE;//选择扫描模式这里为非扫描模式 ADC_Init(ADC1,ADC_InitStruct); ADC_Cmd(ADC1,ENABLE);//开启ADC1的电源 ADC_ResetCalibration(ADC1);//开始复位校准 while(ADC_GetResetCalibrationStatus(ADC1)SET);//复位校准完成后标志位置为RESET ADC_StartCalibration(ADC1);//开始校准 while(ADC_GetCalibrationStatus(ADC1)SET);//校准完成后标志位置为RESET } uint16_t AD_GetValue(uint8_t ADC_Channel)//根据传入的通道进行读取 { //在序列一的位置写上通道ADC_Channel采样的时间为55Cycles5 ADC_RegularChannelConfig(ADC1,ADC_Channel,1,ADC_SampleTime_55Cycles5); ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件触发 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)RESET);//读取转化结束标志位EOC大约5.6us return ADC_GetConversionValue(ADC1);//读取DR寄存器后会自动将EOC标志位又置RESET }2.main函数#include stm32f10x.h // Device header寄存器头文件 #include Delay.h #include OLED.H #include AD.h uint16_t AD0,AD1,AD2,AD3; float Voltage; int main(void) { OLED_Init(); AD_Init(); OLED_ShowString(1,1,AD0:); OLED_ShowString(2,1,AD1:); OLED_ShowString(3,1,AD2:); OLED_ShowString(4,1,AD3:); while(1) { AD0AD_GetValue(ADC_Channel_0); AD1AD_GetValue(ADC_Channel_1); AD2AD_GetValue(ADC_Channel_2); AD3AD_GetValue(ADC_Channel_3); OLED_ShowNum(1,5,AD0,4); OLED_ShowNum(2,5,AD1,4); OLED_ShowNum(3,5,AD2,4); OLED_ShowNum(4,5,AD3,4); Delay_ms(100); } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询