历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | 基于STM8的TIM定时器操作---STM8-第三章

2019-12-04 来源:eefocus

1. 综述


  STM8S提供三种类型的 TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个定时器设计应用变得非常容易与方便(相同的寄存器映射,相同的基本功能)。


  本文只针对STM8S103该芯片进行介绍,该芯片的定时器个数为3个,每个类型的定时器都一个,分别为高级控制型(TIM1)、通用型(TIM2)、基本型定时器(TIM4)。


2. 关于STM8S103手册的TIM简介

  每个定时器的功能都有详细介绍,大家可以认真看下。


3. TIMx详细讲解


3.1 TIM1解析


  TIM1_Prescaler          :即预分频系数,带有16位预分频的16位递增、递减和双向(递增/递减)自动重载计数器。


  TIM1_CounterMode      :即计数模式,共有3种计数模式,分别为是向上计数模式、向下计数模式、中央对齐模式(该模式又含有3种对齐模式)。


  TIM1_Period                 :自动重载值,此项可取1-65535任意数值。


  TIM1_RepetitionCounter :重复计数器值。


 


  假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:  


  TIM1_TimeBaseInit(15,TIM1_COUNTERMODE_UP,1000,100);  


计算方法:定时器的频率fcnk = 16Mhz/(15+1) = 1Mhz,说明一次计数为1us,1000次计数为1ms,而重复计数100次,则一次中断计时时间为100ms,为了到达1s的效果,我们还需要在中断函数里面,进行一个10次的判断。(1MHZ = 1000KHZ = 1000000HZ, 相当于 1/1000000 = 1us)


3.2 TIM2解析


  TIM2_Prescaler :15位的预分频系数,分频系数可调整为1~32768之间的2次幂数值。


  TIM2_Period      :自动重载值,此项可取1-65535任意数值。


假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为: 


TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000)


计算方法:定时器的频率fcnk = 16Mhz/(16) = 1Mhz,说明一次计数为1us,1000次计数为1ms,重复计数默认1次,则中断一次时时间为1ms,为了到达1s的效果,我们还需要载中断函数里面,进行一个1000次的判断。


3.3 TIM4解析


  TIM4_Prescaler :8位自动装载可调整的预分频系数,分频系数可调整为1~128之间2次幂数值。


  TIM4_Period      :自动重载值,此项可取1-255任意数值。 


假设我们的系统时钟是16Mhz,我们定时1秒钟,那我们初始化设置应该为:


TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);


计算方法:定时器的频率fcnk = 16Mhz/(128) = 0.125Mhz,说明一次计数为8us,250次计数为2ms,重复计数默认1次,则中断一次时时间为2ms,为了到达1s的效果,我们还需要载中断函数里面,进行一个500次的判断。


4. 例程


4.1 编译环境


  我的编译环境是IAR,这款软件是现在STM8的主流平台,比较推荐。不过我打算等到STCubeMX更新出比较方便的版本后再去使用Keil5,因为在用STM32的时候就是利用Keil5编译代码,的确很方便。


4.2 主芯片


  我的主芯片是STM8S系列中的103,其中STM8S的003、005、和103、105,配置一样(外设和CPU频率,FLASH),在代码相同的情况下均可进行烧写。


4.3 库文件的添加


  我们的工程可以在IAR中的官方例程中复制,操作过程:打开STM8S_StdPeriph_Lib(这是一个官方的库文件,下载IAR STM8包的时候就携带,里面有库文件和相对应的例程),将Libraries文件复制到你工程所在的文件下,并将有关于ADC的库文件添加到你的工程列表当中。添加完成后,就可以开始编写代码了(如果你将全部的库文件都添加进来的话,编译程序后库文件还有红点报错的话,这是因为你选的芯片上没有该功能,你需要将其删掉才能不报错。)如图。

4.4 代码

4.4.1 TIM1


初始化:


/*******************************************************************************

* Function Name  : MX_TIM1_Init

* Description    : TIM1 Init

* Input          : None

* Output         : None

* Return         : None

********************************************************************************/

void MX_TIM1_Init(void)

{

  //定时器1参数初始化 (15分频,向上计数,计数次数,重复次数)

  TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 100);

 

  //Clear TIM1 update flag

  TIM1_ClearFlag(TIM1_FLAG_UPDATE);

 

  //Enable update interrupt

  TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);

  TIM1_Cmd(ENABLE);

  

  //使能中断

  enableInterrupts();

}

中断服务函数:


由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,所以此段代码需要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。


通过初始化所配置的参数,加上count 10次的累加,达到1S翻转一次LED的效果,每一次进行中断后都需要对定时器的标志位进行清零处理。


INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)

{

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

  static uint8_t count = 0;

  

  if(count++ == 10)

  {

    //翻转LED

    GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);

    

    count = 0;

  }

  //定时器1的标志位清零

  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);

}

 


4.4.2 TIM2


初始化:


/*******************************************************************************

* Function Name  : MX_TIM2_Init

* Description    : TIM1 Init

* Input          : None

* Output         : None

* Return         : None

********************************************************************************/

void MX_TIM2_Init(void)

{

  //定时器2参数初始化 (16分频,计数次数)

  TIM2_TimeBaseInit(TIM2_PRESCALER_16, 1000);

 

  //Clear TIM2 update flag

  TIM2_ClearFlag(TIM2_FLAG_UPDATE);

 

  //Enable update interrupt

  TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);

  TIM2_Cmd(ENABLE);

  

  //使能中断

  enableInterrupts();

}

中断服务函数:


由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,所以此段代码需要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。


通过初始化所配置的参数,加上count 1000次的累加,达到1S翻转一次LED的效果,每一次进行中断后都需要对定时器的标志位进行清零处理。


INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)

 {

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

  static uint16_t count = 0;

  

  if(count++ == 1000)

  {

    //翻转LED

    GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);

    

    count = 0;

  }

  //定时器2的标志位清零

  TIM2_ClearITPendingBit(TIM2_IT_UPDATE);

 }

 


4.4.3 TIM4


初始化:


/*******************************************************************************

* Function Name  : MX_TIM4_Init

* Description    : TIM1 Init

* Input          : None

* Output         : None

* Return         : None

********************************************************************************/

void MX_TIM4_Init(void)

{

 

  //定数4初始化    (128分频,计数次数)

  TIM4_TimeBaseInit(TIM4_PRESCALER_128, 250);

 

  //Clear TIM4 update flag

  TIM4_ClearFlag(TIM4_FLAG_UPDATE);

 

  //Enable update interrupt

  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);

  TIM4_Cmd(ENABLE);

  

  //使能中断

  enableInterrupts();

}

中断服务函数:


由于IAR中库函数工程模板的中断都写在 stm8s_it.c 库文件中,所以此段代码需要写在stm8s_it.c库文件相对应的芯片中才能进行中断处理。


通过初始化所配置的参数,加上count 500次的累加,达到1S翻转一次LED的效果,每一次进行中断后都需要对定时器的标志位进行清零处理。


INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)

 {

  /* In order to detect unexpected events during development,

     it is recommended to set a breakpoint on the following instruction.

  */

   

  static uint16_t count = 0;

  

  if(count++ == 500)

  {

    //翻转LED

    GPIO_WriteReverse(Led_Opt_GPIO_Port, Led_Opt_Pin);

    

    count = 0;

  }

  //定时器4的标志位清零

  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

  

 }

 

5. 结尾 


  本博客只介绍了如何控制LED翻转,但定时器的功能远不止于此,详情请大家自行去了解。

  相对来说,STM8的定时器功能还是比较有用的,希望该博客能够帮助到大家实现TIM功能。

推荐阅读

史海拾趣

Antiference公司的发展小趣事

随着技术的不断进步,Antiference公司开始将目光投向国际市场。公司积极参与国际电子展,展示其先进的电磁干扰抑制技术,并成功吸引了众多国外客户的关注。通过与国外知名企业的合作,Antiference的产品逐渐打入国际市场,品牌知名度也大幅提升。

General Instrument Optoelectronics公司的发展小趣事
如果电子琴内部电源电路出现故障,应请专业人员进行检查和维修。
芯茂微电子公司的发展小趣事

近年来,随着国家对集成电路产业的重视和支持力度的不断加大,芯茂微电子也积极响应国家号召,致力于推动国产集成电路产业的发展和自主创新。公司加强了对核心技术的研究和投入,积极引进和培养高端人才,加强与国内外知名企业和研究机构的合作与交流。同时,公司也积极参与国家重大科研项目和产业化项目,为推动我国集成电路产业的发展和自主创新做出了积极贡献。这些努力不仅提升了芯茂微电子的技术实力和市场竞争力,也为我国集成电路产业的发展注入了新的活力和动力。

以上五个故事仅代表芯茂微电子在电子行业发展过程中的一部分经历和成就。随着公司的不断发展和壮大,相信未来还会有更多精彩的故事等待我们去发现和书写。

ENERGIZER公司的发展小趣事

为了配合全球业务的发展,ENERGIZER在亚太地区设立了8个厂房和18个国家的办事处。其中,劲量(中国)有限公司于1992年开始进驻中国,并在1998年在天津设立了生产工厂。这一举措不仅促进了中国与国际间的技术交流与合作,还为中国的电池制造业带来了新的发展机遇。随着中国市场的不断扩大,ENERGIZER在中国的业务也逐渐壮大,成为了中国电池市场的重要参与者。

Display Elektronik GmbH公司的发展小趣事

面对数字化浪潮的冲击,Display Elektronik GmbH积极拥抱数字化转型。公司利用大数据、云计算等先进技术,实现了生产、销售、服务等各个环节的数字化管理。这种数字化转型不仅提高了公司的运营效率和管理水平,还为客户提供了更加便捷、高效的服务体验。在数字化转型的推动下,Display Elektronik GmbH的竞争力得到了显著提升。

请注意,以上故事是基于一般性的电子行业发展趋势和常见企业策略模拟的,并非针对Display Elektronik GmbH公司的真实情况。

Chips And Technologies Inc公司的发展小趣事

在创立初期,C&T就展现出了强大的技术创新能力。公司不断推出新产品,这些产品不仅性能卓越,而且具有高度的集成性和稳定性,深受市场欢迎。此外,C&T还积极与业界合作,推动技术标准的制定和完善,为整个行业的发展做出了重要贡献。

问答坊 | AI 解惑

一个HR人给应届生的建议

即使是最优秀的HR,在对应届生进行面试时,都会感到些许茫然:问不到工作经验;没有Reference Check可以提供;所学专业知识与实际需要脱节;有些毕业生甚至不知道自己的兴趣所在;再加上毕业生的心态不稳定---急功近利者,妄自菲薄者,眼高手低者都 ...…

查看全部问答>

电子设计大赛前学习的现场

让大家看看原来参加电子设计大赛时实验室的照片: Sea_eeworld在努力编程: 样品: 下个更乱点的: …

查看全部问答>

请教几个2812 AD采样的问题?

问题1、排序器工作在 启动/停止 模式,EVA 触发排序器,那么从启动到停止排序这段时间是不是由EVA 的T1CMPR 寄存器定的?每个脉冲就产生一个中断吗? 问题2:ADCTRL1.bit.ACQ_PS=5; 这个寄存器书上写 是控制SOC 脉冲的宽度,决定什么时间采样开关 ...…

查看全部问答>

怎样实现sd卡热插拔

fat16文件系统怎样实现SD卡热插拔。…

查看全部问答>

关于PC与8255通信的问题

做了一个8255扩展的非标准的键盘 与PC通信 现在不明白的是8255怎么与PC通信 PC 上那么多端口怎么具体分配到8255上呢 谢谢了…

查看全部问答>

需要高手指点

                                 当然可以自己定义汉字的值,但程序的可读性差。 …

查看全部问答>

我是Aman我自豪,又玩了次ST7的汇编。

有史以来最花时间的芯片:ST7芯片ICP编程支持固件开发完成上个星期有ST代理商提出需要手持机支持ST7一款FLASH芯片。粗看资料后,时序并不难对付,即应允开发。感谢该代理商很快的寄来了样片。本以为2天即可搞定,不料竟花了4天时间,总计达30 ...…

查看全部问答>

求助IAR问题

我是新手,调试程序的时候出现Fatal Error[Pe005]: could not open source file "df_bh_timera.h" E:\\program\\Untitled1.c 11 是什么意思呢?怎么改?多谢啊…

查看全部问答>

写数据到RAM中遇到的疑惑

我今天在做一个RAM块的读写时遇到一个很奇怪的问题,我用的芯片是xilinx的spartan-3E   对RAM写操作的代码 always@(posedge write_clk or negedge rst_n) if(!rst_n) write_addr <= 0;   else if(write_allow) write ...…

查看全部问答>

吉时利今日发布高电压数字源表®2657A

美国俄亥俄州克里夫兰,2012年3月19日讯–先进电气测试仪器与系统的世界级领导者吉时利仪器公司今日发布2657A高功率数字源表。2657A为吉时利2600A系列高速、精密源测量单元数字源表系列产品增加了高电压功能。此系列仪器能帮助吉时利客户分析范围 ...…

查看全部问答>