当前位置:首页 > 定时器
  • 最全!华大HC32F460定时器介绍

    出品  21ic论坛  binoo7 网站:bbs.21ic.com 这次和大家一起分享一下华大HC32F460的定时器。首先说一下定时器的分类,一共有四种定时器分别是: 高级控制定时器(Timer6)有3个; 通用控制定时器(Timer4)有3个; 通用定时器(TimerA)有6个; 通用定时器(Timer0)有2个; 再次说一下这几个定时器有什么区别:看名字就知道高级控制定时器肯定是功能最全的 高级控制定时器 6(Timer6)是一个 16 位计数宽度的高性能定时器,可用于计数产生 不同形式的时钟波形,输出以供外部使用。 该定时器支持三角波和锯齿波两种波形模式,可生成各种 PWM 波形; 单元间可实现软件同步计数和硬件同步计数; 各基准值寄存器支持缓存功能; 支持 2 相正交编码和 3 相正交编码; 支持 EMB 控制。 主要看一下基本框图 看框图能看,Timer6 的计数时钟可以有以下几种选择:a) PCLK0 及 PCLK0 的 4、16、64、256、1024 分频(GCONR.CKDIV[2:0]设定)b) 内部触发事件触发输入(HCUPR[17:16]或 HCDOR[17:16]设定)c) TIM6_TRIGA-B 的端口输入(HCUPR[11:8]或 HCDOR[11:8]设定)d) TIM6__PWMA 和 TIM6__PWMB 的 正交编码 输入( HCUPR[7:0] 或HCDOR[7:0]设定)计数时钟源选择 a 时为软件计数模式,计数时钟源选择 b、c、d 时为硬件计数模式。上述描述可以看到,b、c、d 时钟互相独立,可分别设定有效或无效,并且当选择 b、c、d 时钟时,a 时钟自动无效。定时器6的时钟不能按照任意的分频系数进行分频,只能按照特定的频率进行分频,实话实说这一点就不如STM32方便了 计数方式有两种,一个是锯齿波,一个是三角波,两种波形的方式进行计数,当达到设定值后会清零或向下计数 自动重装载值这里叫做通用周期基准值寄存器,官方给的解释是设定每轮计数的计数周期值及对应缓存值 ,说实话这个官方的解释我看了一天也没搞懂是啥意思,很容易和STM32的周期计数混淆,大家要多注意了。 看寄存器的配置就能知道这是一个16位的定时器。 定时器可以产生的中断中官方给的解释如下: 通用比较基准值寄存器(GCMAR-GCMFR)共计 6 个,可分别与计数值比较产生比较匹配。 计数比较匹配时,状态标志寄存器(STFLR)中的 STFLR.CMAF~STFLR.CMFF位分别会被置为 1。 此时若设定中断控制寄存器(ICONR)的 INTENA~INTENF 中相应位为 1 使能中断,则对应的中断请(TMR6_U_GCMA~F)也会被触发。 在硬件捕获事件选择寄存器(HCPAR、HCPBR)选择的捕获输入有效条件产生时,捕获输入动作发生。 此时若设置中断控制寄存器(ICONR)的 INTENA 或 INTENB 位为1 使能中断,则对应的中断请求(TMR6_U_GCMA~B)被触发。 2 个专用比较基准值寄存器(SCMAR-SCMBR)也可分别与计数值比较产生比较匹配。 计数比较匹配时,状态标志寄存器(STFLR)中的 STFLR.CMSPAF~CMSPBF 位分别会被置为 1。此时若设定中断控制寄存器(ICONR)的 INTENSAU或 INTENSBU中相应位为 1 使能中断,则对应的中断请求(TMR6_U_SCMA~B)也会被触发。 看上面的解释可能会云里雾里看不懂啥意思,还不如直接看中断控制寄存器,有多少中断都在中断控制器里写的明明白白,这样的话我们就能很容易的来根据需要配置中断的功能了,具体配置如下图所示 这里面比较值的设置就是根据两个比较基准寄存器的值来进行判断的,这两个寄存器分别是通用比较基准值寄存器,专用比较基准寄存器,其实还有一个是死区时间基准值寄存器 下面直接看代码,看看高级控制定时器的用法 官方给的例程挺多的,有耐心的小伙伴可以仔细分析一下MCU的TIMER6的PWM的锯齿波模式、无缓存输出功能,看看比较输出的功能是怎么配置的 /******************************************************************************** Include files******************************************************************************/#include "hc32_ddl.h"/******************************************************************************** Local type definitions ('typedef')******************************************************************************//******************************************************************************** Local pre-processor symbols/macros ('#define')******************************************************************************//* KEY0 (SW2)*/#define SW2_PORT (PortD)#define SW2_PIN (Pin03)/* KEY1 (SW4)*/#define SW4_PORT (PortD)#define SW4_PIN (Pin04)/* KEY2 (SW3)*/#define SW3_PORT (PortD)#define SW3_PIN (Pin05)/* KEY3 (SW5)*/#define SW5_PORT (PortD)#define SW5_PIN (Pin06)/* LED0 Port/Pin definition */#define LED0_PORT (PortE)#define LED0_PIN (Pin06)/* LED1 Port/Pin definition */#define LED1_PORT (PortD)#define LED1_PIN (Pin07)/* LED2 Port/Pin definition */#define LED2_PORT (PortB)#define LED2_PIN (Pin05)/* LED3 Port/Pin definition */#define LED3_PORT (PortB)#define LED3_PIN (Pin09)/* LED0~1 toggle definition */#define LED0_TOGGLE() (PORT_Toggle(LED0_PORT, LED0_PIN))#define LED1_TOGGLE() (PORT_Toggle(LED1_PORT, LED1_PIN))#define LED2_TOGGLE() (PORT_Toggle(LED2_PORT, LED2_PIN))#define LED3_TOGGLE() (PORT_Toggle(LED3_PORT, LED3_PIN))/******************************************************************************** Global variable definitions (declared in header file with 'extern')******************************************************************************//******************************************************************************** Local function prototypes ('static')******************************************************************************//******************************************************************************** Local variable definitions ('static')******************************************************************************//******************************************************************************** Function implementation - global ('extern') and local ('static')******************************************************************************//*********************************************************************************** \brief Callback function of external interrupt ch.0********************************************************************************/void Timer6_OverFlow_CallBack(void){}/********************************************************************************** \brief Initialize the system clock for the sample**** \param None**** \return None******************************************************************************/static void SysClkIni(void){ en_clk_sys_source_t enSysClkSrc; stc_clk_sysclk_cfg_t stcSysClkCfg; stc_clk_mpll_cfg_t stcMpllCfg; stc_clk_output_cfg_t stcOutputClkCfg; MEM_ZERO_STRUCT(enSysClkSrc); MEM_ZERO_STRUCT(stcSysClkCfg); MEM_ZERO_STRUCT(stcMpllCfg); MEM_ZERO_STRUCT(stcOutputClkCfg); /* Set bus clk div. */ stcSysClkCfg.enHclkDiv = ClkSysclkDiv1; // 168MHz stcSysClkCfg.enExclkDiv = ClkSysclkDiv2; // 84MHz stcSysClkCfg.enPclk0Div = ClkSysclkDiv1; // 168MHz (timer6 cnt) stcSysClkCfg.enPclk1Div = ClkSysclkDiv2; // 84MHz (timer6 logic) stcSysClkCfg.enPclk2Div = ClkSysclkDiv4; // 42MHz stcSysClkCfg.enPclk3Div = ClkSysclkDiv4; // 42MHz stcSysClkCfg.enPclk4Div = ClkSysclkDiv2; // 84MHz CLK_SysClkConfig(&stcSysClkCfg); CLK_HrcCmd(Enable); //Enable HRC /* MPLL config. */ stcMpllCfg.pllmDiv = 2ul; //HRC 16M / 2 stcMpllCfg.plln = 42ul; //8M*42 = 336M stcMpllCfg.PllpDiv = 2ul; //MLLP = 168M stcMpllCfg.PllqDiv = 2ul; //MLLQ = 168M stcMpllCfg.PllrDiv = 2ul; //MLLR = 168M CLK_SetPllSource(ClkPllSrcHRC); CLK_MpllConfig(&stcMpllCfg); /* flash read wait cycle setting */ EFM_Unlock(); EFM_SetLatency(EFM_LATENCY_4); EFM_Lock(); /* Enable MPLL. */ CLK_MpllCmd(Enable); /* Wait MPLL ready. */ while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy)) { ; } /* Switch system clock source to MPLL. */ CLK_SetSysClkSource(CLKSysSrcMPLL);}/*********************************************************************************** \brief Main function of project**** \param None**** \retval int32_t return value, if needed********************************************************************************/int32_t main(void){ uint16_t u16Period; uint16_t u16Compare; stc_timer6_basecnt_cfg_t stcTIM6BaseCntCfg; stc_timer6_port_output_cfg_t stcTIM6PWMxCfg; stc_timer6_gcmp_buf_cfg_t stcGCMPBufCfg; stc_port_init_t stcPortInit; stc_irq_regi_conf_t stcIrqRegiConf; MEM_ZERO_STRUCT(stcTIM6BaseCntCfg); MEM_ZERO_STRUCT(stcTIM6PWMxCfg); MEM_ZERO_STRUCT(stcGCMPBufCfg); MEM_ZERO_STRUCT(stcPortInit); MEM_ZERO_STRUCT(stcIrqRegiConf); SysClkIni(); PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM61, Enable); PORT_SetFunc(PortE, Pin09, Func_Tim6, Disable); //Timer61 PWMA PORT_SetFunc(PortE, Pin08, Func_Tim6, Disable); //Timer61 PWMB stcTIM6BaseCntCfg.enCntMode = Timer6CntSawtoothMode; //Sawtooth wave mode stcTIM6BaseCntCfg.enCntDir = Timer6CntDirUp; //Counter counting up stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv1; //Count clock: pclk0 Timer6_Init(M4_TMR61, &stcTIM6BaseCntCfg); //timer6 PWM frequency, count mode and clk config u16Period = 33600u; Timer6_SetPeriod(M4_TMR61, Timer6PeriodA, u16Period); //period set u16Compare = 10000u; Timer6_SetGeneralCmpValue(M4_TMR61, Timer6GenCompareA, u16Compare); //Set General Compare RegisterA Value u16Compare = 20000u; Timer6_SetGeneralCmpValue(M4_TMR61, Timer6GenCompareB, u16Compare); //Set General Compare RegisterB Value stcTIM6PWMxCfg.enPortMode = Timer6ModeCompareOutput; //Compare output function stcTIM6PWMxCfg.bOutEn = true; //Output enable stcTIM6PWMxCfg.enPerc = Timer6PWMxCompareLow; //PWMA port output Low level when CNTER value match PERAR stcTIM6PWMxCfg.enCmpc = Timer6PWMxCompareHigh; //PWMA port output High level when CNTER value match with GCMAR stcTIM6PWMxCfg.enStaStp = Timer6PWMxStateSelSS; //PWMA output status is decide by STACA STPCA when CNTER start and stop stcTIM6PWMxCfg.enStaOut = Timer6PWMxPortOutLow; //PWMA port output set low level when CNTER start stcTIM6PWMxCfg.enStpOut = Timer6PWMxPortOutLow; //PWMA port output set low level when CNTER stop stcTIM6PWMxCfg.enDisVal = Timer6PWMxDisValLow; Timer6_PortOutputConfig(M4_TMR61, Timer6PWMA, &stcTIM6PWMxCfg); stcTIM6PWMxCfg.enPortMode = Timer6ModeCompareOutput; //Compare output function stcTIM6PWMxCfg.bOutEn = true; //Output enable stcTIM6PWMxCfg.enPerc = Timer6PWMxCompareLow; //PWMB port output Low level when CNTER value match PERAR stcTIM6PWMxCfg.enCmpc = Timer6PWMxCompareHigh; //PWMB port output High level when CNTER value match with GCMBR stcTIM6PWMxCfg.enStaStp = Timer6PWMxStateSelSS; //PWMB output status is decide by STACB STPCB when CNTER start and stop stcTIM6PWMxCfg.enStaOut = Timer6PWMxPortOutLow; //PWMB port output set low level when CNTER start stcTIM6PWMxCfg.enStpOut = Timer6PWMxPortOutLow; //PWMB port output set low level when CNTER stop stcTIM6PWMxCfg.enDisVal = Timer6PWMxDisValLow; Timer6_PortOutputConfig(M4_TMR61, Timer6PWMB, &stcTIM6PWMxCfg); /*config interrupt*/ /* Enable timer61 GOVF interrupt */ Timer6_ConfigIrq(M4_TMR61, Timer6INTENOVF, true); stcIrqRegiConf.enIRQn = Int002_IRQn; //Register INT_TMR61_GOVF Int to Vect.No.002 stcIrqRegiConf.enIntSrc = INT_TMR61_GOVF; //Select Event interrupt of timer61 stcIrqRegiConf.pfnCallback = &Timer6_OverFlow_CallBack; //Callback function enIrqRegistration(&stcIrqRegiConf); //Registration IRQ NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Clear Pending NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);//Set priority NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //Enable NVIC /*start timer6*/ Timer6_StartCount(M4_TMR61); while(1) { ; }} 我们直接分析主函数部分 第一步:先开启时钟 :PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM61, Enable); 直接看源程序,就能找到三个时钟分别是61 62 63这次我们用的是61也就是第一个时钟 第二步:是配置引脚为TIMER61的输出引脚 也就是端口复用 第三步:配置定时器功能和预分频系数 定时器都有什么功能呢,看源代码能看到有三个 那我们再看一下这个功能是配置的哪个寄存器呢? 这个时候如果还是没看懂,那么我们回过头来看用户手册关于这个定时器是怎么说的 以后我们如果不知道代码中配置的是什么意思了,也可以这样来寻找答案。 第四步:设置通用周期基准值寄存器,也就是重装载值 u16Period = 33600u; Timer6_SetPeriod(M4_TMR61, Timer6PeriodA, u16Period); //period set 这里我们用的是A通道,timer6有三个通道,分别如下图所示 第五步:设置比较值 u16Compare = 10000u; Timer6_SetGeneralCmpValue(M4_TMR61, Timer6GenCompareA, u16Compare); //Set General Compare RegisterA Value u16Compare = 20000u; Timer6_SetGeneralCmpValue(M4_TMR61, Timer6GenCompareB, u16Compare); //Set General Compare RegisterB Value 看到这里我们来画个图说明一下 我们制定好波形,波形的频率就是根据预分频值算出来的,然后设置好重装载值和比较值,再设置中断类型,就可以产生响应的中断第六步:设置输出功能 stcTIM6PWMxCfg.enPortMode = Timer6ModeCompareOutput; //Compare output function stcTIM6PWMxCfg.bOutEn = true; //Output enable stcTIM6PWMxCfg.enPerc = Timer6PWMxCompareLow; //PWMA port output Low level when CNTER value match PERAR stcTIM6PWMxCfg.enCmpc = Timer6PWMxCompareHigh; //PWMA port output High level when CNTER value match with GCMAR stcTIM6PWMxCfg.enStaStp = Timer6PWMxStateSelSS; //PWMA output status is decide by STACA STPCA when CNTER start and stop stcTIM6PWMxCfg.enStaOut = Timer6PWMxPortOutLow; //PWMA port output set low level when CNTER start stcTIM6PWMxCfg.enStpOut = Timer6PWMxPortOutLow; //PWMA port output set low level when CNTER stop stcTIM6PWMxCfg.enDisVal = Timer6PWMxDisValLow; Timer6_PortOutputConfig(M4_TMR61, Timer6PWMA, &stcTIM6PWMxCfg); 根据以上的代码我们就设置好了比较输出的功能,怎么算比较输出呢,就是当计数值经过比较值的时候输出引脚进行翻转,由高电平变为低电平,或者有低电平变为高电平 这样就产生了占空比可调的PWM波形输出了,看下面的图,大家就清楚了 每次遇到比较,就翻转输出,这样我们设置不同的比较值,就可以有不同占空比的PWM了,这样的控制方式对于步进电机控制上好处多多,我推荐大家可以看看硬石老师的电机开发例程和野火老师的例程,他们用的都是定时器的比较输出的功能来控制步进电机产生梯形加减速、S形加减速。 言归正传我们继续分析代码第七步:配置中断功能 /*config interrupt*/ /* Enable timer61 GOVF interrupt */ Timer6_ConfigIrq(M4_TMR61, Timer6INTENOVF, true); stcIrqRegiConf.enIRQn = Int002_IRQn; //Register INT_TMR61_GOVF Int to Vect.No.002 stcIrqRegiConf.enIntSrc = INT_TMR61_GOVF; //Select Event interrupt of timer61 stcIrqRegiConf.pfnCallback = &Timer6_OverFlow_CallBack; //Callback function enIrqRegistration(&stcIrqRegiConf); //Registration IRQ NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Clear Pending NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_15);//Set priority NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //Enable NVIC复制代码 第八步:使能定时器 /*start timer6*/ Timer6_StartCount(M4_TMR61); 这里我们讲解的是高级定时器的功能,剩下的定时器,就是在这个基础上进行简配得到的,所以就不再一一列举了,大家有时间可以看看手册和代码,关键的注意事项在上面都介绍了,大家应该配置没有问题,如果遇到问题了,可以在本帖留言,我看到后会及时回复 谢谢大家了 本文系21i c论坛网友binoo7的回忆 原创 ‍ ‍‍‍ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-03-11 关键词: HC32F460 定时器

  • 51单片机定时器工作原理及用法

    51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。以上是控制低4位的,所以是对应着T0。 TR0:T0定时器 使能开关,TR0 = 1,开始工作; =0停止工作。 ET0:T0定时器中断开关,定时时间一到,就会跑去中断程序。ET0=1,中断使能,=0失能。 EA : 中断总开关,你可以想象成电路的总电闸,EA=1,中断使能; =0,中断失能。 TH0,TL0 : T0定时器计数寄存器,组成16位的计数,0x0000--0xFFFF(0--65535),只要TH0TL0=0xFFFF(65535),程序就会跑去中断程序,在中断程序中,我们要重新给TH0,TL0重新赋值的。 假如说,我们定时50毫秒,TH0,TL0对应着什么值呢? 上面我们说了,TH0,TL0,组成的16位计数器计数范围是 0---65535 。50ms = 50 000us,我们只要让 TH0 TL0 从(65535 - 50000)开始计数,TH0,TL0就会不停的+1,直到TH0,TL0=65535,就是计数了50000次,时间就是过了50ms。我们只要在中断程序里面,重新赋值给TH0,TL0=(65535 - 50000),定时器就会不停得每50ms中断一次了。 所以,TH0=(65535-50000)/256; TL0 = (65535-50000)%256 ; 好吧,T0程序例子,定时20ms的程序 : TO 20ms 例子程序 说完了TO,T1该怎么办? 我开始的时候说了,TO,T1是一对双胞胎。大家把上面T0例子程序: (TMOD = 0x01, ET0 ,TR0,TH0,TL0 ,interrput 1) 改为 (TMOD = 0x10, ET1 ,TR1,TH1,TL1 ,interrput 3) 这样就变成了T1,定时器的程序。

    时间:2021-03-05 关键词: 51单片机 中断 定时器

  • 51单片机定时器工作原理及用法

    51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。以上是控制低4位的,所以是对应着T0。 TR0:T0定时器 使能开关,TR0 = 1,开始工作; =0停止工作。 ET0:T0定时器中断开关,定时时间一到,就会跑去中断程序。ET0=1,中断使能,=0失能。 EA : 中断总开关,你可以想象成电路的总电闸,EA=1,中断使能; =0,中断失能。 TH0,TL0 : T0定时器计数寄存器,组成16位的计数,0x0000--0xFFFF(0--65535),只要TH0TL0=0xFFFF(65535),程序就会跑去中断程序,在中断程序中,我们要重新给TH0,TL0重新赋值的。 我们都知道通信从大的方面有两种:串行和并行。串行的最大优点是占用总线少,但是传输速率低;并行恰恰相反,占用总线多,传输速率高。市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来),有并入串出的(相对前者而言)。具体用哪种类型要根据我们得实际情况。比如利用单片机显示数码管单纯的显示一个数码管如果仅仅是为了显示 那么动用单片机一个端口(如P0或P1/P2/P3)那没有什么,当然这里我说的数码管是8段的(如果利用BCD类型 16进制数码管那么只需四个即可)就拿51类型的单片机来说,总共32个I/O口,一般如果不是做太大的工程是完全够用的,但有些时候你会恨单片机怎么不多长几条“腿”,怎么省还是不够用。这个时候就需要用到并转串或者串转并芯片来进行IO口的扩展,74HC165就是一种并行转串行的芯片。 假如说,我们定时50毫秒,TH0,TL0对应着什么值呢? 上面我们说了,TH0,TL0,组成的16位计数器计数范围是 0---65535 。50ms = 50 000us,我们只要让 TH0 TL0 从(65535 - 50000)开始计数,TH0,TL0就会不停的+1,直到TH0,TL0=65535,就是计数了50000次,时间就是过了50ms。我们只要在中断程序里面,重新赋值给TH0,TL0=(65535 - 50000),定时器就会不停得每50ms中断一次了。 所以,TH0=(65535-50000)/256; TL0 = (65535-50000)%256 ; 好吧,T0程序例子,定时20ms的程序 : TO 20ms 例子程序 说完了TO,T1该怎么办? 我开始的时候说了,TO,T1是一对双胞胎。大家把上面T0例子程序: (TMOD = 0x01, ET0 ,TR0,TH0,TL0 ,interrput 1) 改为 (TMOD = 0x10, ET1 ,TR1,TH1,TL1 ,interrput 3) 这样就变成了T1,定时器的程序。

    时间:2021-03-02 关键词: 51单片机 中断 定时器

  • STM32低功耗定时器(LPTIM)有哪些独特功能?

    作者 | strongerHuang 微信公众号 | 嵌入式专栏 开发低功耗产品,我们会比较关注整个系统的功耗问题。那么,LPTIM低功耗定时器你有关注吗? 1写在前面 在早些年,可能较少听见LPTIM这个名词。随着低功耗产品需求越来越严格,MCU厂商就推出了针对低功耗应用的LPTIM定时器。 定时器是我们常见的一种外设,之所以这么常见,原因在于定时器的用途非常广泛。 在STM32所有MCU中都配有定时器,那么你有关注、对比过各系列,各型号MCU中定时器的差异吗? 2哪些STM32配有LPTIM定时器 在STM32中,相对较新的MCU部分型号配有LPTIM定时器。 比如:STM32F7、H7高性能MCU,STM32L0、 L4低功耗MCU,以及新推出的G0、G4系列中都配有这种LPTIM定时器。 具体哪些MCU配有LPTIM,大家可以下载对应的数据手册查看。 本文围绕STM32G0讲述其中的LPTIM定时器。 3LPTIM功能 LPTIM:Low-power timer,即低功耗定时器。 LPTIM 是一个 16 位定时器,得益于其定时器的低功耗。 由于 LPTIM 的时钟源具有多样性,因此 LPTIM 能够在所有电源模式(待机模式除外)下保持运行状态。 即使没有内部时钟源, LPTIM 也能运行,鉴于这一点,可将其用作“脉冲计数器”,这种脉冲计数器在某些应用中十分有用。 此外, LPTIM 还能将系统从低功耗模式唤醒,因此非常适合实现“超时功能”,而且功耗极低。 LPTIM 引入了一个灵活的时钟方案,该方案能够提供所需的功能和性能,同时还能最大程度地降低功耗。 我仔细对比了一下STM32各系列的LPTIM低功耗定时器,发现很多功能基本一样。 1.框图 STM32G0低功耗定时器框图: STM32L0低功耗定时器框图: 对比框图,可以发现这个LPTIM片上外设有相似之处。 当然,有些细节是不一样的,像在STM32H7中有多个LPTIM,这几个LPTIM之间是有一定差异的。 2.LPTIM 主要特性 16 位递增计数器 3 位预分频器,可采用 8 种分频系数(1、 2、 4、 8、 16、 32、 64 和 128) 可选时钟 – 内部时钟源:LSE、 LSI、 HSI 或 APB 时钟 – LPTIM 输入的外部时钟源(在没有 LP 振荡器运行的情况下工作,可在使用脉冲计数器应用场景中使用) 16 位 ARR 自动重载寄存器 16 位比较寄存器 连续/单触发模式 可选软件/硬件输入触发 可编程数字防抖动干扰滤波器 可配置输出:脉冲和 PWM 可配置 I/O 极性 编码器模式 拿这些特性和其它基本定时器相对较,你会发现,这些特性中很多都是LPTIM独有的。 3.LPTIM  RCC LPTIM的RCC和其他定时器相比较,其RCC功能更加丰富。 通过上面框图可以发现,LPTIM 可通过多个时钟源提供时钟。 它可以由内部时钟信号提供时钟,内部时钟信号可通过复位和时钟控制器 (RCC) 在 APB、 LSI、 LSE 或 HSI 时钟源中进行选择。 4.干扰滤波器 这个功能也是LPTIM所特有的一个功能。 LPTIM 输入由数字滤波器保护,避免任何毛刺和噪声干扰在 LPTIM 内部传播,从而防止产生意外计数或触发。 滤波示意图: 这个原理比较简单,如果不能理解请查看参考手册详解。 LPTIM定时器的功能比较多,可能初学者一看到那么多内容就吓到了。其实,把内容拆开来看并不难。 本文旨在让更多朋友知道这些功能,想要深入掌握其中知识,需结合手册和实践编程。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-01-25 关键词: 低功耗 STM32 LPTIM 定时器

  • STM32基础分析:PWM配置

    在使用STM32F103产生固定频率、固定占空比的PWM波时,虽然有官方以及众多开发板提供的例程,但是关于有点问题并没有说的很清晰,并且《STM32F10X参考手册》的中文翻译可能容易造成歧义,所以一开始并没有理解,这里就梳理一下我的理解,如果有误解的情况,希望交流指正。 1. 遇到的问题 先直接上段配置代码,这段代码是产生一个20kHz固定频率,50%固定占空比的方波信号,典型的配置过程,一般来说也不会有什么太多的疑问。但是我逐步了解背后的定时器工作逻辑的时候,就产生了一些疑问,也没有找到合理、清晰的解答。先说明一下,只有通用定时器和高级定时器才有PWM模式,基本定时器没有。 static void PWM_Mode_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 基本定时器配置 TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 开启定时器时钟,即内部时钟CK_INT=72M TIM_TimeBaseStructure.TIM_Period = 49; // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 时钟预分频数为 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 设置时钟分频系数:不分频(这里用不到) TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化定时器 TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 清除计数器更新标志位 // PWM模式配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 配置为PWM模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出 TIM_OCInitStructure.TIM_Pulse = 25; // 设置初始PWM脉冲宽度为25,实际上就是配置占空比(捕获比较寄存器1,CCR1) TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; // 当定时器计数值小于CCR1_Val时为低电平 TIM_OC2Init(TIM3, &TIM_OCInitStructure ); // 使能通道2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable ); // 使能预装载(使能CCR1的预装载) TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能自动重载寄存器ARR的预装载 // 开启TIM3 TIM_Cmd(TIM3, ENABLE); // 使能定时器 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能定时器中断 1.1 什么是清除标志位 TIM_ClearFlag(TIM3, TIM_FLAG_Update); // 清除计数器更新标志位 代码中有这样一条,有人会问函数 TIM_ClearFlag() 和函数 TIM_ClearITPendingBit() 有什么区别?其实重点在Flag和IT,前者是外设的状态标志,而后者是外设的中断标志。状态标志就是一个外设它有自身的一些标志位(Flag),来表明它处于什么状态,下图就是定时器的状态标记。中断标志就是使能外设的中断后,每次发生一次中断,它会表明发生了什么样的中断,同样中断也有相应的标记。两者分别靠函数 TIM_GetFlagStatus() 和函数 TIM_GetITStatus() 来获取。 没有使能中断时,是可以读取该外设的状态标志的。同理,串口外设也有此区别。 1.2 模式1和模式2的区别 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 配置为PWM模式1 模式1 在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 模式2 在向上计数时,一旦TIMx_CNT < TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。 实际上可以看到,模式1和模式2并无本质的区别,只是在同样的有效电平情况下,输出的波形电平相反而已。那么什么又是有效电平?后面有机会单独说明。 1.3 什么是自动重装载和预装载寄存器? TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable );// 使能预装载(使能CCR1的预装载)TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能自动重载寄存器ARR的预装载 这个问题才是我写这篇博客的源动力,网上有很多人问,但是回答者没能详细说明,《STM32F10X参考手册》中的描述也有歧义。我只能从别人回答的只言片语中摸索,然后根据自己的理解来解释。下面就看第二节的基本知识。 2. PWM波产生的过程 《STM32F10X参考手册》对此的描述如下: 自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。随后会详细描述每一种配置下更新事件的产生。 我在这个通用定时器框图里面找不到预装载寄存器,这就更增加疑惑了。后来翻了很多问答帖,大概明白了其中的意思,以下是我的总结以及理解。 从框图里面看到自动重装载寄存器(Auto Reload Register,ARR)和捕获/比较寄存器组(Capture/Compare Register,CCR)的框下面有阴影,这就说明这两种寄存器含有影子寄存器(Shadow Register)。影子寄存器实际上才是真正直接参与定时器工作的寄存器,具有即时性。我们配置的ARR和CCR相当于都是上层的寄存器,芯片在工作中,自动将这些上层寄存器的值传递到各自的影子寄存器,从而参与计数或者比较过程。 那么,预装载寄存器在哪里呢? 在参考文献《关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig》中发现实际上ARR和CCR(可能)在物理底层上是两个寄存器的组合,即预装载寄存器(Preload Register)和影子寄存器。实际上,我们在代码层面,对ARR和CCR赋值,最终传递到直接参与工作的影子寄存器,中间还要经历一个预装载寄存器的传递,它在这里相当于缓存的作用。但是在手册中并没找到确实再物理硬件上存在预装载寄存器的蛛丝马迹(只查到缓存器一说),那么也可以这样理解。所谓的预装载寄存器实际上只是ARR和CCR在他们需要向影子寄存器传递值的时候的一种“功能化”的别称,也就是说在需要传值的时候,ARR和CCR就是各自影子寄存器的预装载寄存器。 预装载寄存器的概念应该是相对于影子寄存器来说的。影子寄存器是即时其作用的,而预装载寄存器的值只有传递到影子寄存器才能起作用,你可以把它理解为一个缓存。就程序员的角度观察,两者共用一个地址,无法直接区别访问,只能通过另外的办法来设置对该地址操作的具体行为。作为类比,你可以把预装载寄存器理解为内存中的cache,数据写入了cache,却是不一定写入内存的。当然你可以通过MMU设置为写穿(write through)或写回(write back)模式。 那么ARR和CCR各自的影子寄存器的值在什么时候更新呢? 可以立即将值传入或者每次事件更新的时传入,依赖于相关的控制位。 以ARR为例,控制寄存器TIMx_CR1的位7——ARPE(自动重装载预装载允许位 ,Auto-reload preload enable),写“0”时,TIMx_ARR寄存器没有缓冲;写“1”时,TIMx_ARR寄存器被装入缓冲器。也就是说ARPE写1,则影子寄存器立即被更新,否则只有等到每次事件发生时,才更新,这就是 TIM_ARRPreloadConfig(TIM3, ENABLE); 的含义。 void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState){ /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { /* Set the ARR Preload Bit */ TIMx->CR1 |= TIM_CR1_ARPE; } else { /* Reset the ARR Preload Bit */ TIMx->CR1 &= (uint16_t)~((uint16_t)TIM_CR1_ARPE); }} 同理,CCR的影子寄存器也有相应操作。我选择的是TIM3的通道2,其控制寄存器CCMR1的OC2PE位(CCMR1控制通道1和通道2),相应的操作可以对照库函数来了解。 看到有人回复“如果不改变频率和占空比,纯粹输出PWM波,则可以不需要使能预装载”,那是不是意味着以下两句代码可以不写?这需要试一下…… TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable ); // 使能预装载(使能CCR1的预装载) TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能自动重载寄存器ARR的预装载 那这样设计预装载和影子寄存器有什么好处呢? 参考如下,我的简单理解就是将定时器的赋值过程和工作过程独立开。 设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。 天呐,终于稍微理顺了,虽然不一定对,而且定时器需要死磕的细节太多,精力有限,慢慢来~~ 精彩文章推荐: STM32单片机:独立看门狗、窗口看门狗的配置 stm32-hal库开发简介 STM32如何配置外部中断? 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2020-11-23 关键词: 嵌入式 定时器

  • Microchip推出业界延迟最短的PCI Express® 5.0和CXLTM 2.0重定时器,扩大在数据中心连接领域的领先地位

    Microchip推出业界延迟最短的PCI Express® 5.0和CXLTM 2.0重定时器,扩大在数据中心连接领域的领先地位

    随着数据中心工作负载对高性能计算需求的增加,急需新的超低延迟信号传输技术来提升人工智能(AI)、机器学习(ML)、高级驾驶员辅助系统(ADAS)和其他计算工作负载应用的性能。为满足这一需求,Microchip Technology Inc.(美国微芯科技公司)今天宣布推出低延迟 PCI Express(PCIe®) 5.0 和 Compute Express Link™ (CXL™ )1.1/2.0 等 XpressConnect 系列重定时器产品。 XpressConnect系列重定时器的覆盖范围是PCIe 第五代电信号的三倍,使数据中心设备供应商能够利用下一代计算IO性能的技术进步,同时为高级硬件架构提供所需的灵活性和连接功能。XpressConnect重定时器可提供超低延迟的信号传输,支持 AI、ML、通信系统和高性能计算应用中最繁重的计算工作负载。 Microchip数据中心解决方案业务部营销和应用工程副总裁Andrew Dieckmann表示:“随着存储、计算和存储器带宽需求的不断增长,超大规模数据中心、服务器和存储供应商不断向Microchip寻求领先的计算、存储和存储器连接解决方案。Microchip在提供与XpressConnect重定时器的无缝互操作性方面具有独特优势,因为我们拥有广泛的PCIe SwitchtecTM和Flashtec®产品组合以及与行业合作伙伴的密切关系,可助力客户降低工程成本和实现更快上市。” XpressConnect 系列可提供更广泛的覆盖范围,并且延时比 PCIe 规范低 80%以上,引脚间延迟小于10 ns。XpressConnect重定时器提供支持多种通道数的不同型号,其中最多的是16条通道的PCIe Gen 5,可连接各种PCIe和CXL设备。XpressConnect 重定时器支持无源铜缆和光缆,并具有热插拔和暴力插拔等高可靠性功能。XpressConnect 使系统集成商能够使用成本更低的电缆和板卡材料,为主板、背板、电缆和转接卡等提供经济高效的解决方案。 为了让客户实现快速上市,Microchip与英特尔®合作开发了标准转接卡形式的XpressConnect参考设计。客户可通过英特尔资源和设计中心获得该设计。XpressConnect还支持ChipLink诊断和开发工具,以降低工程开发成本,加快上市时间。 英特尔技术项目总监Jim Pappas表示:“PCIe 5.0和CXL将增强英特尔未来代号为‘Sapphire Rapids’的Xeon可扩展处理器的工作负载性能和能力。与所有新标准一样,PCIe 5.0和CXL的采用将取决于行业领导者提供的验证和互操作性。Microchip和英特尔在PCIe解决方案方面有着悠久的合作历史。我们很高兴能够继续共同努力,提供一个强大的生态系统,让下一代PCIe 5.0和CXL 1.1/2.0解决方案能轻松采用低延迟重定时器。” CXL联盟主席Barry McAuliffe表示:“Microchip是CXL 联盟的重要贡献者,既是CXL董事会成员,也是开发CXL规范的技术工作组成员。Microchip的XpressConnect低延迟重定时器是对CXL生态系统的有益补充。” 开发工具 Microchip发布了一整套设计资料、参考设计、评估板和工具,支持客户利用PCIe Express 5.0的高带宽和CXL 1.1/2.0的低延迟连接构建系统。Microchip在所有数据中心产品中使用的ChipLink诊断GUI已经扩展到支持XpressConnect重定时器,可提供广泛的调试、诊断、配置和取证工具。 供货 XpressConnect 重定时器现正向合格的客户提供样品。有关订购详情,请联系您的 Microchip 销售人员。 除了存储技术,Microchip还为全球数据中心基础设施建设者提供全面的系统解决方案,包括存储器、时序和同步系统、独立安全启动、安全固件和身份验证、无线产品、用于配置和监控数据中心设备的触摸显示屏,以及预测性风扇控制。

    时间:2020-11-16 关键词: Microchip 数据中心 定时器

  • STM32定时器如何配置?

    1. STM32定时器分类 STM32定时器可以分为3类:A)高级控制定时器TIM1和TIM8高级定时器适合多种用途,包含输入捕获、输出比较、PWM、带死区控制的PWM等,所以可以用来做电机控制。B)通用定时器TIM2、TIM3、TIM4、TIM5通用定时器就是基本的定时器,同51单片机中定时器的概念。C)基本定时器TIM6和TIM7基本定时器可以为通用定时提供时间基准,可以为DAC提供时钟。2. 通用定时器功能介绍 3. 通用定时器操作步骤操作通用定时器时主要有如下几部:A)打开定时器的时钟定时器的时钟控制寄存器为:APB1ENR,如下: 操作方式为RCC->APB1ENR |= (1PSC     = 7199;   //设置预分频系数假设定时器的运行主频为72Mhz,经过7200分频后,定时器2的主频为10000Hz,则初值为1ms的计算方式如下:(1/10000)*T = 1ms = 0.001sT = 0.001*10000 = 10C)允许更新中断 该步骤通过DIER寄存器来实现,定时器2的操作方式如下:        TIM2->DIER   |= (1

    时间:2020-10-27 关键词: 嵌入式 定时器

  • 单片机如何计算定时器的初值

    在学习单片机的时候,我们发现很多功能都是通过中断来实现的。之前也举过烧水的例子来阐述中断,今天不讲中断,讲解一下定时器赋初值的方法。8位的定时器最大可计数2的8次方为256,16位的定时器最大可计数2的16次方为65536。由于单片机的定时器是递加式的,所以最大值减去所要定时的值就是初值,举例如下: 最大值为100,我们只需要38,怎么办呢,由于是递加的,我们只需要在62时开始计时就可以了。 以proteus仿真为例简单讲解定时器赋初值 用proteus搭建的电路图如下,晶振为12M,P2.0每10ms翻转一次,即P2.0输出的频率为100HZ。 这里使用16位的定时器,那单片机定时器0的最大计数就是65536.晶振为12M,那单片机的一个机器周期就是1us,定时器 0工作在方式1时最大定时65.536ms。 定时器的定时时间T = (65536-X),单位是us; 定时器初值X = 65536-T; 假设定时时间T=10ms=10000us, 那定时器初值X=65536-10000=55536us,也就是定时器0从55536开始递加到65536就是10ms,所以55536就是定时器的初值,55536转化为十六进制为0Xd8f0,所以定时器的初值为: TH0 = 0XD8; THL = 0XF0; 用虚拟示波器抓到的波形如下: 不同型号、不同系列的单片机,其定时器的配置方法基本大同小异,可以借助51单片机的配置方法举一反三。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2020-10-26 关键词: 单片机 定时器

  • 配备音乐定时器的蓝牙智能牙刷

    配备音乐定时器的蓝牙智能牙刷

      没有计时器的帮助,如何保证刷牙的时间达到推荐的2分钟?来自智能牙刷Beam Brush的幕后人员表示:人们平均的刷牙时间仅有46秒,但是一个简单的定时器,就能让50%以上的人们达到2分钟的推荐时间。该团队的蓝牙牙刷,在1年前的CES上首次亮相,并在6月得到了FDA的批准,上周正式上市的价格为49.99美元。除了一个跟踪刷牙的频率和时间的传感器,它还有一个可以播放2分钟音乐的定时器。      通过牙刷柄上的一个按钮,用户还可以将数据同步到配套的应用上,并将其发送给牙医。   来自肯塔基州路易斯维尔的Beam Technologies公司甚至想到了实际的奖励计划,比如达到了每天刷牙至少2次、每次至少2分钟的话。

    时间:2020-09-06 关键词: 蓝牙 传感器 ces 家庭保健 定时器

  • TI面向便携式应用的业界最小的最新系列低静态电流定时器

    TI面向便携式应用的业界最小的最新系列低静态电流定时器

    最新系列低静态电流定时器支持高灵活时间选择,采用微型封装 德州仪器 (TI) 宣布面向计步器、健身腕表 (fitness bands)、手机以及平板电脑等空间有限的低功耗应用推出两款微型按钮复位控制器。该双通道 TPS3420 与 TPS3421 功耗低,提供可选复位时间延迟,可增强系统稳定性。如欲了解更多信息,订购样片与评估板,敬请访问:。   支持嵌入式电池的便携式电子产品需要按钮复位控制器。在实践中,用户持续按住一个或两个外部按键一定时间,就可关闭便携式设备或产生复位。TPS3420 与 TPS3421 使用长时间输入延迟,不但可提供所需的系统复位,而且还可避免短时间按钮或按键按下产生复位。这种复位配置可在软件中断和硬系统复位之间实现差异化。这些定时器是 TI 最新按钮控制器系列的首批产品,可在需要提高效率时,确保系统全面硬复位。 TPS3420/1 的主要特性与优势 •    7.5 或 12.5 秒的可选输入延迟可避免无意中复位; •    250nA 低静态电流可为便携式电子产品节省电源; •    400 或 800 毫秒可选复位脉冲可实现灵活的初始化; •    采用 1.45 毫米 × 1.0 毫米 × 0.55 毫米小型 SON 封装,电路板空间占用比同类竞争器件少 70%。 虽然 TI MSP430 微控制器 (MCU) 已经支持按钮中断,但 TPS3420 或 TPS3421 等外部按钮复位控制器与 TPS3839 等电压监控器配合,可进一步提高安全性。该控制器和监控器与 MSP430 MCU 保持隔离,可确保在其连接电源时复位。此外,TPS3420 与 TPS3421 还可消除 MSP430 MCU 监控按钮中断所需的处理功能。     供货情况与封装 采用 6 引脚 SON 封装的 TPS3420 与 TPS3421 按钮复位控制器现已开始批量供货,可通过 TI 及其授权分销商订购。此外,TI 还针对需要单个按钮输入的应用提供 TPS3422。  

    时间:2020-06-25 关键词: 便携式 定时器

  • 可编程定时/计数器8253在扬声器中的应用技术

    可编程定时/计数器8253在扬声器中的应用技术

    定时/计数器都有定时或对外部事件计数的功能。通常,定时/计数器归纳起来一般有3种类型:   硬件计数器 可在简单软件控制下计数,特点是成本低,使用方便,但是专用性强,使用不广泛。   软件定时/计数器 特点是几乎没有硬件费用,但他占用CPU的运行时间,降低了CPU的工作效率。   可编程定时/计数器 特点是工作灵活,而且不占用CPU的运行时问,缺点是成本较高。其中可编程定时/计数器8253是一种使用较为普遍的可编程定时/计数器。   可编程定时/计数器8253通过软件设定,可以产生各种时间延迟信号,他的使用非常广泛,通常被用于定时控制、延时、计数等场合,如定时刷新RAM、系统时钟的计时、扬声器的发音长短的控制。在使用的时候,需要进行严密的计算和精确的测试,以满足不同的要求。   1 可编程定时/计数器8253的工作原理   可编程定时/计数器8253是NMOS工艺制成的大规模集成电路,通过简单编程可实现不同的功能,图1为可编程定时/计数器8253的基本原理图。   从图1可以看出,芯片内有3个独立的计数器,分别为计数器0,计数器1,计数器2,每一个计数器都是16位的,可以分别对他们设定工作方式(通过控制字设定)。   图2为封装后的8253引脚图。 可编程定时/计数器8253可以应用在两种情况下:定时、计数。当用作定时器时,可以循环计数,信号来源一般为系统本身;当用作计数器时,信号来源一般为系统文件。在扬声器驱动系统中,可编程定时/计数器8253是作定时器来使用的。   图2中对应引脚的含义如下:   CLK0,CLK1,CLK2:对应计数器的时钟输入。   GATE0,GATE1,GATE2:对应计数器输出信号。   OUT0,OUT1,OUT2:对应计数器输出信号。   RD:读信号。低电平有效,读出计数器的计数值送入缓冲器。   WR:写信号。低电平有效,接收由缓冲器送来的数据。   CS:片选信号。低电平有效。只有在CS信号低电平时8253才能产生读写操作,否则不会读写。   A1~A0:对3个计数器和1个控制寄存器端口进行寻址。   D7~D0:方式控制字。可编程定时/计数器能正确工作与否,与方式控制字密切相关。方式控制字格式如下: 方式控制字对应位的含义见数据手册。   VCC:+5 V电源。   GND:接地引脚。    2 可编程定时/计数器8253在扬声器中的应用   扬声器驱动系统的硬件组成如图3所示。利用8253驱动扬声器发声是由系统插件上8255的外围电路来发出驱动信号的。如图3中的SPK DATA和TIM GATESPK就是接在8255的输出端口上。其中TIM GATESPK控制8253定时器来驱动扬声器,SPK DATA来控制扬声器的门电路。直接由门电路驱动发出的声音比较难听,通过滤波器滤掉杂波之后会更动听一些,所以最好如图3所示加一个滤波器。      (1)首先以流程图的方式说明使用扬声器发声的过程,如图4所示。

    时间:2020-05-07 关键词: 计数器 8253 定时器

  • 臭氧老化箱使用的4个流程简易介绍

    臭氧老化箱使用的4个流程简易介绍

    林频生产制造的臭氧老化箱是科学研究活性氧对硫化橡胶的功效规律性,迅速评定和点评硫化橡胶抗活性氧老化性能与抗活性氧剂安全防护效率的方式、从而采取措施的防脆化对策,以提升橡塑制品的使用期。 下边就臭氧老化箱的定时执行、起动、动态性试验及警报温度4个流程开展简易详细介绍: 一、臭氧老化箱定时执行设置:设定时可根据定时器控制面板上的"+""-"按键来设置(H:钟头、M:分钟、S:秒),如2钟头40分钟,则设置"81H30",设好后开启定时开关,按住开关电源"ON"按键,这时机器设备进到高温控温运作,时间到后,机器设备会全自动断开开关电源。 二、臭氧老化箱活性氧实验起动:开启绿按纽开关电源。把试验箱温度调至50度,等试验箱温度平稳.把活性氧仪表盘归0,等30分钟后把活性氧按纽开启。仪表盘设置看仪表盘使用手册;环境湿度实验时、先查验小水箱里边是不是有水,无水放水.开启寒湿按纽.把实验仪表盘调至必须的实验温度,开启致冷按纽。 三、臭氧老化箱动态性实验:开启轮盘按纽和拉申按纽,依据必须调转速比、排气管按纽是等实验完毕时把活性氧排在户外时开启。 四、臭氧老化箱警报温度设置:按仪表盘设置键"get"5秒,进到仪表盘内部莱单: 1.AL1(警报1):通常为AL1=SV+16℃,该警报高温时功效,超低温不需设置。例:SV为60℃,则AL1为63℃。 2.ATU(自灭磁):自整列入0000表达关掉,0001为开启。本机打开通常不需自灭磁,若某设置温度值无法匀速运动,则开启自灭磁。在自灭磁全过程中,箱里温度会有起伏,属正常问题。

    时间:2020-05-07 关键词: 面板 机器 定时器

  • 正确的时序

    正确的时序

    许多模拟电路需要一种时钟信号,或者要求能在一定时间后执行某项任务。对于这样的应用,有各种各样适用的解决方案。对于简单的时序任务,可以使用标准的555电路。使用555电路和适当的外部组件,可以执行许多不同的任务。然而,使用相当广泛的555定时器有一个缺点,就是设置不太精确。555定时器通过给外部电容充电和检测电压阈值来工作。这种电路很容易制作,但它的精度很大程度上取决于其电容的实际值。晶体振荡器适用于精度要求较高的应用。它们的精度可能很高,但它们有一个缺点:可靠性。参与电气设备维修的人都知道,故障通常是由大型电解电容引起的。晶体振荡器是引起故障的第二大原因。第三种测量时间长度或生成时钟信号的方法是使用一个简单的小型微控制器。当然,可供选择的器件数量繁多,且可以选择各自不同的优化方法。但是,这些器件需要编程,用户需要掌握一定的知识才能使用它;此外,由于其采用数字设计,在关键应用中使用时,必须非常小心谨慎。例如,如果微控制器发生故障,整个系统会出现问题。除了这三种基本的时钟产生构建块之外,还有其他不太为人所知的替代方案。ADI公司提供的TimerBlox模块就是这样一种替代方案。它们是基于硅的时序模块,与微控制器不同,它们在运行中是完全模拟的,可以通过电阻进行调整。所以,它不需要软件编程,功能也非常可靠。图1对不同的TimerBlox模块进行了概述,且介绍了它们各自的基本功能。使用这些基本构建模块可以生成无数其他功能。图1.用于生成各种时序功能的TimerBlox电路与广泛使用的555定时器电路相比,TimerBlox电路不依赖外部电容充电。所有的设置都在电阻中完成,因此其功能更精确。精度可达到1%至2%。晶体振荡器的精度更高,约为100倍,但随之而来的是各种缺点。图2.采用LTC6993 TimerBlox集成电路的包络检波器时序模块的应用非常多样化。ADI公司已经发布了许多示例电路。图2显示了一个包络检波器。几个快速脉冲结合在一起形成一个较长的脉冲。LTC6993-2的外部组件对于这个应用来说是最少的。电路中的电容只是一个支持电源电压的备用电容,对定时模块的精度没有影响。其他有趣的应用还包括用于电源的多个开关稳压器的相移同步,或将扩频调制添加到具有同步输入的开关稳压器IC中。另一个典型的应用是部署指定的延迟,也就是定时器为特定的电路段提供延迟开启的功能。有许多不同的技术解决方案用于生成时钟信号和执行各种基于时间的任务。每种方案各有其优缺点。例如TimerBlox模块这样的硅振荡器,就因为使用可变电阻代替电容,所以具备易于使用、精度高、可靠性高等特点。

    时间:2019-10-15 关键词: 时序 时钟信号 定时器

  • 单片机倒计时定时器

    这里我们先要安装好51试验板上的两个轻触按钮开关,我们采用的是独立式按钮开关,也就是说将开关直接连接到电源的地和单片机的对应引脚之间,这里K1接到单片机的P3.6引脚,K2接到P3.7正常情况下单片机的P3.6P3.7都被程序初始化时置1 当有按键按下时对应的单片机引脚被按钮开关下拉为0,这种方法比较直观,而且比较简单,在按键数量不多的场合下使用很广泛 因为机械开关开关时有抖动,所以需要在程序中加一个软件去抖动程序,它的工作原理如下:当单片机检测到有按键被按下后立即执行一个10毫秒的延时程序,然后再在检测该引脚是否仍然为闭合状态?如果仍然为闭合说明确认该键被按下立即执行相应的处理程序,否则可能是干扰,丢弃这次检测结果 接下来我们再安装一个四位的拨码开关,就是图中红色的开关,它相当于四个装在一起的拨动开关,当开关拨到"ON"一侧时,对应的那路就会接通,反之断开.它在单片机中一般用于设置初始参数,而且不经常改变的场合这里因为单片机引脚资源不够,所以我们只使用了拨码开关的第234位,第1位闲置三个开关可以逻辑组合出8种状态,所以我们能够方便灵活地预置多达7种的倒计时时间 最后我们来安装两个继电器和相关电路,有了继电器我们的实验板不再仅仅是做做实验而已,可以用于控制一些负载,比如说:充电器,洗衣机,电风扇等,使我们的实验板的实用功能大大增强,这也是电子制作实验室网站的单片机实验板和其他公司的产品不同的地方   这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的P2.3/P2.4为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR P2.3或者CLR P2.4的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管,这种继电器驱动方式硬件结构比较简单 ;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时 ;倒计时时间由四位拨码开关的2/3/4位来控制, ;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟, ;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时 ;P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁 ;K1为开始按钮,K2为停止按钮 a_bit equ 20h ;数码管个位数存放内存位置 b_bit equ 21h ;数码管十位数存放内存位置 temp equ 22h ;计数器数值存放内存位置 ;开机初始化 MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入 MOV P0,#0FFH;使显示时间数码管熄灭 CLR P1.0;点亮LED指示灯 ;等待键盘输入 START:JB P3.6,$;循环判断开始按钮K1是否按下? ACALL DELAY10;延时10毫秒触点消抖 JB P3.6,START;如果是干扰就返回 JNB P3.6,$;等待按键松开 ;读拨码开关的状态,获得倒计时时间 SET:MOV A,#0;首先对A清零 JB P2.0,A1;判断拨码开关的第2位是否接通,接通就对A加5 ADD A,#5 A1:JB P2.1,A2;判断拨码开关的第3位是否接通,接通就对A加15 ADD A,#15 A2:JB P2.2,A3;判断拨码开关的第4位是否接通,接通就对A加30 ADD A,#30 A3:MOV TEMP,A ;这时TEMP中的值就是倒计时时间 ;数码管显示定时时间的程序 display:CLR P2.4;使继电器1释放,开始定时(开机时继电器处于吸合状态) CLR P2.3;使继电器2释放,开始定时(开机时继电器处于吸合状态) MOV R2,#120 AB:MOV R3,#250 TIME1:mov a,temp ;将temp中的十六进制数转换成10进制 mov b,#10 ;10进制/10=10进制 div ab mov b_bit,a ;十位在a mov a_bit,b ;个位在b mov dptr,#numtab ;指定查表启始地址 mov r0,#4 dpl1: mov r1,#250 ; dplop: mov a,a_bit ;取个位数 MOVC A,@A+DPTR ;查个位数的7段代码 mov p0,a ;送出个位的7段代码 clr p2.7 ;开个位显示 ACALL DELY1;显示1毫秒 setb p2.7;关闭个位显示,防止鬼影 mov a,b_bit ;取十位数 MOVC A,@A+DPTR ;查十位数的7段代码 mov p0,a ;送出十位的7段代码 clr p2.6 ;开十位显示 ACALL DELY1;显示1毫秒 setb p2.6;关闭十位显示,防止鬼影 ;插入一段判断定时过程中是否有按键输入的程序段 C1:JB P3.6,B1 ACALL DELAY10;延时10毫秒消抖 JB P3.6,C1 JNB P3.6,$;等待按键松开 AJMP SET B1:JB P3.7,M33 ACALL DELAY10;延时10毫秒消抖 JB P3.7,B1 JNB P3.7,$;等待按键松开 AJMP OVER M33:djnz r3,TIME1 ;2毫秒循环执行250次,时间约0.5秒 CPL P1.0;使LED每1秒闪烁一次 djnz r2,AB ;循环执行120次,时间为1分钟 DEC TEMP;满一分钟对定时时间减1 MOV A,TEMP JNZ DISPLAY;判断TEMP的数值是否为0?不为0循环 ;结束定时 OVER:CLR P1.0;LED指示灯常亮 SETB P2.4;继电器1吸合,定时结束,退回到开机时的状态 SETB P2.3;继电器2吸合,定时结束,退回到开机时的状态 AJMP START;退到开机初始化状态 ;1毫秒延时子程序 DELY1:MOV R4,#2 D1:MOV R5,#248 DJNZ R5,$ DJNZ R4,D1 RET ;10毫秒延时子程序 DELAY10:MOV R4,#20 D2:MOV R5,#248 DJNZ R5,$ DJNZ R4,D2 RET ;实验板上的7段数码管0~9数字的共阴显示代码 numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH end

    时间:2019-08-04 关键词: 单片机 倒计时 定时器

  • 单片机常用功能模块的使用-定时器

    51 单片机编程经常要求对时间进行某种操作,比如数码管的动态扫描显示、延时等等……对于定时或延时,一般有三种方法实现: ①、软件定时:如常用的延时程序 Delay(),在定时过程中,CPU 循环测试延时变量是否满足条件,此时 CPU 利用率低下; ②、硬件定时:如外部芯片555 时基电路,通过外部阻容,达到一定的延时功能,改变阻容大小可以改变延时长度,这种定时器取决于硬件,设定好以后不能通过软件更改; ③、定时器:利用单片机内部定时器,实现对时间的操作。 1、定时器功能: (1)、定时:产生一个标准的时间间隔:如 20 ms,100 ms 等,单片机使用这种方式可以产生一个符合某一要求的脉冲方波; (2)、计数:对外部的事件(脉冲)进行统计,很明显外部事件的发生是随机的,单片机不可能预知外部事件何时发生,但可以进行统计,当达到所要求的数值时,单片机进行相应的操作。 2、四种工作模式: 模式 0:13 位计数器模式   在某一个初值的基础上加 1 计数,当计数器计满为全“1”,再来一个计数脉冲时,就产生一个“溢出中断信号”TF1=1。 注:由于低 8 位计数器中的高三位没有参与工作,故填装初值时应“避开”此三位。 模式 1:16 位定时/计数模式   类同于模式 0,由于两个计数器为完整的 8 位,故将计算好的 16 位初值可直接填装到 TH、TL 中。 模式 2:8 位自动重装初值模式   TL 做计数器,TH 做初值寄存器,工作前 TL1,TH1 分别预置相同的初值,TL1 计数时,产生溢出的同时,将 TH1 中的初值自动重装 TL1,TL1 继续计数。 模式 3:组合扩展模式(仅适用于 T0)   将 T0 和 T1 重新进行“拆分、组合”,将 T0 变为由 TH0,TL0 组成的两个独立的 8 位定时/计数器。 补充:四种模式比较:   3、定时器参数: (1)、定时器的个数:网上见到的 51 单片机教程都说定时器有 2 个:定时器 0 和定时器 1,实际上有的单片机有 3 个定时器,如博主买的开发板上的单片机:STC89C54RD+,因此,编程时注意看好有几个定时器…… (2)、TL,TH:初值寄存器,分别是低 8 位,高 8 位,后边加上一个数字 0 或 1,代表定时器 0 或定时器 1 (3)、TMOD:模式控制寄存器,属于 SFR 特殊功能寄存器,地址:89H,决定定时/计数器的四种工作模式,8 位   GATE 选通门:GATE=0 时,只要 TR=1,计数器就开始工作 GATE=1 时,只有 INT=TR=1 时,计数器工作(用来测量 INT 脚高电平脉冲的宽度) C/T:计数器输入脉冲选择开关,决定着计数器的“定时”或“计数”的两种工作方式 C/T=0:定时方式:计数器接收内部时钟信号 fosc C/T=1:计数方式:计数器接收引脚上的外部信号 M1、M0 模式选择:确定 4 种工作模式 (4)、TCON:控制寄存器,属于 SFR 特殊功能寄存器,地址:88H,8 位   TF:定时器溢出标志,计数器溢出时硬件自动置位,即 TF=1,进入中断后再由硬件自动清除(TF=0) TR:计数器的控制位 TR=1:计数器开始工作 TR=0:计数器停止计数 IE:外部中断 INT 的请求标志 当单片机检测到 INT 引脚上有下降沿时,IE=1 申请中断,进入中断服务程序时,硬件自动清除 IE 标志 IT:外中断触发类型控制 IT=1 时,外中断信号的下降沿触发 IE 标志 IT=0 时,外中断信号的低电平触发 IE 标志 (5)、作为“定时器”使用时,“定时”与“初值”的关系如下: T = ( M - TC ) × t 其中:T:定时时间 M:计数器的模 TC:计数初值 t:计数器计数脉冲的周期(t = fosc / 12) 注:具体计算实例,参见前面“四种模式比较”中的第二张图……

    时间:2019-07-31 关键词: 单片机 功能模块 定时器

  • 定时器计数实验

    #include typedef unsigned char u8; typedef unsigned int u16; sbit led = P1^0; u8 timer; void main (void) { TMOD = 0x01;//设置TMOD,使得T0工作在16位定时。 TH0 = (65535-50000) / 256; TL0 = (65535-50000) % 256; EA = 1; //开放总中断 ET0 = 1;//开放定时器0的溢出中断 TR0 = 1;//开始定时 while(1) //作用就是让程序结束 否则程序一直在这运行; { ; } } //实现方式一 void timer0_service(void) interrupt 1 { TH0 = (65535-50000) / 256; TL0 = (65535-50000) % 256; //50ms已经设置好了 timer ++; if (timer == 20) { timer = 0; led = ~led; } }    

    时间:2019-07-15 关键词: 计数实验 定时器

  • 单片机定时器的寄存器

    标准的 51 单片机内部有 T0 和 T1 这两个定时器,T 就是 Timer 的缩写,现在很多 51 系列单片机还会增加额外的定时器,在这里我们先讲定时器 0 和 1。前边提到过,对于单片机的每一个功能模块,都是由它的 SFR,也就是特殊功能寄存器来控制。与定时器有关的特殊功能寄存器,有以下几个,大家不需要去记忆这些寄存器的名字和作用,你只要大概知道就行,用的时候,随时可以查手册,找到每个寄存器的名字和每个寄存器所起到的作用。 表 5-1 的寄存器是存储定时器的计数值的。TH0/TL0 用于 T0,TH1/TL1 用于 T1。 表 5-1 定时值存储寄存器名称描述SFR 地址复位值 TH0定时器 0 高字节0x8C0x00 TL0定时器 0 低字节0x8A0x00 TH1定时器 1 高字节0x8D0x00 TL1定时器 1 低字节0x8B0x00 表 5-2 是定时器控制寄存器 TCON 的位分配,表 5-3 是则是对每一位的具体含义的描述。 表 5-2 TCON——定时器控制寄存器的位分配(地址 0x88、可位寻址)位76543210 符号TF1TR1TF0TR0IE1IT1IE0IT0 复位值00000000 表 5-3 TCON——定时器控制寄存器的位描述位符号描述 7TF1定时器 1 溢出标志。一旦定时器 1 发生溢出时硬件置 1。清零有两种方式: 软件清零,或者进入定时器中断时硬件清零。 6TR1定时器 1 运行控制位。软件置位/清零来进行启动/停止定时器。 5TF0定时器 0 溢出标志。一旦定时器 0 发生溢出时硬件置 1。清零有两种方式: 软件清零,或者进入定时器中断时硬件清零。 4TR0定时器 0 运行控制位。软件置位/清零来进行启动/停止定时器。 3IE1外部中断部分,与定时器无关,暂且不看。 2IT1 1IE0 0IT0 大家注意在表 5-3 中的描述中,只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作,后续遇到此类描述就不再另做说明了。 对于 TCON 这个 SFR,其中有 TF1、TR1、TF0、TR0 这 4 位需要我们理解清楚,它们分别对应于 T1 和 T0,我们以定时器 1 为例讲解,那么定时器 0 同理。先看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR1 = 0以后,定时器就会停止加 1,其值会保持不变化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期,TL1加 1 一次,当 TL1 加到 255 后,再加 1,TL1 变成 0,TH1 会加 1 一次,如此一直加到 TH1和 TL1 都是 255(即 TH1 和 TL1 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了,TH1 和 TL1 同时都变为 0,只要一溢出,TF1 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。 本节开头我们就提到了定时器有多种工作模式,工作模式的选择就由 TMOD 来控制,TMOD 的位分配和描述见表 5-4 到 5-6 所示,TMOD 的位功能如表 5-5 所示。 表 5-4 TMOD——定时器模式寄存器的位分配(地址 0x89、不可位寻址)位76543210 符号GATE (T1)C/T (T1)M1 (T1)M0 (T1)GATE (T0)C/T (T0)M1 (T0)M0 (T0) 复位值00000000 表 5-5 TMOD——定时器模式寄存器的位描述符号描述 T1/T0在表 5-5 中,标 T1 的表示控制定时器 1 的位,标 T0 的表示控制定时器 0 的位。 GATE该位被置 1 时为门控位。仅当„INTx‟脚为高并且„TRx‟控制位被置 1 时使能 定时器„x‟,定时器开始计时,当该位被清 0 时,只要„TRx‟位被置 1,定时 器 x 就使能开始计时,不受到单片机引脚„INTx‟外部信号的干扰,常用来测 量外部信号脉冲宽度。这是定时器一个额外功能,本节课暂不介绍。 C/T定时器或计数器选择位。该位被清零时用作定时器功能(内部系统时钟), 被置 1 用作计数器功能。 表 5-6 TMOD——定时器模式寄存器 M1/M0 工作模式M1M0工作模式描述 000兼容 8048 单片机的 13 位定时器,THn 的 8 位和 TLn 的 5 位组 成一个 13 位定时器。 011THn 和 TLn 组成一个 16 位的定时器。 1028 位自动重装模式,定时器溢出后 THn 重装到 TLn 中。 113禁用定时器 1,定时器 0 变成 2 个 8 位定时器。 可能你已经注意到了,表 5-2 的 TCON 最后标注了“可位寻址”,而表 5-4 的 TMOD 标注的是“不可位寻址”。意思就是说:比如 TCON 有一个位叫 TR1,我们可以在程序中直接进行 TR1 = 1 这样的操作。但对 TMOD 里的位比如(T1)M1 = 1 这样的操作就是错误的。我们要操作就必须一次操作这整个字节,也就是必须一次性对 TMOD 所有位操作,不能对其中某一位单独进行操作,那么我们能不能只修改其中的一位而不影响其它位的值呢?当然可以,在后续课程中你就会学到方法的,现在就先不关心它了。 表 5-6 列出的就是定时器的 4 中工作模式,其中模式 0 是为了兼容老的 8048 系列单片机而设计的,现在的 51 几乎不会用到这种模式,而模式 3 根据我的应用经验,它的功能用模式 2 完全可以取代,所以基本上也是不用的,那么我们就重点来学习模式 1 和模式 2。 模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。模式 2,是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255,THn 的值并不发生变化,而是保持原值,TLn 溢出后,TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。这个功能可以用来产生串口的通信波特率,我们讲串口的时候要用到,本章节我们重点来学习模式 1。为了加深大家理解定时器的原理,我们来看一下他的模式 1 的电路示意图 5-2。   图 5-2 定时器/计数器模式 1 示意图 我带领大家一起来分析一遍这个示意图,日后如果再遇到类似的图,大家就可以自己研究了。OSC 框表示时钟频率,因为 1 个机器周期等于 12 个时钟周期,所以那个 d 就等于 12。下边 GATE 右边的那个门是一个非门电路,再右侧是一个或门,再往右是一个与门电路,大家可以对照一下 5-1 节的内容。 图上可以看出来,下边部分电路是控制了上边部分,那我们先来看下边是如何控制的,我们以定时器 0 为例。 1) TR0 和下边或门电路的结果要进行与运算,TR0 如果是 0 的话,与运算完了肯定是 0,所以如果要让定时器工作,那么 TR0 就必须置 1。 2) 这里的与门结果要想得到 1,那么前面的或门出来的结果必须也得是 1 才行。在 GATE位为 1 的情况下,经过一个非门变成 0,或门电路结果要想是 1 的话,那 INT0 即 P3.2 引脚必须是 1 的情况下,这个时候定时器才会工作,而 INT0 引脚是 0 的情况下,定时器不工作,这就是 GATE 位的作用。 3) 当 GATE 位为 0 的时候,经过一个非门会变成 1,那么不管 INT0 引脚是什么电平,经过或门电路后都肯定是 1,定时器就会工作。 4) 要想让定时器工作,就是自动加 1,从图上看有两种方式,第一种方式是那个开关打到上边的箭头,就是 C/T = 0 的时候,一个机器周期 TL 就会加 1 一次,当开关打到下边的箭头,即 C/T =1 的时候,T0 引脚即 P3.4 引脚来一个脉冲,TL 就加 1 一次,这也就是计数器功能。

    时间:2019-07-12 关键词: 单片机 寄存器 定时器

  • Exynos 4412 看门狗定时器中断

    如果想弄懂看门狗定时器中断,要掌握下面两个知识点:1 懂寄存器Cortex A9采用的是ARM官方规定的中断处理机制有两大类寄存器决定了中断工作状态1) exynos 4412 特有的寄存器(在第26章)2) Cortex A9 规定的工作寄存器(在第9章和第10章)2 懂中断处理过程1) Arm启动先执行一段启动代码(start.S),这段代码是用汇编写的2) 然后,汇编代码再执行到c的main函数start.S讲解.text.global _start @@@@ _start 是一个全局标号 (表示在其他函数可以调用_start)_start: @@@@ 通常被指定为0x0000 0000地址b reset @@@@ 此段代码放在0x0000 0000地址处 ,命令功能是跳转到reset处去执行ldr pc,_undefined_instructionldr pc,_software_interruptldr pc,_prefetch_abortldr pc,_data_abortldr pc,_not_usedldr pc,_irq @@@@ 将_irq地址处的指令地址给PC ,相当于一条跳转命令,这条指令回放在0x0000 0018处ldr pc,_fiq_undefined_instruction: .word _undefined_instruction_software_interrupt: .word _software_interrupt_prefetch_abort: .word _prefetch_abort_data_abort: .word _data_abort_not_used: .word _not_used_irq: .word irq_handler @@@@ .word 是一条伪指令,相当于定义一个4字节的变量_irq,值为irq_handler@@@@ 等价于 int _irq = irq_handler_fiq: .word _fiq@@@@ 伪指令:不是一条实际的汇编指令,变量定义,宏定义,数组定义reset:@@@@ 初始化 协处理器ldr r0,=0x40008000mcr p15,0,r0,c12,c0,0 @ Vector Base Address Register@@@@ 设置cpsr的值,为0xd3mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3 @@@@ 0xd3 1101 0011 禁止FIQ, IRQ, 处于ARM状态 ,模式为管理模式 SVCmsr cpsr,r0 @ Enable svc mode of cpuinit_stack: @@@@初始化堆栈, svc, irq, fiq.... 每种模式的堆栈大小为512字节ldr r0,stacktop /*get stack top pointer*//********svc mode stack********/mov sp,r0sub r0,#128*4 /*512 byte for irq mode of stack*//****irq mode stack**/msr cpsr,#0xd2mov sp,r0sub r0,#128*4 /*512 byte for irq mode of stack*//***fiq mode stack***/msr cpsr,#0xd1mov sp,r0sub r0,#0/***abort mode stack***/msr cpsr,#0xd7mov sp,r0sub r0,#0/***undefine mode stack***/msr cpsr,#0xdbmov sp,r0sub r0,#0/*** sys mode and usr mode stack ***/msr cpsr,#0x10mov sp,r0 /*1024 byte for user mode of stack*/@@@此处可以添加自己的初始化代码b main @@@@ 跳转到main函数,不会回来了.align 4/**** swi_interrupt handler ****//**** irq_handler ****/irq_handler: @@@@ 一旦IRQ中断会跳转到这sub lr,lr,#4stmfd sp!,{r0-r12,lr} @@@@ 将r0-r12, lr寄存器入栈,,,,保护现场bl do_irq @@@@ 跳转到中断服务程序do_irq, 执行完再回来ldmfd sp!,{r0-r12,pc}^ @@@@ 将栈中数据出栈,给r0-r12, lr寄存器,,,,恢复现场stacktop: .word stack+4*512.datastack: .space 4*512//////////////////////////////////下面是C代码//////////////////////////////void do_irq(void ) //C语言的中断服务程序代码,这段程序是程序员需要重点完成的{int irq_num;irq_num = (CPU0.ICCIAR & 0x1FF);switch (irq_num) {case 58: //turn on LED2; turn off LED3GPX2.GPX2DAT = 0x1 << 7;GPX1.GPX1DAT &= ~0x1;printf("IRQ interrupt !! turn on LED2; turn off LED3n");//Clear PendEXT_INT41_PEND |= 0x1 << 2;ICDICPR.ICDICPR1 |= 0x1 << 26;break;}// End of interruptCPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;}int main(void){//.....}二:GIC控制器初始化, ARM提供(Generic Interrupt Controller)////////4412 的中断控制其部分,采用了ARM公司的GIC中断控制器架构GIC中断共152个, 分为三部分SGI 16个 Software Generated Interrupt (SGI)PPI 8个 Private Peripheral Interrupt (PPI)SPI 128 Shared Peripheral Interrupt (SPI)每个中断都被编了一个ID可以根据GIC Interrupt Table 来查找SPI Port No SPI中断源编号ID 总的中断源编号exynos4412 已经连接了两个外部中断中断源 SPI Port No IDEINT[9] 25 57GIC 设置流程:1 设置GIC中的某个SPI 中断允许还是禁止////////////////ICDISER(n) ICDISER1, ICDISER2, ICDISER3, ICDISER4SPI中断共128个,分成了4组ICDISER1 ---- > 控制 0-31 (第1组) (控制此中断编号是否可以产生中断 1 允许,0 禁止)ICDISER2 ---- > 控制 32-63 (第2组)ICDISER3 ---- > 控制 64-95 (第3组)ICDISER4 ---- > 控制 96-127 (第4组)INT9 ---- 25号 INT10 ---- 26号ICDISER1 (GIC的通道号0-31) 如果某一位为1 那么中断允许允许INT9 产生中断ICDISER.ICDISER1 |= (0x1 << 25); //中断使能寄存器允许INT10 产生中断ICDISER.ICDISER1 |= (0x1 << 26); //中断使能寄存器练习:允许WDT产生中断(43)ICDISER2 |= 0x1 << 11; (43 % 32)2 设置 某个CPU是否允许响应中断(默认情况,4个CPU都不响应中断)ICCICR: 对应于每个CPU,都有一个ICCICR,他的功能是 控制这个CPU的总的中断开关,1表示这个CPU响应中断, 0表示不响应中断CPU0.ICCICR |= 0x1; (把它值1,表明CPU0响应中断)3 设置 某个CPU响应的中断的最高优先级CPU0.ICCPMR = 0xFF; //上面允许了中断,ICCPMR中断优先级低于设置值的中断允许进入 0xFF最高,如果设置成0,4 设置 中断产生时是否影响中断标志位, 具体中断标志在哪参照ICDICPRICDDCRICDDCR = 1; //总的中断标志置位允许位5 设置某个中断是由哪个CPU来响应ICDIPTR 有很多组:4个中断为1组(中断ID号最大159, 160 / 4 = 40, ICDIPTR 有40个 )如果设置EINT9由CPU0来响应(EINT9 是57号,所以在编号14的寄存器中(56, 57, 58, 59))ICDIPTR.ICDIPTR14 = 0x00000100; //表示总中断号为 57的中断由CPU0来处理如果设置EINT9由CPU1来响应ICDIPTR.ICDIPTR14 = 0x00000200; //表示总中断号为 57的中断由CPU1来处理如果设置EINT9由CPU2来响应ICDIPTR.ICDIPTR14 = 0x00000400; //表示总中断号为 57的中断由CPU2来处理如果设置EINT9由CPU3来响应ICDIPTR.ICDIPTR14 = 0x00000800; //表示总中断号为 57的中断由CPU3来处理如果设置EINT9由CPU4来响应ICDIPTR.ICDIPTR14 = 0x00001000; //表示总中断号为 57的中断由CPU4来处理//上面的寄存器设置我的中断由哪个CPU来处理ICDIPTR 有很多(设置某个中断由哪个CPU来执行)ICDIPTR1 ICDIPTR1 ICDIPTR2 ICDIPTR3 ICDIPTR4 ICDIPTR5........有 160 / 4 个, 共40个, 每个寄存器控制4个中断每个寄存器是32位的,8位为1组, 每组代表某种中断由哪个CPU来执行0000 0001 表示由 CPU0来处理0000 0010 表示由 CPU1来处理0000 0100 表示由 CPU2来处理0000 1000 表示由 CPU3来处理0001 0000 表示由 CPU4来处理0010 0000 表示由 CPU5来处理0100 0000 表示由 CPU6来处理1000 0000 表示由 CPU7来处理一个32位寄存器可以分四组ICDIPTR.ICDIPTR14 = 0x01010101; //编号56,57,58,59四个中断,由CPU0来处理14 是 总的中断编号 / 4如果设置EINT9 (57) 中断优先级10ICDIPR14 = 0x00000A00;下面是看门狗定时器中断示例#include* @brief IRQ Interrupt Service Routine program body* @param[in] None* @return Noneint flag = 0;void do_irq(void){int irq_num;irq_num = (CPU0.ICCIAR & 0x1FF); //获取中断编号printf("n ******* WDT interrupt !!********n");if(flag == 0){//点亮flag = 1;}else{//点灭flag = 0;}//换成点亮或点灭LED3 GPX1_0WDT.WTCLRINT = 1; //清exynos4412中断标志位// End of interruptCPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num; //清cpu0中断标志位}void wdt_init(){WDT.WTCNT = 6000; //initial value ,, 延时大概有两秒WDT.WTDAT = 6000; //initial value ,, 延时大概有两秒WDT.WTCON = 0xff<<8 | 1<<5 | 3<<3 | 1<<2 ;}void mydelay_ms(int time){int i, j;while(time--){for (i = 0; i < 5; i++)for (j = 0; j < 514; j++);}}int main(void){/** GIC interrupt controller:* */// Enables the corresponding interrupt SPI43, WDTICDISER.ICDISER2 |= 1<<11; //ICDISER2:spi 32[bit0] ~ 63[bit31], 43 - 32 = [bit11]CPU0.ICCICR |= 0x1; //Global enable for signaling of interruptsCPU0.ICCPMR = 0xFF; //The priority mask level.Priority filter. thresholdICDDCR = 1; //Bit1: GIC monitors the peripheral interrupt signals and// forwards pending interrupts to the CPU interfaces2//ICDIPTR18:SPI40~SPI43; SPI43 interrupts are sent to processor 0ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xFF<<24)) | 1<<24;wdt_init();printf("n****************WDT Interrupt test!!***************n");while(1){mydelay_ms(200);mydelay_ms(200);printf("working...n");}return 0;}

    时间:2019-07-09 关键词: ARM 看门狗 C语言 定时器

  • MCS-51单片机的定时器/计数器概念

    一、MCS-51单片机的定时器/计数器概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,而花费的时间恰好是1微秒;只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝; 因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51单片机外接的是12MHZ的晶振(实际上是11.0592MHZ),所以,MCS-51单片机内部的工作频率(时钟脉冲频率)是12MHZ/12=1MHZ=1000000次/秒=1000000条指令/秒=1000000次/1000000微秒=1次/微秒=1条指令/微秒;也就是说,晶振振荡一次,就会给单片机提供一个时钟脉冲,花费的时间是1微秒,此时,CPU会执行一条指令,经历一个机器周期;即:1个时钟脉冲=1个机器周期=1微秒=1条指令; 注:个人PC机上的CPU主频是晶振经过倍频之后的频率,这一点恰好与MCS-51单片机的相反,MCS-51单片机的主频是晶振经过分频之后的频率; 总之:MCS-51单片机中的时间概念就是通过计数脉冲的个数来测量出来的;1个脉冲=1微秒=1条指令=1个机器周期; MCS-51单片机定时器/计数器的简单结构图:   8051系列单片机有两个定时器:T0和T1,分别称为定时器和定时器T1,这两个定时器都是16位的定时器/计数器;8052系列单片机增加了第三个定时器/计数器T2;它们都有定时或事件计数功能,常用于时间控制、延时、对外部时间计数和检测等场合; 二、定时器/计数器的结构 8051单片机的两个定时器T0和T1分别都由两个特殊功能寄存器组成;T0由特殊功能寄存器TH0和TL0构成,而T1则是由TH1和TL1构成; 作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数;所以,定时器的分辨率是时钟振荡频率的1/12; 作为计数器使用时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1;计数器的最高频率一般是时钟振荡频率的1/24; 由此可知,不论是定时器还是计数器工作方式,定时器T0和T1均不占用CPU的时间,除非定时器/计数器T0和T1溢出,才可能引起CPU中断,转而去执行中断处理程序;所以说,定时器/计数器是单片机中效率高而工作灵活的部件; 三、定时器/计数器的工作模式 除了可选择定时器和计数器的这两种工作方式外,每个定时器/计数器都有4种工作模式; 在模式0、1和2时,T0和T1的工作模式相同;在模式3时,两个定时器/计数器的工作模式不同; 工作模式0: 由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数器;定时器/计数器启动后,定时或计数脉冲个数加到TL0上,从预先设置的初值(时间常数)开始累加,不断递增1;当 TL0计满后,向TH0进位,直到13位寄存器计满溢出;溢出时,定时器/计数器硬件会自动地把13位的寄存器值清0,中断标记TF0置1;如果需要进一步定时/计数,需要使用相关指令重置时间常数,并把定时器/计数器的中断标记TF0置0;工作模式0的结构如下图:   工作模式1: 模式1与模式0几乎完全相同,唯一的区别就是,模式1中的寄存器TH0和TL0共同构成的是一个16位定时器/计数器来参与操作,因此比模式0中的定时/计数范围更大;工作模式1的结构如下图:   工作模式2: 这种模式又称为自动再装入预置数模式;当定时器/计数器的寄存器TH0/TL0的值溢出时,定时器/计数器硬件设备会自动把寄存器TH0/TL0的值清0,以重新开始操作;但是有时候,我们的定时/计数操作是需要多次重复定时/计数的,如果溢出时不做任何处理,那么,在第二轮定时/计数时就是从0开始定时/计数了,而这并不是我们想要的;所以,要保证每次溢出之后,在重新开始定时/计数的操作是我们想要的,那就要把预置数(时间常数)重新装入某个地方;而重新装入预置数的操作是硬件设备自动完成的,不需要人工干预所以,这种工作模式就叫自动再装入预置数方式;既然需要重新装入预置数,那么预置数就必须要存放在某个地方,才能保证重装操作成功;在工作模式2中,把自动重装入的预置数存放在定时器/计数器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0参与定时/计数操作;显然,定时/计数的方位小了很多; 注:这个工作模式常用于波特率发生器(串口通讯),T1工作在串口模式2;用于这种方式时,定时器就是为了提供一个时间基准;计数溢出之后,不需要做太多的事情,只做一件事就可以,就是重新装入预置数,再开始重新计数,而且中间不需要任何延时;工作模式2的结构如下图:   工作模式3: 由于定时器/计数器T1没有工作模式3,如果把定时器/计数器T0设置为工作模式3,那么TL0和TH0将被分割成两个相互独立的8位定时器/计数器;工作模式3的结构如下图: 四、定时器/计数器的定时/计数范围 工作方式0:13位定时器/计数器工作模式,最多可计数2的13次方次,即:8192次,[0,8191]; 工作方式1:16位定时器/计数器工作模式,最多可计数2的16次方次,即:65536次,[0,65535]; 工作方式2:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次,[0,255]; 工作方式3:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次,[0,255]; 预置数的计算公式:预置数=最大值-需要计数的次数; 五、定时器/计数器的控制寄存器 8051单片机设计了两个8位的特殊功能寄存器来控制定时器/计数器的工作状态;这两个特殊功能寄存器分别是TMOD和TCON;它俩都在特殊功能寄存器区; 1、工作模式控制寄存器TMOD(89h):   2、工作状态控制寄存器TCON(88H):   六、定时器/计数器的初始化 1、设置定时器/计数器的工作模式TMOD(常用的是模式1:TMOD=0x01); 2、装入预置数到THx和TLx中(THx=TLx=MAX(8192/65536/256)-计数次数); 3、如果工作在中断方式,则需要开定时器/计数器的中断TCON中的标志位:TF0/TF1=0/1; 4、启动定时器/计数器:TR0/TR1=1; 注:由于8051单片机的定时器/计数器使用的时钟脉冲是外部晶振(12MHZ)经过12分频(12MHZ/12=1MHZ)之后的频率,所以,一个时钟脉冲就是1微秒;所以,8192个脉冲=8192微秒=8.192毫秒; 65536个脉冲=65536微秒=65.536毫秒; 256个脉冲=256微秒=0.256毫秒;

    时间:2019-07-06 关键词: 单片机 计数器 mcs-51 定时器

  • 定时器/计数器控制寄存器TCON的格式与各位功能

    定时器/计数器控制寄存器TCON锁存了外部中断源及其触发方式、定时器T0和T1溢出中断。TCON寄存器中的IE0、IT0、IE1、IT1。TCON中的位格式如下:     IE0:为外部中断INT0的请求标志位。当INT0引脚上出现中断请求信号(低电平或脉冲下降沿)时,硬件自动将IE0置“1”,产生中断请求标志。 IT0:外部中断INT0触发方式控制位。由软件来置“1”或清“0”,以控制外部中断INT0的触发方式。当IT0=1 时,外部中断INT0为下降沿触发。即外部中断INT0出现下降沿时,触发IE0,使其为“1”;当IT0=0时,外部中断INT0为电平触发。即外部中断INT0出现低电平时,触发IE0,使其为“0”。 IE1:为外部中断INT1的请求标志位。功能与IE0相同。 IT1:外部中断INT1触发方式控制位。功能与IT0相同。

    时间:2019-06-30 关键词: 计数器 tcon 控制寄存器 定时器

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包