历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2021年09月30日 | stm8s 定时器1 延时_STM8L1xx利用定时器实现毫秒和微妙延时

2021-09-30 来源:eefocus

采用单片机的定时计数器进行毫秒和微妙级延时,精度较准。检测溢出时产生的标志位来判断延时到达。下面以STM8L101芯片为例及配合代码说明。


一、实现原理:


1、初始化Timer2时钟源(附上相应代码)


void TIM2Init (void)


{

TIM2_DeInit ();


CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);


TIM2->CR1 &= ((uint8_t)(~TIM_CR1_CMS)) & ((uint8_t)(~TIM_CR1_DIR));


TIM2->CR1 |= ( (TIM2_CounterMode_Up) | (TIM_CR1_ARPE) );               /*counter up, enable Auto-Reload*/


TIM2_SetCounter(0x00);


TIM2->IER &= (~TIM2_IT_Update);                                        /*disable timer2 interrupt*/


TIM2->CR1 &= (~TIM_CR1_CEN);                                           /*disable timer2*/


}


打开外设时钟源;


选择向上计数模式和打开自动重加载功能;


填装计数器的初始值;


关闭Timer2中断功能;


关闭Timer2;


2、毫秒延时代码示例


void DelayMs (uint16_t timeVal)


{

uint16_t i = 0;


TIM2_TimeBaseInit(TIM2_Prescaler_64, TIM2_CounterMode_Up, 124);        /*AutoReload Value = 124,  1ms*/


TIM2->CNTRH = (uint8_t)0;                                              /*counter value = 0*/


TIM2->CNTRL = (uint8_t)0;


TIM2->CR1 |= (TIM_CR1_CEN);                                            /*enable timner2*/


for(i = 0; i < timeVal; i++)


{

TIM2->SR1 &= (~TIM2_FLAG_Update);                                    /*clear timer2 update flag*/


while( ((TIM2->SR1) & TIM2_FLAG_Update) != TIM2_FLAG_Update );       /**/


}


TIM2->CR1 &= (~TIM_CR1_CEN);                                           /*disable timer2*/


}


设置Timer2分频,向上加1计数模式,填装自动重载寄存器目标值。这里每经过8us计数器加1,从0一直到124,共延时1ms,这时Timer2产生溢出标志位。通过检查寄存器TIM2->SR1的位[0]判断。


for(i = 0; i < timeVal; i++)


{

TIM2->SR1 &= (~TIM2_FLAG_Update);                                    /*clear timer2 update flag*/


while( ((TIM2->SR1) & TIM2_FLAG_Update) != TIM2_FLAG_Update );       /**/


}


先软件清除TIM2->SR1位[0],再等待判断TIM2->SR1位[0]。这里加上for循环,表示延时多少毫秒。


关闭Timer2。


3、微妙延时代码示例


void DelayUs (uint16_t timeVal)


{

TIM2->PSCR = (uint8_t)(TIM2_Prescaler_8);


TIM2->CR1 |= (uint8_t)(TIM2_CounterMode_Up);


TIM2->EGR = TIM2_EventSource_Update;


TIM2->CNTRH = (uint8_t)0;


TIM2->CNTRL = (uint8_t)0;


TIM2->ARRH = (uint8_t)0xff;


TIM2->ARRL = (uint8_t)0xff;


TIM2->SR1 &= (~TIM2_FLAG_Update);                                      /*clear timer update flag*/


TIM2->CR1 |= (TIM_CR1_CEN);                                            /*enable timner*/


while(1)


{

if( (TIM2->CNTRH ==  (uint8_t)((timeVal - 1) >> 8)) &&


(TIM2->CNTRL == ((uint8_t)(timeVal - 1) & 0x00ff)) )


{

break;


}


}


TIM2->CR1 &= (~TIM_CR1_CEN);                                           /*disable timer*/


}


设置Timer2分频系数,向上加1计数模式,计数器初始值和自动重装载目标值。这里计数器每经过1us自动做加1计数。


清除溢出标志位,并打开Timer2;


while(1)


{

if( (TIM2->CNTRH ==  (uint8_t)((timeVal - 1) >> 8)) &&


(TIM2->CNTRL == ((uint8_t)(timeVal - 1) & 0x00ff)) )


{

break;


}


}


这里不是检测溢出标志位,而是检测计数器当前的计数值。比较是否等于预定设置值。


关闭Timer2。

推荐阅读

史海拾趣

Bay Linear Inc公司的发展小趣事

随着公司产品的热销,Bay Linear Inc开始积极拓展国际市场。通过与国外知名企业的合作,公司成功打入欧洲和北美市场,进一步提升了品牌知名度和影响力。同时,公司还积极参与国际技术交流与合作,不断提升自身的技术水平和市场竞争力。

Dynawave Incorporated公司的发展小趣事

在快速发展的过程中,Dynawave意识到企业文化的重要性。他们注重培养员工的团队合作精神和创新能力,鼓励员工积极参与公司的各项活动。同时,公司还建立了完善的激励机制和福利制度,为员工提供了良好的工作环境和发展空间。这些举措增强了员工的归属感和忠诚度,为公司的长期发展奠定了坚实的基础。

Conxall公司的发展小趣事

为了进一步提升公司的竞争力,Conxall公司积极寻求与其他企业的合作。公司与多家知名电子企业签订了战略合作协议,共同研发新技术、新产品。通过合作,Conxall公司不仅获得了更多的技术资源和市场支持,还提升了自身的品牌形象和知名度。

Digilent公司的发展小趣事

DIALIGHT在全球范围内不断拓展业务,目前在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设有业务。公司的LED产品广泛应用于各种工业场所,包括石油和天然气、矿业、化工、制造业等。通过提供定制化的照明解决方案,DIALIGHT赢得了众多客户的信赖和好评。

Barry Industries Inc公司的发展小趣事

在国内市场取得一定成绩后,Barry Industries Inc开始积极拓展国际市场。公司参加了多个国际电子展会,与国际知名企业建立了合作关系,成功将产品打入国际市场。同时,Barry还积极寻求与国际先进技术的交流与合作,不断提升自身的技术水平和产品质量。

智烽维(CDA)公司的发展小趣事

随着市场需求的不断增长和公司业务的不断拓展,智烽维在2021年进行了工厂的扩建。扩建后的工厂不仅提升了产能和效率,也进一步提高了产品的质量和可靠性。此外,公司还加强了与上下游企业的合作和资源整合,形成了更加完善的产业链和供应链体系。这一举措不仅为公司的未来发展提供了强有力的支撑,也为公司在电子行业中的竞争地位奠定了坚实的基础。

问答坊 | AI 解惑

求助关于基于单片机的数字PID调节问题

我正在做一个基于ATmega16单片机的直流调速系统 要用到PID控制 第一个问题是 怎么用ATmega16实现PID控制 第二个问题 怎么将PID的输出与PWM波的占空比联系起来…

查看全部问答>

Nios 视频学习

Nios工程创建视频学习教程 内容包括: (1)SOPC Builder 的使用创建工程方法 (2)Quartus中的配置 (3)Nios中C语言工程的创建 (4)Nios中Flash的下载…

查看全部问答>

数字转模拟(D/A) 隔离转换器485/232转4-20MA

数字转模拟(D/A) 隔离转换器:ISO DAO系列 RS232/RS485信号转模拟信号 隔离D/A转换器 产品概述: ISO DAO系列产品实现主机RS-485/232接口信号隔离转换成标准模拟信号,用以控制远程设备。ISODA系列产品可应用在 RS-232/RS-4 ...…

查看全部问答>

二个程序它们各有静态变量或静态区。它们的静态区和操作系统的静态区有什么不同?

二个程序它们各有静态变量或静态区。它们的静态区和操作系统的静态区(事件EVENT,互斥体Mutex存放的地方)有什么不同?…

查看全部问答>

wince内存泄露?

我使用evc开发一个应用程序,使用了timer,当timer里面没有任何人为添加的代码的时候,查看程序内存中正在使用的内存,没有变化。当我添加这样两行代码:         CWnd* pWnd = GetDlgItem(IDC_COORD);       ...…

查看全部问答>

转让友善micro2440sdk开发板

         本人去年7月份左右买了友善之臂的micro2440sdk开发板,现在将其转让,并且我愿意回答bootloader以及wince驱动的问题,其余不懂的我也会给一些意见。开发板网址http://www.arm9.net/micro2440sdk.asp就是这 ...…

查看全部问答>

刷卡支付功能的手机的相关技术

可以给我讲讲有关刷卡支付功能的手机的关键开发技术吗?…

查看全部问答>

求解答,工具是ccs2.2,读写flash空间和Clist问题

1.目前要把VC的程序刻录到板子上,请问原程序中用的是CList, c里面有替代的或差不多的吗?如果有,头文件是什么?刚接触这个,挺迷糊,刚 从一个辞职的同事上接手个半成品程序。 2. 请问怎么往板子里的flash空间写数据? typedef struct & ...…

查看全部问答>

做的一个俄罗斯方块,在全局变量就通过不了了

第一次碰见这种情况,shit是我生气打上的,但还是通过不了ELUOSI.C(25): error C244: \'shit\': can\'t initialize, bad type or classELUOSI.C(25): error C132: \'shit\': not in formal parameter list#include<reg52.h>#include\"anjian.h\ ...…

查看全部问答>

一个不知名的符号

读程序的时候突然发现的,volatile   GPIO   PA @ 0x5000; volatile   GPIO   PB @ 0x5005; 其中@ 符号是什么意思呢,请教各位大虾了!最好能具体点,关于这个符号的,谢谢!…

查看全部问答>