CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用

目录

一、前言

二、思路及实现方法

三、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的寄存器列出:

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第1张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第2张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第3张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第4张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第5张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第6张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第7张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第8张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第9张图片

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第10张图片

四、思路以及代码实现

        毋庸置疑,首先我们需要查看开发板原理图,找到我们想要实现呼吸灯效果的引脚。

        此处,根据我的原理图,我选择P1_1引脚上连接的LED灯泡来实现呼吸灯效果。

        首先,初始化P1_1引脚。

        随后,我们操作T1CTL寄存器,将定时器1设置为128分频,模模式计数。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第11张图片

        经过计算,在此模式下,每250个时钟边沿为1ms。我们需要其产生1ms的溢出。

        通过查看开发手册对模模式的介绍,我们可以得知,计数器会在达到T1CC0上保存的值后复位,因此我们只需将T1CC0设置为250,即可实现1ms复位,这类似于STM32的定时器开发的重装载值RCC。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第12张图片

        随后,我们应该开始设置与比较相关的配置。首先我们需要找到P1_1是否对应定时器的某个通道,如果没有对应通道,我们就应该另选端口。

        通过查阅CC2530开发手册,我们通过下表得知,P1_1在TIM1的备用位置2中的通道1中使用。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第13张图片

        首先,我们需要使能TIM1的备用位置2。

        通过开发手册中对TIM1的介绍,我们可以得知备用位置的设置需要操作PERCFG寄存器的T1CFG。因此我们寻找有关PERCFG的介绍。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第14张图片

        查到相关寄存器的介绍后,根据如下表,我们需要对第6位置1以使能备用位置。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第15张图片

        由于我们使用的是TIM1的通道1,因此我们需要配置定时器1通道1的捕获/比较控制寄存器:

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第16张图片

        此处,我们首先需要设置Mode为1,即比较模式,随后设置CMP为110,即:当等于T1CC0时设置, 当等于T1CC1时清除。其流程如下:

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第17张图片

        设置完比较模式后,我们需要设置比较值,查阅开发手册,发现比较值寄存器如下:

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第18张图片

        此处,我们操作的T1CC1用来存储我们的比较值。可能大家会有一个疑问,为什么T1CC0却被用于模模式的溢出了呢?通过查阅手册我们不难发现,如果不使用自由运行模式,是无法使用TIM1的通道0进行PWM输出的比较的,因此无论是模模式还是正反计数模式都占用了T1CC0这个寄存器,因此我完成本项目的时候也是选用了TIM1的通道1。     

         此处,我们暂时先设置比较值为0。

        注意,此处我是先给低八位赋值,随后再给高八位赋值,这是为什么呢?

        我们注意看T1CCL的描述,写入时并不会写入T1CCL,而是会写入缓存,等到下次写入高八位时同时写入,因此建议先写低八位,后写高八位。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第19张图片

        随后,我们在主函数死循环中,写一个比较值从0~250的循环,以实现呼吸灯效果。

CC2530实现呼吸灯效果-PWM调光-TIM1定时器使用_第20张图片

        烧录程序,即可查看运行效果。

五、源码

        附源代码.c文件:CC2530定时器实现PWM源代码-西西菜鸟

原创不易 抄袭必究        -by 西西菜鸟

你可能感兴趣的:(嵌入式工程师开发,物联网,单片机)