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

四、思路以及代码实现

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

        此处,根据我的原理图,我选择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 西西菜鸟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/93714.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 随机法求解线性规划问题 蒙特卡洛

线性规划问题: max3x12x2 x12x2<5 2x1x2<4 4x13x2<9 x1>0 x2>0 正确的结果:x11.5; x21, max z6.5 Random random1 new Random(DateTime.Now.Millisecond);Random random2 new Random(DateTime.Now.Millisecond*DateTime.Now.Millisecond);double max-9999,x1…

阿里云服务器镜像大全_Linux和Windows操作系统清单

阿里云服务器操作系统大全&#xff0c;阿里云提供的镜像均为正版授权&#xff0c;正版镜像可以在云服务器ECS上运行的应用程序提供安全、稳定的运行环境系统&#xff0c;阿里云服务器以公共镜像为例分享阿里云服务器操作系统大全&#xff0c;包括Alibaba Cloud Linux镜像、Linu…

大数据面试题:说下Spark中的Transform和Action,为什么Spark要把操作分为Transform和Action?

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a;Spark常见的算子介绍一下 参考答案&#xff1a; 我们先来看下Spark算子的作用&#xff1a; 下图描述了Spark在运行转换中通过算…

解密人工智能:线性回归 | 逻辑回归 | SVM

文章目录 1、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 2、线性回归算法2.1 线性回归的假设是什么&#xff1f;2.2 如何确定线性回归模型的拟合优度&#xff1f;2.3 如何处理线性回归中的异常值&#xff1f; 3、逻辑回归算法3.1 什么是逻辑函数?…

Redis知识点

Redis 文章目录 RedisNoSQLNoSQL的优势 RedisRedis与其他的Key—value&#xff08;Map&#xff09;相比的区别&#xff1f;关系型数据库和非关系型数据库关系型数据库非关系型数据库 Redis数据类型跳表压缩表String&#xff08;字符串&#xff09;Hash&#xff08;哈希&#xf…

有理数思维导图怎么画?这种方法绘制很方便

有理数思维导图怎么画&#xff1f;为什么要绘制思维导图&#xff1f;因为它可以帮助我们更好地组织和理解信息。在数学中&#xff0c;绘制有理数思维导图也可以帮助我们更好地理解有理数的概念和性质。 有理数是我们日常生活中经常接触到的数学概念&#xff0c;包括正整数、负整…

RabbitMQ的5种消息队列

RabbitMQ的5种消息队列 1、七种模式介绍与应用场景 1.1 简单模式(Hello World) 一个生产者对应一个消费者&#xff0c;RabbitMQ 相当于一个消息代理&#xff0c;负责将 A 的消息转发给 B。 应用场景&#xff1a;将发送的电子邮件放到消息队列&#xff0c;然后邮件服务在队列…

TRT8系列—— 版本差异注意事项

TRT8 一个大版本&#xff0c;8.4-、 8.5、 8.6&#xff08;包含预览功能&#xff09;却有很多变动&#xff0c;一不注意就发现很混乱&#xff0c;特备注此贴。建议具体case可以参考这个合集&#xff0c;真心安利&#xff1a;https://github.com/NVIDIA/trt-samples-for-hackath…

极光笔记 | 如何为您的业务开发和训练一个AI-BOT

生成式AI&#xff08;Generative AI&#xff09;是当今科技领域的前沿技术之一。随着数据量的不断增加和计算能力的不断提升&#xff0c;AI技术在企业和个人生活中的应用越来越广泛。AI-BOT&#xff08;以下简称BOT&#xff09;是生成式AI技术的其中一种重要的应用形式&#xf…

ssh远程连接服务器

一、远程连接服务器简介 二、连接加密技术简介 三、ssh服务配置 四、用户登录ssh服务 Enforcing会强制限制&#xff0c;如端口为22&#xff0c;可以访问&#xff0c;如果是2000端口&#xff0c;不能使用 Permissive是宽容的模式&#xff0c;不限制使用端口 Enforcing会重启失败…

二叉树(ACM版)

【数据结构1-2】二叉树 - 题单 - 洛谷 【数据结构】day2-树_J娇娇_的博客-CSDN博客 上学时的作业 P1827 [USACO3.4] 美国血统 American Heritage 二叉树特点写法&#xff08;非二叉树&#xff09; 截取字符串写法 #include<string> #include<cstring> #include…

git远程仓库的创建及使用

1.仓库的概念&#xff1a; 1.1 本地仓库&#xff1a; 了解远程仓库前我们先了解一下本地仓库&#xff0c;本地仓库开发人员在完成部分代码的编写之后&#xff0c;可以将这一部分的代码做一个提交。这个提交完全就是一个新的版本提交&#xff0c;当然这个提交动作是在开发者的电…

【uniapp】uniapp自动导入自定义组件和设置分包:

文章目录 一、自动导入自定义组件&#xff1a;二、设置分包和预加载&#xff1a; 一、自动导入自定义组件&#xff1a; 【Volar 官网】https://github.com/vuejs/language-tools 二、设置分包和预加载&#xff1a; 【官方文档】https://uniapp.dcloud.net.cn/collocation…

SpringCloud初识

微服务架构4个核心问题&#xff1a; 这四个问题围绕这我们去学的一些东西&#xff0c;是重点!!! 1.服务很多&#xff0c;客户端该如何访问&#xff1f; 2.这么多服务&#xff0c;服务之间该如何通信&#xff1f; 3.这么多服务&#xff0c;该如何治理&#xff1f; 4.服务挂了…

Kafka—工作流程、如何保证消息可靠性

什么是kafka&#xff1f; 分布式事件流平台。希望不仅仅是存储数据&#xff0c;还能够数据存储、数据分析、数据集成等功能。消息队列&#xff08;把数据从一方发给另一方&#xff09;&#xff0c;消息生产好了但是消费方不一定准备好了&#xff08;读写不一致&#xff09;&am…

SSD202D-logo分区添加dtb

SSD202D-kernel-uimage后面加入dtb_旋风旋风的博客-CSDN博客 1.由于内核的uimage老是压缩解压缩,拿到压缩包里面dtb实在困难; 2.把dtb烧在后面又有安全隐患;而且还会有打包升级方法ota之类的很多;又毙掉了, 3.最后直接把dtb放在logo的包里,但是logo包要想添加好,也要深刻的理…

【JVM】Java内存泄露的排查思路?

文章目录 Java内存为什么会泄露&#xff1f;java内存泄露的排查思路 Java内存为什么会泄露&#xff1f; Java内存泄露&#xff08;Memory Leak&#xff09;是指在Java程序中&#xff0c;无用的对象占用了堆内存&#xff0c;但无法被垃圾回收器回收释放&#xff0c;从而导致可用…

前端原生写自定义旋转变换轮播图

html部分&#xff1a; <div class"banner_box"><div class"swiperWrapper" v-show"bannerList.length>0"><div class"swiper-item" :id"swiperSlide${index}" :class"{active:index0,next:index1,pr…

简单易懂的 Postman Runner 参数自增教程

目录 什么是 Postman Runner&#xff1f; Postman Runner 如何实现参数自增&#xff1f; 步骤一&#xff1a;设置全局参数 步骤二&#xff1a;将全局参数带入请求参数 步骤三&#xff1a;实现参数自增 资料获取方法 什么是 Postman Runner&#xff1f; Postman Runner 是…

docker的网络模式

docker0网络 docker容器的 虚拟网关loopback &#xff1a;回环网卡、TCP/IP网卡是否生效virtual bridge&#xff1a;linux 自身继承了一个虚拟化功能&#xff08;kvm架构&#xff09;&#xff0c;是原生架构的一个虚拟化平台&#xff0c;安装了一个虚拟化平台之后就会系统就会自…