×
嵌入式 > 技术百科 > 详情

STM8s--定时器(time4)

发布时间:2020-06-20 发布时间:
|
TIME4:

● 8位向上计数的自动重载计数器;
● 3位可编程的预分配器(可在 运行中修改),提供1, 2, 4, 8, 16, 32, 64 和128 这8种分频比例。
●  中断产生
– 在计数器更新时:计数器溢出。

 

几个相关的寄存器;

控制寄存器1 (TIMx_CR1)

控制寄存器2 (TIMx_CR2)                        [注意:TIM4没有该寄存器]

事件产生寄存器(TIMx_EGR)

状态寄存器1 (TIMx_SR1)

中断使能寄存器(TIMx_IER)

自动重装载寄存器(TIMx_ARR)

预分频寄存器(TIMx_PSCR)         计数器时钟频率fCK_CNT=fCK_PSC/ 2(PSC[2:0])

计数器(TIMx_CNTR)    {TIMx_CNTRL   TIMx_CNTRH}

详细内容见:STM8S数据手册

 

8位定时器

main()

{

  // 首先初始化GPIO

  PD_DDR 0x08;

  PD_CR1 0x08;              // 将PD3设置成推挽输出

  PD_CR2 0x00;

 

  // 然后初始化定时器4                               

  TIM4_IER 0x00;            // 禁止中断

  TIM4_EGR 0x01;           // 允许产生更新事件

  TIM4_PSCR 0x07;         // 计数器时钟=主时钟/128=2MHZ/128

                                              // 相当于计数器周期为64uS

  TIM4_ARR 255;             // 设定重装载时的寄存器值,255是最大值

  TIM4_CNTR 255;           // 设定计数器的初值

                                         // 定时周期=(ARR+1)*64=16320uS

  TIM4_CR1 0x01;           // b0 1,允许计数器工作

                                         // b1 0,允许更新

                                     // 设置控制器,启动定时器

  TIM4_IER 0x01;            // 允许更新中断

  _asm("rim");                // 允许CPU全局中断

 

  while(1)                    // 进入无限循环

  {

                               

}

 

@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)

{

    TIM4_SR1 0x00;          // 清除更新标志

    PD_ODR PD_ODR 0x08;   // LED驱动信号取反

                              //LED闪烁频率=2MHZ/128/255/2=30.63

                                         

0

 

16位定时器:

main()

{

  // 首先初始化GPIO

  PD_DDR 0x08;

  PD_CR1 0x08;              // 将PD3设置成推挽输出

  PD_CR2 0x00;

 

  // 然后初始化定时器4                               

  TIM2_IER 0x00;            // 禁止中断

  TIM2_EGR 0x01;           // 允许产生更新事件

  TIM2_PSCR 0x01;          // 计数器时钟=主时钟/128=2MHZ/2

                                                            // 相当于计数器周期为1uS

                                                              // 设定重装时的寄存器值

                                              // 注意必须保证先写入高8位,再写入低8位

  TIM2_ARRH 0xEA;           // 设定重装载时的寄存器的高8位

  TIM2_ARRL 0x60;  

  

  TIM2_CNTRH 0xEA;          // 设定计数器的初值

  TIM2_CNTRL 0x60;             

                              // 定时周期=1*60000=60000uS=60ms

                              

  TIM2_CR1 0x01;            // b0 1,允许计数器工作

                              // b1 0,允许更新

                              // 设置控制器,启动定时器

  TIM2_IER 0x01;            // 允许更新中断

  _asm("rim");                // 允许CPU全局中断

 

  while(1)                    // 进入无限循环

  {

                               

}

 

// 函数功能:定时器4的更新中断服务程序

// 输入参数:无

// 输出参数:无

// 返 回 值:无

@far @interrupt void TIM2_UPD_IRQHandler (void)

{

    TIM2_SR1 0x00;          // 清除更新标志

    PD_ODR PD_ODR 0x08;   // LED驱动信号取反

                              //LED闪烁频率=2MHZ/2/60000/2=8.3

                                         

 




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
无人机新突破:或将利用手机发射塔追踪无人机