9142|4

98

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【GD32F350开发分享三】定时器T0中断:内部高速时钟源 [复制链接]



GD32F350定时器有TIMER0~TIMER5,绝对够用,我是用的是TIMER0,向上计数模式
在这种模式,计数器的计数方向是向上计数。计数器从0开始向上连续计数到自动加载值(定 义在TIMERx_CAR寄存器中),一旦计数器计数到自动加载值,会重新从0开始向上计数。如果 设置了重复计数器,在(TIMERx_CREP+1)次上溢后产生更新事件,否则在每次上溢时都会产 生更新事件。在向上计数模式中,TIMERx_CTL0寄存器中的计数方向控制位DIR应该被设置成 0。
当通过TIMERx_SWEVG寄存器的UPG位置1来设置更新事件时,计数值会被清0,并产生更新 事件。
如果TIMERx_CTL0寄存器的UPDIS置1,则禁止更新事件。
当发生更新事件时,所有的寄存器(重复计数器,自动重载寄存器,预分频寄存器)都将被更新。
下面这些图给出了一些例子,当TIMERx_CAR=0x63时,计数器在不同预分频因子下的行为。


  1. void nvic_config(void)
  2. {
  3.     nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  4.     nvic_irq_enable(TIMER0_BRK_UP_TRG_COM_IRQn, 0, 1);
  5. }
  6. /*!
  7.     \brief      configure the TIMER peripheral
  8.     \param[in]  none
  9.     \param[out] none
  10.     \retval     none
  11.   */
  12. void timer_config(void)
  13. {
  14.     /* -----------------------------------------------------------------------
  15.     TIMER0 configuration:
  16.     generate 3 complementary PWM signal.
  17.     TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 84(GD32F330)
  18.     or 107(GD32F350) so the TIMER0 counter clock used is 1MHz.
  19.     insert a dead time equal to 1us
  20.     configure the break feature, active at high level, and using the automatic
  21.     output enable feature.
  22.     use the locking parameters level0.
  23.     ----------------------------------------------------------------------- */
  24.     timer_parameter_struct timer_initpara;


  25.     rcu_periph_clock_enable(RCU_TIMER0);

  26.     timer_deinit(TIMER0);

  27.     timer_initpara.prescaler         = 4000/50-1;
  28.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  29.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  30.     timer_initpara.period            = 270/5;
  31.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  32. //    timer_initpara.repetitioncounter = 0;
  33.     timer_init(TIMER0,&timer_initpara);

  34.     /* TIMER0 channel control update interrupt enable */
  35.     timer_interrupt_enable(TIMER0,TIMER_INT_UP);

  36.     /* TIMER0 counter enable */
  37.     timer_enable(TIMER0);
  38. }
复制代码

采用内部时钟源108MHz,定时4ms,定时中断如下
  1. extern uint16_t Timer_Count;
  2. extern bool Timer_flag;
  3. void TIMER0_BRK_UP_TRG_COM_IRQHandler(void)
  4. {

  5.     timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
  6.                 Timer_Count++;
  7.                 if(Timer_Count==1)
  8.                 {
  9.                         Timer_Count = 0;
  10.                         Timer_flag = 1;
  11. //                        printf("Timer0\n");
  12.                 }


  13. }
复制代码




使用内部时钟源,时间久了,时间会便宜一点,下次我自己焊接外部晶振8MHz,获取高精度的定时器,敬请期待
此帖出自GD32 MCU论坛

最新回复

咳咳,那个问题后来发现是因为没有设置对时钟源,用了没有焊上的外部时钟,结果直接用了内部8M的高速时钟(没有任何倍频)……选对时钟源之后就能按时输出了  详情 回复 发表于 2019-1-18 01:14
点赞 关注(1)
 

回复
举报

111

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我用内部晶振108的,类似楼主的方法配置:

  1.     timer_initpara.prescaler = 1000-1;
  2.     timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  3.     timer_initpara.counterdirection = TIMER_COUNTER_UP;
  4.     timer_initpara.period = 10800-1;
  5.     timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
复制代码

这样子感觉应该是(10800*1000)/108000=100ms中断一次,可是实际是1s中断一次,想不通有什么问题……
此帖出自GD32 MCU论坛

点评

这个我具体忘了 但是为了测试 可能编辑帖子的时候有误 回头我再确认一下  详情 回复 发表于 2018-10-8 14:59
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
tinnu 发表于 2018-10-2 21:31
我用内部晶振108的,类似楼主的方法配置:

这样子感觉应该是(10800*1000)/108000=100ms中断一次,可是 ...

这个我具体忘了 但是为了测试 可能编辑帖子的时候有误 回头我再确认一下
此帖出自GD32 MCU论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 
本帖最后由 cliff.xu 于 2019-1-16 16:30 编辑
tinnu 发表于 2018-10-2 21:31
我用内部晶振108的,类似楼主的方法配置:

这样子感觉应该是(10800*1000)/108000=100ms中断一次,可是 ...

我按你的设置测得输出为200Ms。


同样的定时器设置, Timer0测得200ms, Timer2测得100Ms.
留个痕迹, 有空再研究!
此帖出自GD32 MCU论坛
 
 
 

回复

111

帖子

0

TA的资源

一粒金砂(中级)

5
 
cliff.xu 发表于 2019-1-16 10:47
我按你的设置测得输出为200Ms。


同样的定时器设置, Timer0测得200ms, Timer2测得100Ms.
留个痕迹 ...

咳咳,那个问题后来发现是因为没有设置对时钟源,用了没有焊上的外部时钟,结果直接用了内部8M的高速时钟(没有任何倍频)……选对时钟源之后就能按时输出了
此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表