IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> MCU定时器复用 -> 正文阅读

[嵌入式]MCU定时器复用


一、复用思路

??对于MCU定时器可以实现定时中断,因此常用于定时处理某些功能。但是由于MCU中定时器数量有限,对于程序中存在较多定时处理功能时就显得捉襟见肘,因此需要一些其它方法来扩展定时器数量。
??在liunx编程中,我们可以使用clock()函数来获取程序的当前进程的运行时间,并通过end_t - start_t > timeout 来实现定时处理,那么MCU中是否也能这样处理呢?答案是可以的,但不能直接使用clock(),因为MCU并没有时钟节拍,使用clock()函数虽然能通过编译,但MCU却无法正常运行,因此需要用其它方法产生时钟节拍。
??有两种方法产生时钟节拍,一个是RTC,另一个是定时器。RTC虽然简单,初始化并使能RTC后只要循环读取相应寄存器即可实现定时功能,但由于RTC最小的时间节拍是秒,无法实现毫秒级别的定时,因此一般不使用。采用定时器虽然无法直接读取时间,但可在中断函数中更新时间信息,并在主程序中读取更新时间信息即可实现定时功能。

二、具体代码

??本代码为复旦微芯片MCU代码,除去定时器初始化代码外,其余代码几乎可用于任何MCU芯片。

定时器初始化(示例):

void Test_Etimx(ETIMx_Type* ETIMx)
{
	ETIM_InitTypeDef init_para;
	volatile uint08 EtimNum;

	EtimNum = ((uint32_t)ETIMx - ETIMER1_BASE)>>5;
	
	/* 内部信号1源选择GROUP1 */
	init_para.sig_src_para.SIG1SEL = ETIMx_ETxINSEL_SIG1SEL_GROUP1;		
	switch(EtimNum)
	{
		case 0:
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET1_APBCLK;		
			RCC_PERCLK_SetableEx( ET1CLK, ENABLE );		
			NVIC_DisableIRQ(ETIM1_IRQn);
			NVIC_SetPriority(ETIM1_IRQn,2);
			NVIC_EnableIRQ(ETIM1_IRQn);		
			break;
			
		case 1:
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET2_APBCLK;	
			RCC_PERCLK_SetableEx( ET2CLK, ENABLE );	
			NVIC_DisableIRQ(ETIM2_IRQn);
			NVIC_SetPriority(ETIM2_IRQn,2);
			NVIC_EnableIRQ(ETIM2_IRQn);			
			break;

		case 2:
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET3_APBCLK;	
			RCC_PERCLK_SetableEx( ET3CLK, ENABLE );	
			NVIC_DisableIRQ(ETIM3_IRQn);
			NVIC_SetPriority(ETIM3_IRQn,2);
			NVIC_EnableIRQ(ETIM3_IRQn);			
			break;

		case 3:
			init_para.sig_src_para.GRP1SEL = ETIMx_ETxINSEL_GRP1SEL_ET4_APBCLK;	
			RCC_PERCLK_SetableEx( ET4CLK, ENABLE );		
			NVIC_DisableIRQ(ETIM4_IRQn);
			NVIC_SetPriority(ETIM4_IRQn,2);
			NVIC_EnableIRQ(ETIM4_IRQn);	
			break;
		
		default:
			break;
	}
	
	init_para.sig_src_para.PRESCALE1 = clkmode - 1 + 99;    //100分频	
	init_para.ctrl_para.EXFLT = ENABLE;								
	init_para.ctrl_para.MOD = ETIMx_ETxCR_MOD_COUNTER;				
	init_para.ctrl_para.CASEN = DISABLE;							
	init_para.ctrl_para.EDGESEL = ETIMx_ETxCR_EDGESEL_RISING;		
	init_para.ctrl_para.CAPCLR = DISABLE;						
	init_para.ctrl_para.CMPIE = DISABLE;		
	init_para.ctrl_para.CAPIE = DISABLE;		
	init_para.ctrl_para.OVIE = ENABLE;			
	init_para.ctrl_para.INITVALUE = 0xffff - 8000;   //计数初值
	init_para.ctrl_para.CEN = DISABLE;	
	
	ETIMx_Init(ETIMx, &init_para);
	ETIMx_ETxCR_CEN_Setable(ETIMx, DISABLE);	
}

时钟节拍结构体(示例):

typedef struct{
	uint32_t min;			//分钟
	uint32_t sec;			//秒
	uint32_t msec;			//毫秒
}TIME_COUT;

定时器中断处理函数(示例):

void ETIM2_IRQHandler(void)
{
		if(SET == ETIMx_ETxIF_OVIF_Chk(ETIM2))
		{
			ETIMx_ETxIF_OVIF_Clr(ETIM2);
			timecout.msec = timecout.msec + 50;
			if(timecout.msec >= 1000){
				timecout.sec = timecout.sec + 1;
				timecout.msec = timecout.msec - 1000;
			}
			if(timecout.sec >= 60){
				timecout.min = timecout.min + 1;
				timecout.sec = timecout.sec - 60;
			}
		}
}

定时处理函数(示例):

void time_handler(void)
{
	static float start_t = 0;
	float end_t;
	uint32_t tempcnt;
	
	tempcnt = 8000 - (0xffff - ETIMx_ETxCNT_Read(ETIM2));
	end_t= (float)(timecout.min * 60 + timecout.sec) * 1000 + timecout.msec + tempcnt * TIMEBASE;
	
	/*定时器处理*/
	if((end_t - start_t ) > TIMEOUT){
		/*具体处理函数*/

		/*更新start_t */
		start_t  = end_t}
}

三、缺点说明

??由于该方法定时器中断只是用于时钟节拍计算,并不做具体的定时处理,具体的定时处理在time_handler()中进行,因此该方法只适用与定时要求不严格的场合,且定时精度取决于其它程序的执行时间。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:32:33  更:2021-10-28 12:34:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:54:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码