目录
一、前言
二、思路及实现方法
三、CC2530相关寄存器
四、思路以及代码实现
五、源码
一、前言
前面我们提到了非定时器模式实现呼吸灯效果,但由于其占用单片机主线程,如果不能加入RTOS的话,很难实现与其他功能的同步使用,因此,在实际应用中,仍需要通过定时器来操作LED实现呼吸灯效果,本文将带领大家逐步梳理开发过程,供各位借鉴。
二、思路及实现方法
首先,我们介绍一下CC2530系列的定时器。
CC2530具有4个定时器,TIM1是16位定时/计数器,支持输入采样、PWM功能,具有5个独立采样/输出比较通道。TIM3和TIM4是8位定时/计数器,支持输出比较和PWM功能,具有2个独立采样/输出比较通道。
本篇文章实现程序采用的是TIM1实现PWM呼吸灯功能。
TIM1具有三种运行模式,分别是自由运行模式、模模式、正反计数模式。本文将使用三种模式之一的模模式。在该模式下,计数器从0x0000开始计数,当计数器达到T1CC0时溢出,此时计数器回到0x0000并开始重新计数。
三、CC2530相关寄存器
通过查阅CC2530数据开发手册,现将CC2530芯片有关TIM1的寄存器列出:
四、思路以及代码实现
毋庸置疑,首先我们需要查看开发板原理图,找到我们想要实现呼吸灯效果的引脚。
此处,根据我的原理图,我选择P1_1引脚上连接的LED灯泡来实现呼吸灯效果。
首先,初始化P1_1引脚。
随后,我们操作T1CTL寄存器,将定时器1设置为128分频,模模式计数。
经过计算,在此模式下,每250个时钟边沿为1ms。我们需要其产生1ms的溢出。
通过查看开发手册对模模式的介绍,我们可以得知,计数器会在达到T1CC0上保存的值后复位,因此我们只需将T1CC0设置为250,即可实现1ms复位,这类似于STM32的定时器开发的重装载值RCC。
随后,我们应该开始设置与比较相关的配置。首先我们需要找到P1_1是否对应定时器的某个通道,如果没有对应通道,我们就应该另选端口。
通过查阅CC2530开发手册,我们通过下表得知,P1_1在TIM1的备用位置2中的通道1中使用。
首先,我们需要使能TIM1的备用位置2。
通过开发手册中对TIM1的介绍,我们可以得知备用位置的设置需要操作PERCFG寄存器的T1CFG。因此我们寻找有关PERCFG的介绍。
查到相关寄存器的介绍后,根据如下表,我们需要对第6位置1以使能备用位置。
由于我们使用的是TIM1的通道1,因此我们需要配置定时器1通道1的捕获/比较控制寄存器:
此处,我们首先需要设置Mode为1,即比较模式,随后设置CMP为110,即:当等于T1CC0时设置, 当等于T1CC1时清除。其流程如下:
设置完比较模式后,我们需要设置比较值,查阅开发手册,发现比较值寄存器如下:
此处,我们操作的T1CC1用来存储我们的比较值。可能大家会有一个疑问,为什么T1CC0却被用于模模式的溢出了呢?通过查阅手册我们不难发现,如果不使用自由运行模式,是无法使用TIM1的通道0进行PWM输出的比较的,因此无论是模模式还是正反计数模式都占用了T1CC0这个寄存器,因此我完成本项目的时候也是选用了TIM1的通道1。
此处,我们暂时先设置比较值为0。
注意,此处我是先给低八位赋值,随后再给高八位赋值,这是为什么呢?
我们注意看T1CCL的描述,写入时并不会写入T1CCL,而是会写入缓存,等到下次写入高八位时同时写入,因此建议先写低八位,后写高八位。
随后,我们在主函数死循环中,写一个比较值从0~250的循环,以实现呼吸灯效果。
烧录程序,即可查看运行效果。
五、源码
附源代码.c文件:CC2530定时器实现PWM源代码-西西菜鸟
原创不易 抄袭必究 -by 西西菜鸟