CC2530定时器1速度慢了两倍

weixin_50997815 2024-12-07 21:51:59

您好,我使用Timer1的模模式,定时100ms中断产生中断,每中断10次翻转LED。
但是明显感觉定时时间慢了两倍,开发板LED的闪烁速度过慢。
已经检查过了系统时钟配置、分频系数配置、 T1CC0的装填上限值,仍然找不到错误。
望指点一二

 

1.定时器配置

void Timer1_IT_Init(void) //模模式,中断定时初始化
{
  T1STAT |= 0x21; //往Bit0和Bit5写1,清空计数溢出中断和通道0的中断状态位
  T1IF = 0; //清空T1中断标志位
  T1CTL |= 0x0E; //128分频,模计数模式
  T1CCTL0 |= 0x04; //开启定时器1通道0的比较模式
  T1CC0L = 0xA7; //先确定计数上限值
  T1CC0H = 0x61; //再确定计数上限值,计数25000个
  T1IE = 1; //打开T1中断开关
  EA = 1; //打开中断总开关
}

2.主函数

void main(void)
{
  setSystemClk32MHZ();
  Timer1_IT_Init();
  LED_Init();
  while(1)
  {
    
  }
}

3.中断函数

#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice(void)
{
  T1STAT |= 0x21; //往Bit0和Bit5写1,清空计数溢出中断和通道0的中断状态位
  T1IF = 0; //清空T1中断标志位
  static uint16_t count = 0;
  count++;
  if(count == 10)
  {
    count = 0;
    LED_Toggle();
  }
}

 

...全文
44 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
nrf51822并没有PWM模块,但是如果巧妙的结合PPI模块,并加上一个定时器中断就可以轻松的实现了PWM,思路是这样的: 定时器使用三个比较器 cc0、cc1和cc2,当三个比较器任何一产生比较事件的时候都会通过PPI去翻转GPIO的引脚,在初始化的时候这样设置这三个比较器: NRF_TIMER2->CC[0] = MAX_SAMPLE_LEVELS + next_sample_get(); NRF_TIMER2->CC[1] = MAX_SAMPLE_LEVELS; // CC2 will be set on the first CC1 interrupt. NRF_TIMER2->CC[2] = 0; 这是初始化的配置,到这里会有一个思考,这样的话计数器技术到cc0的时候依然会继续的往下计数,那这样的话他的再溢出的值就将回到cc2的时候也就是归零的时候,那这样的波形就分为了三段了,这不是我们所需要的,那这样要实现PWM就要把cc2的比较值往后挪,让他超过cc0,并且cc2到之前的一个比较值是固定的,这样就需要从新设置cc2的值,还有一个办法就是当计数器到cc0的时候请求中断重置计数器,但是这样做有一个问题就是进入中断是需要时间的,而当计数器到达cc0的时候就需要重置,同时计数器的下一个值就是cc2,这样就会造成冲突,所以我们使用了第一种方案。 具体实现是这样的,使能cc1比较中断,在第一次中断中重新设置cc1,让他的值变成了两倍,同时从新设置cc2,让他的值变成了cc1+N,N就是占空比参数,在第二次中断中,也是从新设置cc1,但是和上一次中断不同的是这时候设置的是cc0,而不是cc2 这样造成的计数器溢出值是这样的:

641

社区成员

发帖
与我相关
我的任务
社区描述
ZigBee技术交流社区
物联网 技术论坛(原bbs)
社区管理员
  • 大可 Ducker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

ZigBee技术交流社区说明

  • ZigBee技术学习官网:www.sxf-iot.com
  • 关注微信公众号了解更多IoT行业资讯:shanxuefang-iot
  • 如何提问技术问题:点击了解

试试用AI创作助手写篇文章吧