关于CC2541 TIM3产生输出比较波形
- 定时器基础配置
- 通道配置
- 比较值配置
TIM3的PWM配置输出比较简单,构成一个简单的PWM发生器,最好选择输出比较模式(101)或(110),通过调整T3CCn来实现通道的占空比。
//Init TIM3 base
T3CTL |= 0xE0;//div = 128
T3CTL &= ~0x08; // Disable Timer 3 overflow interrupts
T3CTL &= ~0x03; // Timer 3 mode = 0 - Free-running
T3CTL |= 0x04;//clr
// EN connected at P1_3
// We will use Timer 3 Channel 0 at alternate location 1
// Channel 0 will Set output on compare, clear on 0xFF(101) and counter will
// count in free-running mode to T3CC0.
P1SEL |= 0x08; // Peripheral function on P1_3
T3CCTL0 &= ~0x40; // Disable channel 0 interrupts
T3CCTL0 |= 0x04; // Ch1 mode = compare
T3CCTL0 |= 0x28; // Ch1 output compare mode = 101: Set output on compare, clear on 0xFF
T3CC0 = 128; //duty = 50 %
T3CTL |= 0x10; //start
填坑
使用示波器测试发现产生的PWM波形会存在不连续现象,具体表现为显示背光忽明忽暗且毫无规律可循。
- 关闭IAR预处理器里的POWER_SAVING,一旦CC2541进入低功耗模式,主时钟就会关闭,而TIM3的时钟源一般都被配置成了主时钟(32M)。是否可以切换到32K时钟以保留低功耗功能,这没有测试过,而且其中设计到不同时钟切换时的时基转换问题,有兴趣的可以尝试一下。在我的项目中,对功耗并不敏感,所以我就干脆关闭了。
- 在SimpleBLEPeripheral_Init这个函数里有这样一个函数
HCI_EXT_ClkDivOnHaltCmd( HCI_EXT_ENABLE_CLK_DIVIDE_ON_HALT );
具体干嘛用的不太清楚,看注释应该是配合低功耗一起使用的,把它注释掉就能解决PWM不连续的问题了,单独只关闭POWER_SAVING是没有效果的,还是会产生不连续的现象。
总结
总的来说魔改过的C51内核还是不如ARM 的Cortex-m核来的清爽,但仔细调一调问题也不大,等下一代产品升级我肯定换成NRF52832的方案,呵。
11月27日 与田里