嵌入式学习笔记——PWM与输入捕获(下)

这篇具有很好参考价值的文章主要介绍了嵌入式学习笔记——PWM与输入捕获(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

上一篇介绍了通用定时器的输出比较部分,这一篇再来介绍一下输入捕获的相关内容。

输入捕获的概述

输入捕获,见名知意,就用来对输入信号进行捕获的,说到捕获输入信号,之前介绍过一个叫做外部中断的片上外设,它的作用也是捕获输入;它们的不同在于,外部中断捕获的只是边沿,而定时器的输入捕获,捕获的是信号的时间信息,可以用来测试脉冲宽度、高电平时间、低电平时间等,还可以利用这个输入捕获的功能来获取一些模块采集的数据,典型代表就是HC-SR04超声波模块。
老规矩还是看看AI对于输入捕获的简介:
嵌入式学习笔记——PWM与输入捕获(下)
上面提到的四个部分都是在配置过程中需要进行编程来实现的,
输入捕获:捕获输入到芯片中的脉冲宽度,捕获的是单个脉冲的宽度
捕获的原理:通过边沿触发捕获
可以通过计算得到:上升沿和下降之间的时间
输出比较:调整脉冲宽度
输入捕获:计算脉冲宽度 捕获一个脉冲的有效时间

框图

对输入捕获有了一个大致的概念后,来看看框图,简易版的框图再上上篇中提到过,那个还看不出具体的配置流程,所以这里再将详细的框图做个分析,和输出比较一样,输入捕获部分的详细框图也很复杂,具体的如下图所示:
嵌入式学习笔记——PWM与输入捕获(下)
这里还是将框图拆分开了看。

输入通道部分

首先来看框图的前半段,输入信号进来后,第一个需要经过的就是数字滤波器,如下图红框中的位置。
嵌入式学习笔记——PWM与输入捕获(下)
该滤波器是通过TIMx_CCMR1的ICF[3:0]位控制的,功能是“每N个事件视为一个有效边沿”,举个栗子来说就是,假设编程了这个N为4,而我们检测的高电平有效,那么就需要四个高电平才会生成一次有效边沿。
具体的控制寄存器描述如下:
嵌入式学习笔记——PWM与输入捕获(下)
需要注意的是,这里的频率分为了两部分,一部分是fck_INT也就是初始化的时钟,另一部分是fDTS,这里的f都是频率的意思,是对应的周期分之一;这里的fdts与fck_int的关系取决于TIMx 控制寄存器 1 (TIMx_CR1)的第八第九位的配置,这里配置的是周期的关系。t=1/f.
嵌入式学习笔记——PWM与输入捕获(下)
经过数字滤波器后,信号需要经过一个边沿计测器,检测对应的上升沿还是下降沿,注意上方或门以及后面的一个向上的箭头都是到从模式控制器的,与输入捕获无关,所以可以忽略。
嵌入式学习笔记——PWM与输入捕获(下)
进一步简化后如下图所示,通道1的输入信号经过边沿检测器后,会有一个数据选择器,这个选择器的控制寄存器是CC1P/CC1NP。
嵌入式学习笔记——PWM与输入捕获(下)
对应的是TIMx_CCER寄存器的第一位与第三位,这里需要特别注意,虽然也是两位进行配合,来控制此处的是上升沿有效、下降沿有效还是双边沿都有效,但是是间隔开的两位,位2是不做配置的,在编写代码的时候需要特别小心。
嵌入式学习笔记——PWM与输入捕获(下)
然后就是后面橙色框内的大的数据选择器,这个选择器是用来选输入信号的,一共三个输入,根据上上篇的简略框图,我们知道这三个输入分别是来自通道一的输入信号、来自通道二的输入信号,以及从模式控制器来的信号;此时配置的是输入捕获,而且为了避免交叉使用通道导致配置出错,后两个输入信号在此处是不考虑的,可以直接不看。也就是说,在配置过程中,需要将TIMx_CCMR1的CC1s的两位配置为“01”——选择通道一作为输入。
嵌入式学习笔记——PWM与输入捕获(下)
最后就是蓝色框内的分频器了,这个分频器的作用于前面的数字滤波器的效果类似,假设配置为2分频,则需要有两个对应事件产生才会生成一个有效边沿。一般都配置为了不分频,检测到一个边沿就进行捕获。他的控制寄存器对应的是TIMx_CCMR1的IC1PSC的两位:
嵌入式学习笔记——PWM与输入捕获(下)
最后还有一个控制器,TIMx_CCER的CC1E控制位,这个想必大家也都猜到了,是使能位的意思,细心的同学可能发现了,上一篇的PWM输出,在输出通道最后也是这个CC1E位做的使能,其实他们使用一个寄存器,只是在不同模式中有着不同的含义。
嵌入式学习笔记——PWM与输入捕获(下)

比较捕获寄存器与事件生成

在输入捕获中,除了上面的通道配置以外还有两个需要配置的,如下图,第一个框内CCR1比较捕获寄存器需要写入对应的比较值,这与PWM模式下的CCR1的写法其实一样。
嵌入式学习笔记——PWM与输入捕获(下)
还有一个是CC1G,这个对应的是TIMx 事件生成寄存器 (TIMx_EGR)的第1位,这里后面是个或门,由于CC1E和IC1PS已经配置了,上面的那个输入是真,所以这一位其实不配置也可以。
嵌入式学习笔记——PWM与输入捕获(下)
至于时基部分,与之前的一样,所以在此就不做赘述了,接下来总结一下具体使用到的寄存器有哪些。

寄存器

1.TIMx 控制寄存器 1 (TIMx_CR1):
写法:TIMx->CR1
位 9:8 CKD:时钟分频 (Clock division)
和滤波器的采样频率有关

2.TIMx 从模式控制寄存器 (TIMx_SMCR)
写法:TIMx->SMCR
时钟源选择

3.TIMx DMA/中断使能寄存器 (TIMx_DIER)
写法:TIMx->DIER
配置更新中断
配置捕获中断

4.TIMx 事件生成寄存器 (TIMx_EGR)
写法:TIMx->EGR
人为生成更新事件

5.TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1)
写法:TIMx->CCMR1
位 1:0 CC1S:捕获/比较 1 选择 (Capture/Compare 1 selection)
选择输入还是输出
选择输入中的第一个信号源

位 3:2 IC1PSC:输入捕获 1 预分频器 (Input capture 1 prescaler)
配置无预分频

位 7:4 IC1F:输入捕获 1 滤波器 (Input capture 1 filter)
选择对应采样频率 1111

6.TIMx 捕获/比较使能寄存器 (TIMx_CCER)
写法:TIMx->CCER
位 0 CC1E:捕获/比较 1 输出使能 (Capture/Compare 1 output enable)。
使能位

位 1 CC1P:捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)。
位 3 CC1NP:捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)。
可读可写
00:上升沿触发
01:下降沿触发
11:双边触发 ----- 通过进入中断的次数来判断

编程思路

根据上面的框图解析以及寄存器介绍,我们可以大致总结出配置为输入捕获是时的代码思路,
伪代码:

输入捕获初始化函数
{
  //打开时钟  GPIO  TIM5
  
  GPIO控制器配置
  //GPIO模式
  复用功能寄存器

  定时器的时基单元
  //更新禁止
  //更新请求源
  //关闭单脉冲
  //方向
  //重装载值得影子寄存器
  //分频    4分频
  //选择时钟源
  //预分频器配置
  //重装载值配置
  //产生更新事件
  
  定时器得输入部分
  //选择输入模式  TI1
  //输入捕获分频器 无分频器
  //采样频率配置   1111
  //边沿触发
  //使能捕获

  中断配置
  //更新中断使能
  //捕获中断使能
  //NVIC控制器
  //计数器使能
}

而对应的功能则需要到对应的中断服务函数去进行,中断服务函数的思路如下:

中断服务函数
{
    判断位更新中断
    {
        N++;//记录产生更新事件的次数,依次来计算时间
    }
    判断为捕获中断
    {
       判断为上升沿捕获   
       {
          N=0;
          或者这时刻得CCR得值
          切换下降沿捕获  //flag=1
       }




       判断为下降沿捕获 
       {
          直接计算整个时间
          切换回上升沿捕获 下一次进来还是先捕获上升沿
       }
    }
}

实际需求

上面总结了输入捕获的编程流程,这里借助两个小需求,来具体编程实现对应的功能。
需求1:
检测开发板上Key_UP的按下时间,并通过串口输出。
需求分析:
首先,要检测按键按下的时间,肯定需要使用到上面的输入捕获功能了,具体怎么实现呢,第一步查看原理图找到KEY_UP按下时的输入信号是什么样子的。
嵌入式学习笔记——PWM与输入捕获(下)
如上图所示,在按键输入的时候使用过这个按键,当时是配置为了下拉,使得空闲状态是低电平,按下按键会产生一个脉冲,我们需要捕获时间长度的就是这个高脉冲的时间。具体的捕获过程应该是:

  1. 捕获按下时的高电平,并记录此时的计数值;
  2. 记录高电平期间产生的更新事件的个数(也就是计数器从0计数到重装载值的循环次数);
  3. 记录松手时的计数器的计数值,
  4. 计算时间:更新事件的次数X重装载值+松手时的计数器值-按下时的计数器值

嵌入式学习笔记——PWM与输入捕获(下)

举个栗子:假设定时器的分频系数是84分频,每秒会计数84M/84=1 000 000次,重装载数是1000;也就是每1ms计数1000次,每一次计数时间等于1us;
此时按键按下时对应的计数值是800,从按下按键到松手期间一共产生了6个更新事件,松手时的计数值为400;则此次按键按下的时间为:
TIME = 6*1000+400-800=5600us=5.6ms

配置流程

分析清楚了捕获过程后,我们来看看具体的配置流程,由于定时器是片上外设,捕获按键按下时常需要有GPIO的参与,所以对应的GPIO需要配置为复用模式。前面提到过,通用定时器至少都有两个通道,怎么知道KEY_UP具体的定时器和通道是哪个呢,这就有需要使用到引脚复用表了。通过查询原理图,或者根据经验,KEY_UP的引脚应该是GPIOA0;在引脚复用表中可以看出它对应的是TIM5的CH1。
嵌入式学习笔记——PWM与输入捕获(下)

打开对应的时钟

根据以前的配置经验,第一步应该打开对应的片上外设的时钟,GPIOA的对应的时钟线是AHB1;TIM5对应的时钟线是APB1,然后到对应的编程手册找到对应位,写入1即可,具体的配置请看后面的代码。

配置GPIO为复用模式

打开时钟后,就需要将GPIOA的0号管脚配置为复用模式,且要对照复用表映射到对应的功能,TIM5的CH1,GPIOA0对应的应该是低位的复用功能寄存器的0-3四位,写入AF2对应的0010即可配置为复用TIM5的通道1。

定时器的时基部分配置

紧接着就是定时器的时基部分了,这个也是很熟悉的了,前面配置过多次,需要配置CR1、SMCR、预分频和重装载而且还需要手动操作EGR产生一次更新事件,让数据写入影子寄存器已生效。

定时器输入通道部分配置

再这后就是输入通道的配置了,具体的配置流程参考上面的框图流程,主要配置CCMR1、CCER。

定时器中断配置

这需要使用到两个中断,一个是更新事件的中断,用来记录脉冲的期间内的更新事件个数,还有一个是捕获中断,利用捕获中断来获取对应边沿的计数器值。
再就是中断源使能,优先级配置,最后的最后,一定不要忘记使能计数器。

代码:

/*******************************
函数名:Time5_Interrupt
函数功能:Time5_上升沿捕获
函数形参:u32 arr   u16 psc预分频系数
函数返回值:void
备注:
预分频系数  重装载值
********************************/
void Time5_Capture(u16 psc, u32 arr)
{
/*-----------开始时钟使能-----------------------------------------------------------------*/
	RCC->AHB1ENR |=(1<<0);//开启GPIOA对应的时钟
	RCC->APB1ENR |=(1<<3);//开启TIM5对应的时钟
/*-----------初始化GPIO-----------------------------------------------------------------*/
	GPIOA->MODER &=~(3<<0);
	GPIOA->MODER |=(1<<1);//GPIOA为复用模式
	
	GPIOA->AFR[0] &=~(0xf<<0);
	GPIOA->AFR[0] |=(0X2<<0);//GPIOA复用为TIM5
/*-----------时基配置-----------------------------------------------------------------*/
	TIM5->CR1 &=~(0Xf<<1);	//更新禁止,更新请求源,关闭单脉冲,向上计数
	TIM5->CR1 |=(1<<7);     //重装载影子寄存器
	TIM5->CR1 &=~(3<<8);    //不分频
//	TIM5->CR1 |=(2<<8);			//四分频
	
	TIM5->SMCR &=~(7<<0);   //选择内部时钟
	TIM5->PSC = psc-1;			//预分频值
	TIM5->ARR = arr-1;      //重装载值
	TIM5->EGR |= (1<<0);//更新事件,写入预分频和重装载值
/*-----------定时器输入部分-----------------------------------------------------------------*/	
	TIM5->CCMR1 &=~(0X3<<0);//
	TIM5->CCMR1 |=(1<<0);//模式选择输入 TI1线
	TIM5->CCMR1 &=~(3<<2);//输入捕获无预分频
	TIM5->CCMR1 &=~(0XF<<4);
	TIM5->CCMR1 |=(0xf<<4);//采样频率为最低1111
	TIM5->CCER &=~(1<<1);//上升沿触发
	TIM5->CCER &=~(1<<3);//上升沿触发
	TIM5->CCER |=(1<<0);//捕获使能
/*-----------中断配置-----------------------------------------------------------------*/	
	TIM5->DIER |=(1<<0);//更新中断使能
	TIM5->DIER |=(1<<1);//捕获中断使能
	
/*-----------NVIC配置-----------------------------------------------------------------*/				
	u32 pri=NVIC_EncodePriority(7-2,2,3);
	NVIC_SetPriority(TIM5_IRQn,pri);
	NVIC_EnableIRQ(TIM5_IRQn);
	
	TIM5->CR1 |=(1<<0);//使能计数器
}

实现功能的中断服务函数:



/*******************************
函数名:TIM5_IRQHandler
函数功能:定时器5中断服务函数函数
函数形参:无
函数返回值:void
备注:
********************************/
void TIM5_IRQHandler(void)
{
	static u32 cnt;
	static u32 cnt_data;
	static u32 timer=0;
	if(TIM5->SR & (1<<0))//更新中断
	{
		TIM5->SR &=~(1<<0);
		cnt++;//更新中断的次数
	}
	if(TIM5->SR &(1<<1))//捕获中断
	{
		TIM5->SR &=~(1<<1);
		if(!(TIM5->CCER&(1<<1)))
		{
			cnt=0;//让更新中断的次数清零
			cnt_data = TIM5->CCR1;//获取当前值
			TIM5->CCER |=(1<<1);//下降升沿触发
		}
		else if(TIM5->CCER & (1<<1))
		{
			timer =cnt*1000-cnt_data+TIM5->CCR1;
			if(timer/1000>30)//将抖动的误触发舍弃
			{
				printf("按键按下时间为%d\r\n",timer/1000);//单位是MS
			}
			TIM5->CCER &=~(1<<1);//上降升沿触发
		}
	}
} 

运行效果:

嵌入式学习笔记——PWM与输入捕获(下)

需求2

利用HC-SR04实现超声波测距。
需求分析:
这里使用到了超声波模块,首先一定要看看他对应的手册,如下图,简介里面我们需要注意的描述,一个是测量周期,最低最低50ms,也就是说,采集一次后最低要给它50ms的休息时间才可以开始下一次采集,然后就是说它支持UART、IIC、单总线的协议,但是需要修改对应的电阻,这里我们不改,就用它最原始的通信方式。
嵌入式学习笔记——PWM与输入捕获(下)

测试时序图

在手册的后面有一个GPIO模式的时序图,这里就告诉了我们测距流程,中间红色框的那一条线是模块内部的,不需要我们操作,也就是说,要驱动这个模块,我们需要使用到的就是两个脚一个触发信号一个输出响应信号。
嵌入式学习笔记——PWM与输入捕获(下)
注意距离的计算是根据模块输出的高电平脉冲信号的时间T来计算的,说白了就是采集超声波模块输出的高电平时间,利用这个时间与音速的关系就可计算出对应的距离。高电平时间的采集与上一个需求中的按键按下时间是一样的。
只是在这个模块需要我们提供一个触发信号后才会输出对应的脉冲,刚刚的按键是按下就会有对应的脉冲。
嵌入式学习笔记——PWM与输入捕获(下)

选择GPIO

这个模块由于是外接,所以可以由我们自己选择管脚来实现,其中需要一个GPIO配置为通用推挽输出为Trlg提供触发信号;还需要一个具有定时器捕获通道GPIO来采集超声波模块Echo脉冲输出脚的脉冲持续的时间。
还是打开引脚复用表进行查询,
嵌入式学习笔记——PWM与输入捕获(下)
这里笔者选用了PD12作为输入捕获,为了方便,选择了PD13作为脉冲触发信号。
具体的配置代码如下:

#include "Ultrasonic.h"
/*******************************************
*函数名    :Ult_Init
*函数功能  :超声波初始化函数
*函数参数  :void 
*函数返回值:无
*函数描述  :
PD12-------检测电平时间
PD13-------发送起始信号通用模式
*********************************************/
void Ult_Init(void)
{
	Time4_Capture(84,1000);//定时器4的输入捕获(用于超声波检测)
	
	GPIOD->MODER &=~(3<<26);
	GPIOD->MODER |=(1<<26);//GPIOD13为通用模式
	
	/*端口输出推挽模式*/
	GPIOD->OTYPER &= ~(1<<13);
	/*端口输出速度2MHz*/
	GPIOD->OSPEEDR &= ~(1<<26);//清零OSPEEDR
	GPIOD->PUPDR   &= ~(1<<26);//默认无上下拉
	/* 端口输出寄存器*/
	GPIOD->ODR &=~(1<<13);//置零拉低
}

/*******************************
函数名:Time4_Interrupt
函数功能:Time4_上升沿捕获
函数形参:u16 arr   u16 psc预分频系数
函数返回值:void
备注:
预分频系数  重装载值
********************************/
void Time4_Capture(u16 psc, u16 arr)
{
/*-----------开始时钟使能-----------------------------------------------------------------*/
	RCC->AHB1ENR |=(1<<3);//开启GPIOD对应的时钟
	RCC->APB1ENR |=(1<<2);//开启TIM4对应的时钟
/*-----------初始化GPIO-----------------------------------------------------------------*/
	
	GPIOD->MODER &=~(3<<24);
	GPIOD->MODER |=(1<<25);//GPIOD12为复用模式
	
	GPIOD->AFR[1] &=~(0xf<<16);
	GPIOD->AFR[1] |=(0X2<<16);//GPIOD12复用为TIM4
	
/*-----------时基配置-----------------------------------------------------------------*/
	TIM4->CR1 &=~(0Xf<<1);	//更新禁止,更新请求源,关闭单脉冲,向上计数
	TIM4->CR1 |=(1<<7);     //重装载影子寄存器
	TIM4->CR1 &=~(3<<8);    //不分频
//	TIM5->CR1 |=(2<<8);			//四分频
	
	TIM4->SMCR &=~(7<<0);   //选择内部时钟
	TIM4->PSC = psc-1;			//预分频值
	TIM4->ARR = arr-1;      //重装载值
	TIM4->EGR |= (1<<0);//更新事件,写入预分频和重装载值
/*-----------定时器输入部分-----------------------------------------------------------------*/	
	TIM4->CCMR1 &=~(0X3<<0);//
	TIM4->CCMR1 |=(1<<0);//模式选择输入 TI1线
	TIM4->CCMR1 &=~(3<<2);//输入捕获无预分频
	TIM4->CCMR1 &=~(0XF<<4);
	TIM4->CCMR1 |=(0xf<<4);//采样频率为最低1111  84 000 000/32/8
	TIM4->CCER &=~ (1<<1);//上升沿触发
	TIM4->CCER &=~ (1<<3);//上升沿触发
	TIM4->CCER |=(1<<0);//捕获使能
/*-----------中断配置-----------------------------------------------------------------*/	
	TIM4->DIER |=(1<<0);//更新中断使能
	TIM4->DIER |=(1<<1);//捕获中断使能
	
/*-----------NVIC配置-----------------------------------------------------------------*/				
	u32 pri=NVIC_EncodePriority(7-2,2,3);
	NVIC_SetPriority(TIM4_IRQn,pri);
	NVIC_EnableIRQ(TIM4_IRQn);
	
	TIM4->CR1 |=(1<<0);//使能计数器
}

//头文件
#ifndef _ULTRASONIC_H
#define _ULTRASONIC_H
#include "stm32f4xx.h"
#define TRIG_OFF GPIOD->ODR &=~(1<<13);//置零拉低对应端口
#define TRIG_ON GPIOD->ODR |= (1<<13);//置1拉高对应端口
void Ult_Init(void);
void Time4_Capture(u16 psc, u16 arr);

#endif

主函数中产生触发信号:每隔50ms产生一次触发信号。
嵌入式学习笔记——PWM与输入捕获(下)
中断服务函数实现功能:

/*******************************
函数名:TIM4_IRQHandler
函数功能:定时器4中断服务函数函数
函数形参:无
函数返回值:void
备注:
********************************/
void TIM4_IRQHandler(void)
{
	static u32 cnt;
	static u32 cnt_data;
	static float timer=0;
	if(TIM4->SR & (1<<0))//更新中断
	{
		TIM4->SR &=~(1<<0);
		cnt++;//更新中断的次数
	}
	if(TIM4->SR &(1<<1))//捕获中断
	{
		TIM4->SR &=~(1<<1);
		if(!(TIM4->CCER&(1<<1)))
		{
			cnt=0;//让更新中断的次数清零
			cnt_data = TIM4->CCR1;//获取当前值
			TIM4->CCER |=(1<<1);//下降沿触发
		}
		else if(TIM4->CCER & (1<<1))
		{
			timer =cnt*1000-cnt_data+TIM4->CCR1;
			printf("物体的距离为:%.2fcm\r\n",timer/58.0f);
			TIM4->CCER &=~(1<<1);//上升沿触发
		}
	}
}

实现效果:

嵌入式学习笔记——PWM与输入捕获(下)

总结

关于定时器输入捕获与输出比较的介绍就记录到这,从这开始,配置都会比之前的复杂,写起来也会比较麻烦,所以更新速度会变慢,大家谅解,然后就是文中如有不足欢迎批评指正。

M4系列目录

1.嵌入式学习笔记——概述
2.嵌入式学习笔记——基于Cortex-M的单片机介绍
3.嵌入式学习笔记——STM32单片机开发前的准备
4.嵌入式学习笔记——STM32硬件基础知识
5.嵌入式学习笔记——认识STM32的 GPIO口
6.嵌入式学习笔记——使用寄存器编程操作GPIO
7.嵌入式学习笔记——寄存器实现控制LED小灯
8.嵌入式学习笔记——使用寄存器编程实现按键输入功能
9.嵌入式学习笔记——STM32的USART通信概述
10.嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置
11.嵌入式学习笔记——STM32的USART收发字符串及串口中断
12.嵌入式学习笔记——STM32的中断控制体系
13.嵌入式学习笔记——STM32寄存器编程实现外部中断
14.嵌入式学习笔记——STM32的时钟树
15.嵌入式学习笔记——SysTick(系统滴答)
16.嵌入式学习笔记——M4的基本定时器
17.嵌入式学习笔记——通用定时器
18.嵌入式学习笔记——PWM与输入捕获(上)
19.嵌入式学习笔记——PWM与输入捕获(下)
20.嵌入式学习笔记——ADC模数转换器
21.嵌入式学习笔记——DMA
22.嵌入式学习笔记——SPI通信
23.嵌入式学习笔记——SPI通信的应用
24嵌入式学习笔记——IIC通信文章来源地址https://www.toymoban.com/news/detail-461232.html

到了这里,关于嵌入式学习笔记——PWM与输入捕获(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【嵌入式学习笔记】嵌入式入门2——中断(外部中断)

    打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断 作用1: 实时控制在确定时间内对相应事件作出响应 ——定时器中断 作用2: 故障处理检测到故障,需要第一时间处理 ——外部中断 作用3: 数据传输不确定数据何时会来 ——串口中断

    2024年02月08日
    浏览(74)
  • 嵌入式PWM实验报告

    实验报告书 一、实验内容与目的 实验内容 : 通过对 Exynos4412 的 PWM 的操作,控制实验箱的蜂鸣器实现发声,并播放音乐。 实验目的 : 掌握使用 Cortex-A9 控制 PWM 的方法。 掌握 Cortex-A9 的 PWM 寄存器的配置方法。 掌握驱动的编写步骤。 熟悉 VMware+RedHat+XShell+ARM-Linux 交叉编译开

    2024年02月07日
    浏览(49)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(87)
  • 嵌入式学习笔记汇总

    本文整理STM32、STM8和uCOS-III的所有文章链接。 源码:mySTM32-learn STM32学习笔记(1)——LED和蜂鸣器 STM32学习笔记(2)——按键输入实验 STM32学习笔记(3)——时钟系统 STM32学习笔记(4)——NVIC中断优先级管理和外部中断EXTI STM32学习笔记(5)——系统定时器SysTick STM32学习笔

    2023年04月20日
    浏览(73)
  • 嵌入式学习笔记——SPI通信

    之前已经介绍了STM32的ADC、DMA、EXTI、TIME、NVIC、USART以及普通IO模式,此系列笔者还打算写最后三个大的内容,分别是SPI通信、IIC通信以及看门狗,后面就看大家的需求了,需要什么可以留在评论区,本文首先来介绍SPI的有关知识。 在通信协议分类的介绍中,提到过SPI,它是一

    2023年04月09日
    浏览(48)
  • 嵌入式学习笔记——IIC通信

    本文接着之前的M4系列介绍,对另外一个十分常见的通信总线进行一个介绍,就是IIC总线。 首先,还是找个免费劳动力来做一个官方的介绍,下面这一段话非常全面的介绍了IIC的各个特征,用之前提到的通信特征来总结,IIC是一种串行,同步,半双工,板级有线通信。与SPI对

    2024年02月06日
    浏览(77)
  • 【嵌入式】Thumb指令集(学习笔记)

    ARM开发工具完全支持Thumb指令,应用程序可以灵活的将ARM和Thumb子程序混合编程以便在例程的基础上提高性能或代码密度。在编写Thumb指令时,先要用伪指令CODE16声明(ADS的编译环境下),而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。 Thumb指令集编码如下:

    2023年04月22日
    浏览(48)
  • 嵌入式学习笔记——SysTick(系统滴答)

    上一篇中,介绍了关于STM32F407的时钟系统,在了解了系统的时钟后,最重要的内容就是搞定定时器的操作,本文从最基本的定时器,也是内核里面自带的一个定时器——SysTick(系统滴答)来进行介绍。旨在搞清楚什么是系统滴答,系统滴答有什么用,系统滴答怎么用。 SysTick这

    2024年01月21日
    浏览(46)
  • 【嵌入式算法】学习笔记(一):数字滤波算法

    最近在做直流电机的毕设中,由于需要采集转速,电流,电压,温度等参数,常规的采集容易受到干扰,所以特意复习了一下关于数字滤波有关的知识,并作出相应的整理。 本文对数字滤波进行简单介绍,讲解七种常用的滤波算法并用C语言实现,并比较其优缺点 。由于篇幅

    2023年04月22日
    浏览(97)
  • 嵌入式学习笔记(17)代码重定位实战 上篇

    3.5.1任务:在iSRAM中将代码从0xd0020010重定位到0xd0024000 注解:本练习对代码本身运行无实际意义,我们做这个重定位纯粹是为了练习重定位技能。但是某些情况重定位就是必须的,譬如在uboot中。 3.5.2思路 (1)通过链接脚本将代码链接到0xd0024000(链接地址) (2)使用dnw下载时将

    2024年02月09日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包