STM32_基础入门(十三)ADC

这篇具有很好参考价值的文章主要介绍了STM32_基础入门(十三)ADC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

嵌入式之路,贵在日常点滴

                                                                ---阿杰在线送代码

目录

一、ADC简介

二、ADC特点 

三、 ADC通道和引脚对应关系

四、 ADC框图

五、 ADC测量的电压范围

六、输入通道分类 

​​七、常用库函数 

八、库函数配置 

九、代码区 

单通道转换

         单通道转换DMA模式

多通道转换DMA模式


一、ADC简介

Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。

典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

二、ADC特点 

12位逐次逼近型的模拟数字转换器。
最多带3个ADC控制器
--》只有大容量的芯片有ADC3   注:ADC2不可以DMA
最多支持18个通道,可最多测量16个外部和2个内部信号源。
支持单次和连续转换模式
转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
通道0到通道n的自动扫描模式
自动校准
采样间隔可以按通道编程
规则通道和注入通道均有外部触发选项
转换结果支持左对齐或右对齐方式存储在16位数据寄存器
 ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)
 ADC供电要求:2.4V-3.6V
 ADC输入范围:VREF- ≤  VIN  ≤  VREF+

三、 ADC通道和引脚对应关系

STM32_基础入门(十三)ADC

四、 ADC框图

STM32_基础入门(十三)ADC

STM32_基础入门(十三)ADC

五、 ADC测量的电压范围

电压范围为: 0~3.3V

超出0~3.3V的电压怎么测?

六、输入通道分类 

外部的 16 个通道在转换的时候又分为规则通道注入通道,其中规则通道最多有 16路,注入通道最多有 4 路。那这两个通道有什么区别?在什么时候使用? 

规则通道:顾名思意,规则通道就是很规矩的意思,我们平时一般使用的就是这个通道。

注入通道:注入,可以理解为插入,插队的意思,是一种不安分的通道。它是一种在规则通道转换的时候强行插入要转换的一种。这点跟中断程序很像,都是不安分的主。所以,注入通道只有在规则通道存在时才会出现

STM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行。

(以下内容建议直接看数据手册)

STM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADC

七、常用库函数 

STM32_基础入门(十三)ADC

STM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADCSTM32_基础入门(十三)ADC

STM32_基础入门(十三)ADC

八、库函数配置 

开启 PA 口时钟和 ADC1 时钟,设置 PA1 为模拟输入。

      GPIO_Init();     

     APB2PeriphClockCmd();

复位ADC1,同时设置ADC1分频因子。

      RCC_ADCCLKConfig(RCC_PCLK2_Div6);

      ADC_DeInit(ADC1);

初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。

     void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)

使能ADC并校准。

       ADC_Cmd(ADC1, ENABLE);

⑤ 配置规则通道参数:

     ADC_RegularChannelConfig();

⑥开启软件转换:ADC_SoftwareStartConvCmd(ADC1);

⑦等待转换完成,读取ADC值。

   ADC_GetConversionValue(ADC1);

九、代码区 

单通道转换

使用ADC1的通道4去检测电压并把检测到的结果显示在OLED屏幕上。

*adc.c

 #include "adc.h"
 #include "delay.h"
  		   
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3																	   
void  Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC, ENABLE );	  
    //使能ADC1通道时钟 

    //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   

	//PA4 作为模拟通道输入引脚                         
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

    // 只使用一个ADC,属于单模式
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	
    // 禁止扫描模式,多通道才要,单通道不需要
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    //模数转换工作在单次转换模式(即软件转换启动功能启动一次转换一次)	
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	
    //转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	
    //ADC数据右对齐
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	
    //顺序进行规则转换的ADC通道的数目(有多少通道就写多少)
	ADC_InitStructure.ADC_NbrOfChannel = 1;	
	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
	ADC_Init(ADC1, &ADC_InitStructure);
  
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
	
	ADC_ResetCalibration(ADC1);	//使能复位校准  	 
	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束	
	ADC_StartCalibration(ADC1);	 //开启AD校准 
	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束 
}
				  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
  //设置指定ADC的规则组通道,一个序列,采样时间
    //ADC1,ADC通道,采样时间为239.5周期
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );		  			    
      
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);	//使能指定的ADC1的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束,转换结束EOC置一

	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}

//获得连续取times次后的平均值
u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(5);
	}
	return temp_val/times;
} 	
*main.c

#include "stm32f10x.h"	
#include "oled.h"
#include "adc.h"

u8 string[16] = {0};

int main(void)
{	
    //ADC采集变量
	u16 adcx;
	float temp;

    OLED_Init();			//初始化OLED  
	OLED_Clear(); 
	Adc_Init();		  		//ADC初始化

    while(1)
	{
        adcx = Get_Adc(ADC_Channel_4);//得到数字量
//		adcx = Get_Adc_Average(ADC_Channel_4,10);
		temp=(float)adcx*(3.3/4096);//转化为电压值
		sprintf(string,"temp:%.2f",temp);//将数据转换为字符串
		OLED_ShowString(6,6,string,16);//显示字符串,“string只能是字符串”
    }

}

单通道转换DMA模式

使用ADC1的通道4去检测电压并把检测到的结果显示在OLED屏幕上。文章来源地址https://www.toymoban.com/news/detail-439567.html

adc.c

#include "adc.h"
#include "delay.h"

u16 ADC_ConvertedValue;

void adc_int(void)
{
	ADC_InitTypeDef ADC_InitStructure;  
    GPIO_InitTypeDef GPIO_InitStructure;
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
	
	// 配置ADC时钟N狿CLK2的8分频,即9MHz	
	//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
 
	//PA4 作为模拟通道输入引脚
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
	ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值			
	
	// 只使用一个ADC,属于单模式  
    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);			// 初始化ADC
	
	//配置ADC 通道的转换顺序和采样时间
    //参数1:ADCx(选用哪个ADC;一般使用ADC1,ADC2没有DMA功能,ADC3只有大容量芯片才有)
    //参数2:选择第几通道  参数3:转换顺序  参数4:转换时间
	// 配置 ADC 通道转换顺序为1,第一个转换,采样时间为55.5个时钟周期
	ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);
    ADC_DMACmd(ADC1, ENABLE);	// 使能ADC DMA 请求
    ADC_Cmd(ADC1,ENABLE);     // 开启ADC ,并开始转换
		
	// 初始化ADC 校准寄存器  
    ADC_ResetCalibration(ADC1);
	// 等待校准寄存器初始化完成
    while(ADC_GetResetCalibrationStatus(ADC1))	;	
    ADC_StartCalibration(ADC1); // ADC开始校准                            
    while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成  
		
	// 由于没有采用外部触发,所以使用软件触发ADC转换 
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

void DMA_Configure(void)
{	 
   DMA_InitTypeDef DMA_InitStructure;
	
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);// 打开DMA时钟
	
   DMA_DeInit(DMA1_Channel1);   		// 复位DMA控制器   
	
   // 外设基址为:ADC 数据寄存器地址
   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;  
   // 存储器地址,实际上就是一个内部SRAM的变量
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;                                
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  // 数据源来自外设
   // 缓冲区大小为1,缓冲区的大小应该等于存储器的大小   多少个通道就写多少    	             
   DMA_InitStructure.DMA_BufferSize = 1;    
   // 外设寄存器只有一个,地址不用递增
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                   
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; // 存储器地址固定  
   // 外设数据大小为半字,即两个字节
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;   
   // 内存数据大小也为半字,跟外设数据大小相同
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; 
   // 循环传输模式  选择循环模式,有数据就一直会传输
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  
   // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   // 禁止存储器到存储器模式,因为是从外设到存储器	 
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;      
   DMA_Init(DMA1_Channel1, &DMA_InitStructure);// 初始化DMA  
  
   DMA_Cmd(DMA1_Channel1,ENABLE); // 使能 DMA 通道
}
main.c

#include "sys.h"	
#include "oled.h"
#include "adc.h"

u8 string[16] = {0};

// ADC1转换的电压值通过MDA方式传到SRAM
extern u16 ADC_ConvertedValue;

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal; 

int main(void)
{	
	delay_init();
	
	OLED_Init();			//初始化OLED  
	OLED_Clear(); 

	adc_int();
	DMA_Configure();
	
	while(1)
	{
		ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; 
        // 读取转换的AD值

		sprintf(string,"temp:%.2f",ADC_ConvertedValueLocal);//将数据转换为字符串
		OLED_ShowString(6,6,string,16);//显示字符串,“string只能是字符串” 	
	}
}

多通道转换DMA模式

adc.c

u16 ADC_ConvertedValue[6]={0,0,0,0};

void adc_int(void)
{
	ADC_InitTypeDef ADC_InitStructure;  
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
 
    GPIO_InitStructure.GPIO_Pin =             
    GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
	// 配置ADC时钟N狿CLK2的8分频,即9MHz	
    //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);
	
	// 只使用一个ADC,属于单模式
    ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; 
	// 扫描模式
    ADC_InitStructure.ADC_ScanConvMode=ENABLE; 
	// 连续转换模式 即调用一次就一直不间断转换
    ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; 
	// 不用外部触发转换,软件开启即可
    ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	// 转换结果右对齐
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;   
	// 转换通道个数
    ADC_InitStructure.ADC_NbrOfChannel =6;    						 
    ADC_Init(ADC1,&ADC_InitStructure);		// 初始化ADC
	
	// 配置ADC 通道的转换顺序和采样时间
	//参数1:ADCx(选用哪个ADC;一般使用ADC1,ADC2没有DMA功能,ADC3只有大容量芯片才有)
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);
	ADC_RegularChannelConfig(ADC1,ADC_Channel_1,2,ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2,3,ADC_SampleTime_55Cycles5);   
    ADC_RegularChannelConfig(ADC1,ADC_Channel_3,4,ADC_SampleTime_55Cycles5);  
    ADC_RegularChannelConfig(ADC1,ADC_Channel_4,5,ADC_SampleTime_55Cycles5);  
    ADC_RegularChannelConfig(ADC1,ADC_Channel_5,6,ADC_SampleTime_55Cycles5); 
		
    ADC_DMACmd(ADC1, ENABLE);	// 使能ADC DMA 请求
    ADC_Cmd(ADC1,ENABLE);     // 开启ADC ,并开始转换
		
	// 初始化ADC 校准寄存器  
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));// 等待校准寄存器初始化完成
    ADC_StartCalibration(ADC1); // ADC开始校准                                                                                               
    while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成  
		
	// 由于没有采用外部触发,所以使用软件触发ADC转换
	ADC_SoftwareStartConvCmd(ADC1,ENABLE);   
}

void DMA_Configure(void)
{	 
   DMA_InitTypeDef DMA_InitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);// 打开DMA时钟
	
   DMA_DeInit(DMA1_Channel1);   		// 复位DMA控制器  
	
   // 外设基址为:ADC 数据寄存器地址
   DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;
   // 存储器地址
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
   // 数据源来自外设 
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 
   // 缓冲区大小,应该等于数据目的地的大小  即理解为有多少个通道转换就写多少
   DMA_InitStructure.DMA_BufferSize = 6;      
   // 外设寄存器只有一个,地址不用递增
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
   // 存储器地址递增
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
   // 外设数据大小为半字,即两个字节
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
   // 内存数据大小也为半字,跟外设数据大小相同
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
   // 循环传输模式   选择循环模式,有数据就一直会传输
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
   // DMA 传输通道优先级为高,当使用一个DMA通道时,优先级设置不影响
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;  
   //禁止存储器到存储器模式,因为是从外设到存储器 
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;     
   DMA_Init(DMA1_Channel1, &DMA_InitStructure);// 初始化DMA
   
   DMA_Cmd(DMA1_Channel1,ENABLE); // 使能 DMA 通道
}
main.c

#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "adc.h"

// ADC1转换的电压值通过MDA方式传到SRAM
extern u16 ADC_ConvertedValue[6];

// 局部变量,用于保存转换计算后的电压值 	 
float ADC_ConvertedValueLocal[6]; 

int main(void)
{ 
	u8 i;
	
    delay_init();
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	SysTick_Config(SystemCoreClock/1000);
	uart_init(9600);
	adc_int();
	DMA_Configure();
    
    while(1)
	{ 
		for(i=0;i<6;i++)
		{
            ADC_ConvertedValueLocal[i] =(float) ADC_ConvertedValue[i]/4096*3.3;
			
            
			printf("\r\n CH%d value = %f V \r\n",(u16) i,ADC_ConvertedValueLocal[i]);
			delay_ms(50);
		}
	}
}

到了这里,关于STM32_基础入门(十三)ADC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯嵌入式基础模块——LCD显示器的基本使用(新板)STM32G431(HAL库开发)

            在蓝桥杯嵌入式官方给我们提供好了,LCD显示的底层源码,我们只需要,记住里面的API函数,会用这些函数就行。         在官方给的资料中找到这个文件名字DK117_G4 Data Packet-开发板驱动文件里面就是所有的底层文件有两种类型,一种是基于HAL库的一种是标准库

    2024年02月09日
    浏览(63)
  • stm32嵌入式实验考核

    STM32 实验考核题目 1. 利用 STM32 小板实现:控制外接 LED 灯每隔 3 秒钟亮暗变换,同 时在 PC 机上显示 MCU 的计时时间,MCU 的初始时间由 PC 机 方设置。 2. 利用 STM32 小板实现:利用导线外接 GPIO 口模拟 2 个按键输入, 根据输入组合的四种情况,分别控制三色灯四种流水灯效果

    2024年02月03日
    浏览(53)
  • 嵌入式 STM32 通讯协议--MODBUS

    目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议  二、MODBUS通信协议 1、概述 2、MODBUS帧结构  协议描述 3、MODBUS数据模型   4、MODBUS事务处理的定义 5、MODBUS功能码  6、功能码定义   7、MODBUS数据链路层 8、MODBUS地址规则  9、MODBUS帧描述 10、MODBUS两种

    2024年02月11日
    浏览(66)
  • STM32的时钟系统(嵌入式学习)

    时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此时钟对于计算机系统是至关重要的,通常时钟系

    2024年02月16日
    浏览(50)
  • 嵌入式——新建STM32工程(标准库)

    目录 一、初识标准库 1.CMSIS标准及库层级关系 2.库文件介绍 (1)Libraries文件夹 ①CMSIS文件夹 ②STM32F10x_Std_Periph_Driver文件夹 ③ 在用库建立一个完整的工程时,还需要添加stm32f10x_it.c、 stm32f10x_conf.h 和 system_stm32f10x.c文件 (2)Project文件夹 (3)Utilities文件夹 3.库各文件之间的关

    2024年01月23日
    浏览(59)
  • STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(69)
  • 嵌入式项目分享 stm32智能运动计步系统 - 物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(76)
  • 嵌入式学习笔记——STM32的时钟树

    在之前的所有代码编程的过程中,似乎每次都绕不开一个叫做时钟使能的东西,当时我们是在数据手册上直接看其挂接在那条时钟线上的,那么STM32内部的时钟到底是怎么一个构型呢,本文来对此做一个介绍。 老规矩,一个新的名词出现,首先需要搞清楚它是个啥,下图中对

    2024年02月02日
    浏览(58)
  • STM32的中断系统详解(嵌入式学习)

    中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。 中断可以分为内部

    2024年02月12日
    浏览(75)
  • STM32&ARM体系结构(嵌入式学习)

    STM32是意法半导体(STMicroelectronics)公司推出的一系列32位ARM Cortex-M微控制器(MCU)产品系列。它们基于ARM架构,并且具有广泛的应用领域,包括工业自动化、消费电子、医疗设备、通信、汽车电子等。 STM32系列提供了多个产品系列,以满足不同应用需求和性能要求。其中常见

    2024年02月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包