03_CC2530基于定时器3的Delay_ms函数

CC2530+定时器3与Delay_ms延时函数

前言

Delay函数是开发中常用到的函数,可以用于按键消抖LED闪烁生成一定频率信号等(软件模拟通讯协议)。由于利用循环执行一定次数的空指令实现的延时函数在精度上并不能让人满意,而用定时器进行延时的精度更高。本章将基于CC2530定时器3(8位定时器)实现Delay_ms函数。

定时器3

​ 跟定时器1不同的是定时器3定时器 4 的所有定时器功能都是基于主要的 8 位计数器建立的。计数器在每个时钟边沿递增或递减

  • 可以通过SFR寄存器 TxCNT 读取 8 位计数器的值,其中x指的是定时器号码,3或4。

  • 通过设置 TxCTL 控制寄存器的值实现清除和停止计数器

模模式

​ 当定时器运行在模模式8位计数器在 0x00 启动,每个活动时钟边沿递增。当计数器达到寄存器TxCC0所含的最终计数值时,计数器复位到 0x00,并继续递增。如果设置了相应的中断屏蔽位TxCTL.OVFIM,就产生一个中断请求。

​ 使用定时器T3模模式,需要配置以下寄存器:

  • T3CTL:定时器3控制寄存器

  • T3CC0:保存最终的计数值

  • T3CCTL0:使用定时器3模计数时,必须使能 T3CCTL0.MODE =1

  • T3IF: 定时器3中断标志

  • T3IE: 定时器3中断使能

  • Note: 定时器3的使用也需要配置系统时钟,与定时器1的配置方式一致,不再赘述,详细可看基础篇02号文章

具体代码讲解

工程结构

在这里插入图片描述

Clock.c
#include <ioCC2530.h>
#include "Clock.h"/**
* @brief 设置系统时钟为32Mhz晶振
*/
void Oclk32_Init(void)
{CLKCONCMD &= ~0x40;        // 设置系统时钟源为 32MHZ晶振while(CLKCONSTA & 0x40); // 等待晶振稳定 CLKCONCMD &= ~0x3f;      //    定时器tick输出设置   设置系统主时钟频率为 32MHZ
}/**
* @brief 设置系统时钟为16Mhz晶振
*/
void Oclk16_Init(void)
{CLKCONCMD |= 0x40;while(!(CLKCONSTA & 0x40));CLKCONCMD |= 0x09;CLKCONCMD &= 0xC9;
}
Clock.h
#ifndef __CLOCK_H
#define __CLOCK_H
void Oclk32_Init(void);
void Oclk16_Init(void);
#endif
Timer3.c
#include <ioCC2530.h>
#include "timer3.h"
unsigned int remaintims;
/**
* @brief 开启定时器3
*/
void Timer3_On(void)
{T3CTL |= 0x10;
}/**
* @brief 关闭定时器3
*/
void Timer3_Off(void)
{T3CTL &= 0xEF;
}/**
* @brief 定时器3初始化函数 定时器中断 
*/
void Timer3_Init(void)
{// 开启定时器3中断T3IF = 0;  // 清除中断标志T3IE = 1;  // 定时器1中断使能  IEN1EA = 1;  // 使能全局中断// 定时器3参数配置 T3CTL |= 0xEE; //开溢出中断 128分频T3CC0 = 0xFA;   // 250最终计数T3CCTL0 |= 0x04;  // 设置输出模式Timer3_Off();  // 关闭定时器
}// 定时器T3中断服务函数  1ms
#pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{T3IF = 0;  // 清除中断标志位if(remaintims > 0){remaintims--;  // 剩余计数时间 /ms}else{Timer3_Off();  // 关闭定时器}
}
定时器3中断函数详解

​ 当remaintims大于零时,每进入一次中断令其自减,当remaintims自减到0时,关闭定时器。

Timer3.h
#ifndef __TIMER3_H
#define __TIMER3_H
void Timer3_Init(void);
void Timer3_On(void);
void Timer3_Off(void);
extern unsigned int remaintims;
#endif
Delay.c
#include <ioCC2530.h>
#include "delay.h"
#include "Clock.h"
#include "timer3.h"/**
* @brief 延时函数初始化
*/
void Delay_Init(void)
{Oclk32_Init();  // 时钟初始化 32MHZTimer3_Init();	// 定时器3 初始化
}/**
* @brief 延时函数 1ms
* @param ms: 延时时间 单位: ms 
*/
void Delay_ms(unsigned int ms)
{remaintims = ms;Timer3_On(); // 启动定时器3while(remaintims > 0);  // 等待延时结束
}
Delay_ms()函数详解

​ 将需要延时的时间ms(单位毫秒),作为参数传入。函数内令remaintims等于ms, 开启定时器3,由于定时器3每1ms进入一次中断,并在每次中断函数中将remaintims减一,while等待remaintims减到0,此时延时结束,退出函数。

Delay.h
#ifndef __DELAY_H
#define __DELAY_H
void Delay_Init(void);
void Delay_ms(unsigned int ms);
#endif

接下来,写一个流水灯检测一下刚实现的Delay_ms()函数

LED.c
#include <ioCC2530.h>
#include "LED.h"
#include "delay.h"
unsigned int LED_Flag=0;
/**
* @brief 初始化LED
*/
void LED_Init(void)
{P1SEL &= ~0x03; P0SEL &= ~0x10;P1DIR |= 0x03;  // P1_0 P1_1 设置为输出P0DIR |= 0x10;  // P0_4 设置为输出LED1 = 1;LED2 = 1;LED3 = 1;
}/**
* @brief 关闭所有LED
*/
void LED_OFF(void)
{LED1 = 1;LED2 = 1;LED3 = 1;
}/**
* @brief 流水灯
*/
void LED_Flow(unsigned int ms)
{LED1 = ~LED1;Delay_ms(ms);LED2 = ~LED2;Delay_ms(ms);LED3 = ~LED3;Delay_ms(ms);
}
LED.h
#ifndef __LED_H
#define __LED_H
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P0_4
extern unsigned int LED_Flag;
void LED_Init(void);
void LED_OFF(void);
void LED_Flow(unsigned int ms);
#endif
main.c
#include <ioCC2530.h>
#include "LED.h"
#include "delay.h"
#include "Clock.h"
void main(void)
{Delay_Init();	 // Delay 初始化LED_Init();    // LED初始化while(1){LED_Flow(1000);   // 流水灯 每过1s改变一个灯的状态}
}

结语

​ 本章介绍了用CC2530定时器3实现Delay_ms()函数。

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

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

相关文章

【系统面试篇】其他相关题目——虚拟内存、局部性原理、分页、分块、页面置换算法

目录 一、相关问题 1. 什么是虚拟内存&#xff1f;为什么需要虚拟内存&#xff1f; &#xff08;1&#xff09;内存扩展 &#xff08;2&#xff09;内存隔离 &#xff08;3&#xff09;物理内存管理 &#xff08;4&#xff09;页面交换 &#xff08;5&#xff09;内存映…

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

容器内pip安装Apache Airflow的经历:如何重置初始密码

背景 Apache Airflow™https://github.com/apache/airflow 是一个开源平台&#xff0c;用于开发、调度和监控面向批处理的工作流程。Airflow 可扩展的 Python 框架使您能够构建几乎可以连接任何技术的工作流程。Web 界面有助于管理工作流程的状态。Airflow 可以通过多种方式部…

BP 网络的标准学习算法及其实现

BP 网络的标准学习算法及其实现 一、引言 BP&#xff08;Back Propagation&#xff09;神经网络是一种广泛应用于机器学习和人工智能领域的神经网络模型。它通过反向传播算法来调整网络的权重&#xff0c;以最小化预测输出和实际输出之间的误差。BP 网络的标准学习算法对于理…

Java爬虫 爬取某招聘网站招聘信息

Java爬虫 爬取某招聘网站招聘信息 一、系统介绍二、功能展示1.需求爬取的网站内容2.实现流程2.1数据采集2.2页面解析2.3数据存储 三、其它1.其他系统实现 一、系统介绍 系统主要功能&#xff1a;本项目爬取的XX招聘网站 二、功能展示 1.需求爬取的网站内容 2.实现流程 爬虫…

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚&#xff0c;调试程序的时候不小心把SWD和JTAD接口都给关了&#xff0c;先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG&#xff0c;不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候&#xff0c;其实我们说的是两件东西&#xff1a; 一是小米模式的本质&#xff0c;即高效率的商业模式&#xff1b; 另一件是小米这家公司具象的商业模式&#xff0c;这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…

C语言实现数据结构之堆

文章目录 堆一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三. 二叉树的顺序结构及实现1. 二叉树的顺序结构2.…

DocuBurst——基于java实现

DocuBurst 文档散(DocuBurst)也是基于关键词的文本可视化,不过它还通过径向布局体现了词的语义等级。如下图所示,外层的词是内层词的下义祠,颜色饱和度的深浅用来体现词频的高低。 DocuBurst 是第一个利用词法数据库中人工创建的结构的文档内容可视化。我们使用公认的设…

知识课堂之域名系统中实现动态代理

怎么在域名系统中解析动态ip&#xff0c;这一直是一个需要解决的问题&#xff0c;人们对与网络的稳定连接与灵活运用已经成为生活和工作中不可或缺的一部分&#xff0c;因此这样的问题的解决迫在眉睫。 大家对于动态ip是什么&#xff0c;应该都有所了解了&#xff0c;所谓的动…

5G周边知识笔记

这里写目录标题 3GPP 5G标准路径图5G协议规范5G新空口关键指标4G LTE和5G NR新空口技术对比5G新频段FR1FR2 信道带宽上下行解耦新频点规划&#xff0c;信道栅格FR1各频段实际信道栅格和NR-ARFCN范围定义 同步栅格大规模天线阵列新型调制编码技术大规模载波聚合设备到设备直接通…

报名开启|开放原子大赛“Rust数据结构与算法学习赛”

开放原子大赛“Rust数据结构与算法学习赛”报名进行中&#xff0c;报名截止时间为11月17日。 为了进一步促进开源技术的发展&#xff0c;提升国内开源社区的创新能力和国际影响力&#xff0c;开放原子开源基金会与清华大学开源操作系统训练营等单位&#xff0c;共同举办本次Rus…

Flutter自定义矩形进度条实现详解

在Flutter应用开发中&#xff0c;进度条是一个常见的UI组件&#xff0c;用于展示任务的完成进度。本文将详细介绍如何实现一个支持动画效果的自定义矩形进度条。 功能特点 支持圆角矩形外观平滑的动画过渡效果可自定义渐变色可配置边框宽度和颜色支持进度更新动画 实现原理 …

C#中的Math类

在 C# 中&#xff0c;Math 类提供了许多数学运算的静态方法&#xff0c;涵盖了各种常见的数学函数和操作。以下是 Math 类中的常用方法及其用法&#xff08;持续更新中…&#xff09; 方法说明示例Abs()返回指定数值的绝对值int absValue Math.Abs(-10); 结果为 10Acos()返回…

uniapp配置h5路由模式为history时404

为了不让URL中出现#&#xff0c;让uniapp项目配置h5路由模式为hisory 然而本地好好的&#xff0c;放到服务器上却404了。 解决方法是给nginx配置一个伪静态&#xff1a; location /xxx-html/ {alias /home/nginx_web/xxx_new_html/;try_files $uri $uri/ /xxx-html/index.ht…

python画图|灵活的subplot_mosaic()函数-初逢

【1】引言 前述学习进程中&#xff0c;对hist()函数画直方图已经有一定的探索。然而学无止境&#xff0c;在继续学习的进程中&#xff0c;我发现了一个显得函数subplot_mosaic()&#xff0c;它几乎支持我们随心所欲地排布多个子图。 经过自我探索&#xff0c;我有一些收获&am…

单体架构的 IM 系统设计

先直接抛出业务背景&#xff01; 有一款游戏&#xff0c;日活跃量&#xff08;DAU&#xff09;在两千左右&#xff0c;虽然 DAU 不高&#xff0c;但这两千用户的忠诚度非常高&#xff0c;而且会持续为游戏充值&#xff1b;为了进一步提高用户体验&#xff0c;继续增强用户的忠…

vue实现天地图电子围栏

一、文档 vue3 javascript WGS84、GCj02相互转换 天地图官方文档 注册登录然后申请应用key&#xff0c;通过CDN引入 <script src"http://api.tianditu.gov.cn/api?v4.0&tk您的密钥" type"text/javascript"></script>二、分析 所谓电子围…

基于SSM(Spring + Spring MVC + MyBatis)框架的汽车租赁共享平台系统

基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的汽车租赁共享平台系统是一个复杂的Web应用程序&#xff0c;用于管理和调度汽车租赁服务。下面我将提供一个详细的案例程序概述&#xff0c;包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理&…

Python函数专题:默认参数与关键字参数

在Python编程中,函数是一个非常重要的概念。它们不仅用于组织代码,还能够提高代码的重用性和可读性。在本文中,我们将深入探讨Python的默认参数和关键字参数这两个特性。这些特性可以让函数的调用更加灵活和强大。 一、什么是默认参数? 默认参数是指在定义函数时,为某些…