历史上的今天
返回首页

历史上的今天

今天是:2025年06月21日(星期六)

2021年06月21日 | stm32学习之基本定时器--TIM

2021-06-21 来源:eefocus

  stm32f1系列,有基本定时器、通用定时器、高级定时器三类TIM定时器。其中,TIM6/7是本文要讲的基本定时器。


  基本定时器TIM6/7是16位的只能向上计数的定时器,只能用于定时。而通用定时器和高级定时器有更多的功能,如还可以进行输出比较、输入捕捉等功能,相关的介绍会写在后面的文章,这里只讲基本定时器。


  先看看基本定时器的框图,如图24-1。

图24-1


  时钟源


  我们查阅参考手册RCC章节的时钟树可以知道,RCC的定时器时钟TIMxCLK,即内部时钟CK_INT是由APB1预分频器分频后提供。如图24-2所示,如果APB1预分频系数为1,,则频率不变,否则频率为2倍。即此时用于分频的APB1的预分频系数为2,所以TIMxCLK = 36 * 2 = 72MHz。

图24-2


  计数器时钟


  如图24-1的框图,计数器时钟由内部时钟CK_INT提供,经过PSC预分频器后得到CK_CNT。PSC是一个16位的预分频器,可以对定时器时钟TIMxCLK进行1~65536之间的任何一个数进行分频。分频后的CK_CNT值的计算在参考手册TIMx_PSC寄存器描述里有提到,如图24-3。

图24-3


  即CK_CNT = CK_PSC/(PSC[15:0]+1)。


  计数器


  计数器CNT是一个16位的计数器,只能往上计数,最大计数值为65535。


  自动重装载寄存器TIMx_ARR


  TIMx_ARR寄存器里存着最大的计数值,当计数到该值时,会产生中断。当然了你得使能了中断才可以。


  定时时间计算


  计一个数的时间是1/CK_CNT,产生一次中断的时间为(ARR+1)/CK_CNT。如果在中断服务程序里设置一个变量time用于记录中断次数,则定时时间为:(ARR+1)/CK_CNT*time。


  TIM_TimeBaseInitTypeDef


  如图24-4为基本定时器TIM_TimeBaseInitTypeDef结构体定义。

图24-4


  TIM_Prescaler:指定定时器预分频器数值,由TIMx_PSC寄存器配置,可设置范围为0x0000~0xFFFF,即0~65535;


  TIM_CounterMode:计数模式,可分为向上计数、向下计数以及三种中心对齐模式。而基本定时器只能向上计数;


  TIM_Period:计数器周期,即自动重装载寄存器TIMx_ARR的值,在事件生成时更新到影子寄存器,由TIMx_CR1寄存器的ARPE位配置是否使能缓冲;


  TIM_ClockDivision:时钟分频,配置定时器时钟CK_INT频率与数字滤波器采样时钟频率分频比,基本定时器没有这个功能,不用设置;


  TIM_RepetitionCounter:重复计数器,属于高级控制寄存器专用寄存器位,利用它可以很容易控制输出PWM个数,这里不用设置。


  定时1s实验


  例如,需要做一个1s的定时,CK_PSC=72MHz,则PSC=71,那么CK_CNT=1MHz,


  计一个数时间:1/CK_CNT = 1/1MHz = 1us,


  中断一次的时间:(ARR+1)/CK_CNT = (999+1)/1MHz = 1ms,


  则定时时间:(ARR+1)/CK_CNT*time = 1ms*1000 = 1s


  我们用led的亮灭状态变化来展示1s的定时。


  初始化TIM_TimeBaseInitTypeDef


  前文提到的TIM_TimeBaseInitTypeDef结构体有5个成员,但基本定时器TIM6/7只用到了TIM_Prescaler和TIM_Period这两个成员,其他三个是通用定时器和高级定时器才会用到的。


 /**


  * @brief 基本定时器配置


  * @param 无


  * @retval 无


  */


  static void BASIC_TIM_Mode_Config(void)


  {


  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); // 内部时钟72MHz


  TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载寄存器的值


  TIM_TimeBaseStructure.TIM_Prescaler= 71; // 预分频器数值


  TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);


  TIM_ClearFlag(TIM6, TIM_FLAG_Update); // 清除计数器中断标志位


  TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);


  TIM_Cmd(TIM6, ENABLE);


  }



  中断优先级配置


  有关中断配置相关已经在之前的文章介绍过,有不清楚的地方可移步阅读。这里只说几个配置的关键点。可配置中断优先级分组为0,即0位抢占优先级,4位子优先级。配置中断源为TIM6_IRQn。


/**


  * @brief 中断优先级配置


  * @param 无


  * @retval 无


  */


  static void BASIC_TIM_NVIC_Config(void)


  {


  NVIC_InitTypeDef NVIC_InitStructure;


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);


  NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;


  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;


  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


  NVIC_Init(&NVIC_InitStructure);


  }



  中断函数


  中断函数在stm32f10x_it.c文件里配置。



extern volatile uint32_t time; // 该变量定义在main()函数里


  void TIM6_IRQHandler(void)


  {


  if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)


  {


  time++; // 每中断一次,time值加1,中断一次时间为1ms,需要中断1000次才可定时1s,即time值为1000


  TIM_ClearITPendingBit(TIM6, TIM_FLAG_Update);


  }


  }


  最后在main()函数里调用led和定时器的初始化配置函数,在一个循环里判断time变量的值是否为1000,如果已经达到1000,则led灯状态变化(亮或灭)一次,并且time变量值重赋为0,以便继续判断及定时。


推荐阅读

史海拾趣

CITIZEN公司的发展小趣事

随着技术的不断进步和产品的不断创新,西铁城公司开始积极拓展全球市场。公司的产品以其高品质、精确度和创新技术而闻名,逐渐赢得了全球消费者的青睐。同时,公司也积极参与国际性的钟表展会和活动,通过展示最新产品和技术成果,进一步提升品牌知名度和影响力。这一系列的举措使得西铁城在全球市场上的地位日益稳固。

Chip Technologies Inc公司的发展小趣事

随着电子行业的竞争加剧,Chip Technologies Inc面临着来自各方面的挑战。为了应对这些挑战,公司及时调整了发展策略,加大了在研发和市场拓展方面的投入。同时,公司还加强了内部管理,提升了生产效率和质量水平。这些举措使得公司在激烈的市场竞争中保持了稳健的发展态势。

科达嘉CODACA公司的发展小趣事

科达嘉电子不仅立足于深圳,还积极布局全球市场。公司通过参加国际电子展会、与国际知名企业合作等方式,不断拓展海外市场。同时,科达嘉还根据客户需求,提供个性化的电感解决方案,赢得了众多客户的信任和合作。公司的主要产品,如一体成型电感、大电流电感等,已广泛应用于工业控制、汽车电子等多个领域。

Ememory Technology Inc公司的发展小趣事

为了满足市场对高性能、低功耗芯片的需求,eMemory在2016年宣布向150nm高电压制程工艺扩展其可编程Neobit技术。这一技术的成功开发,使得eMemory能够在LCD驱动IC、逻辑IC和功率控制IC等高速增长的市场中占据一席之地。Neobit技术的可擦编程只读存储器特性,为芯片设计提供了更大的灵活性和可定制性。

台湾固锝(GD)公司的发展小趣事
衡量放大器对信号噪声贡献的指标,低噪声系数表示放大器引入的噪声较少。
ERA Transformers公司的发展小趣事

在电子行业中,ERA Transformers公司以其开创性的技术而闻名。该公司专注于研发和生产高效的电子变压器,以满足不断增长的电子设备需求。在一次研发过程中,公司工程师们面临了一个重大挑战:如何提高变压器的能效和稳定性。经过数月的深入研究与反复试验,他们终于开发出了一种新型的高效能变压器,该变压器采用了先进的材料和独特的设计,显著提高了能效和稳定性,这一创新技术的突破使得ERA Transformers公司在电子行业中崭露头角。

问答坊 | AI 解惑

三极管的问题

有一个疑问 如果一个npn的三极管be间我不给它加电压,而只是在ce段加一个电压(对于集电极来说是反向的一个电压),此时发射结在ce电压的作用下,是处于正向偏执的啊 那么此时通过三极管的电流是不是也应该很大那?? 等待解惑啊!!!…

查看全部问答>

清华大学嵌入式培训教材

清华大学的教材,很适合初学者…

查看全部问答>

MLC NandFlash K9G8G08 的问题

环境:Eboot + Wince 6.0,pxa270 CPU,Samsung K9G8G08 1G Bytes NandFlash。 现象:在nandflash存储的数据丢失。 往nandflash里面拷贝程序,都可用。但是一重启就丢失了。 nandflash分为两个部分,一部分为binfs格式,存储操作系统。另一部分 ...…

查看全部问答>

armcc 编译问题请教

strlen(\"bdfasf\"); 用armcc -c 编译 出现  line 10: Error: C3028E: : implicit cast of pointer to non-equal pointer 如果 这样 strlen((unsigned char *)\"bdfasf\"); 编译便没有问题 如果这样 ,不是问题大了,都要带上 ...…

查看全部问答>

请教一个烧录nand flash的问题

开发系统是基于S3C2440的。我已经编译好了bootloader,kernel和yaffs2,现在是用bootloader去烧。希望能用专用的flash编程器烧录。有哪位高人有过类似的经验? 其中有以下问题: 1. 对于kernel来说因为后面的spare 64字节放有ECC校验位,这个东西 ...…

查看全部问答>

无线网卡

大家好,我的笔记本是IBMt43的1871A85,我的无线网卡信号接受不是很好,所以我想买一款PCM接口的网卡,请大家推荐一下。谢谢。…

查看全部问答>

请教并口测试问题

主板上面的并口,在不接实际并口设备(比如打印机等)应该怎么去测试啊?测试的原理是什么?如何才算是PASS,在DOS下开发并口测试程式应该怎么样去实现啊?小弟没入门需要高手点拨,感激啊!~~~~…

查看全部问答>

自己绕制变压器

本帖最后由 paulhyde 于 2014-9-15 03:53 编辑 求自己绕制变压器的方法,参数计算及注意事项(全国电子设计大赛,高频磁芯),高手请进...  …

查看全部问答>

ccs3.3 DSP2812 外设的头文件在哪

刚接触DSP,有点疑惑, 如果操作DSP的外设,向spi AD 等,是不是要对寄存器的地址进行说明,单片机都是有个头文件对这些外设进行说明。 可是在CCS3.3的资料中我没找到有单独对寄存器进行声明的头文件,难道这些寄存器要自己声明,如果ccs3.3中有 ...…

查看全部问答>

【C28汇编语言杂谈】一、C语言与汇编的比较

【C28汇编语言杂谈】 大家都知道,C语言编程方便,可读性好,移植容易,有与硬件联系密切的特点,使用提供的头文件可以对CPU的内部寄存器及外围编程。通用性强。但编译器并非智能型的,对于C语言编译连接后所产生的机器码不尽相同,且一般很难达到 ...…

查看全部问答>