当前位置: 首页 > news >正文

TM4C123库函数学习(2)--- LED闪烁,滴答定时器精准延时

前言

(1)阅读本文之前,需要先看TM4C123库函数学习(1)— 点亮LED+TM4C123的ROM函数简介+keil开发环境搭建篇。
(2)TM4C123是M4的内核,拥有一个24位向下计数的SysTick定时器。,可用于生成定期中断。
<1>它可以作为系统的系统时钟节拍,可以用来轮询或者用于任务调度。
<2>滴答定时器可作为RTOS的时基单元。
<3>一种使用系统时钟的高速报警定时器。
<4>可变速率报警或信号定时器-持续时间是范围-依赖于使用的参考时钟和计数器的动态范围。
<5>基于缺席/会议时间的内部时钟源控制。STCTRL控制和状态寄存器中的COUNT位可以用来确定一个动作是否在设定的时间内完成,作为动态时钟管理控制循环的一部分。
(3)我们如果是裸机开发,这个定时器一般用于精准延时,或者定时器调度。

函数介绍

ROM_SysCtlClockGet()

这个函数可以获取系统时钟的速率。按照上文,我们将系统时钟设置为80MHZ,所以这个函数最终会返回80 000 000。

/****** 函数声明 ******/
//这个存放在ROM
uint32_t ROM_SysCtlClockGet(void);
//这个是存放在flash
uint32_t SysCtlClockGet(void);/****** 函数介绍 ******/
/* 作用 : 获取系统时钟频率* 传入参数 : 无* 返回参数 : 一个32bit的数据,为系统时钟速率。
*/

ROM_SysTickPeriodSet()

(1)设置SysTick计数器的周期。如果我们写成SysTickPeriodSet(SysCtlClockGet() / 1000000UL);表示每过1us进入一次滴答定时器中断函数。
(2)可能会有人不理解,为什么会这样呢?
<1>首先,我上面说了SysCtlClockGet()可以获取系统时钟频率,因为现在是80MHZ,所以返回80MHZ,然后除以1MHZ,所以SysTickPeriodSet(SysCtlClockGet() / 1000000UL); == SysTickPeriodSet(80);
<2>因为系统时钟为80MHZ,所以时钟每跳变一次是1/80us,而我们设置的滴答计数器的周期为80,所以每过1us进入一次滴答定时器中断。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_SysTickPeriodSet(uint32_t ui32Period);
//这个是存放在flash
void SysTickPeriodSet(uint32_t ui32Period);/****** 函数介绍 ******/
/* 作用 : 设置SysTick计数器的周期。* 传入参数 :* ui32Period : 一个32bit的数据,为滴答定时器周期。* 返回参数 : 无
*/

SysTickIntRegister()

(1)这个用于注册滴答定时器中断函数,当滴答定时器溢出时候,进入传入的那个函数。
(2)这个有没有ROM函数,不清楚,反正我没有找到。

/****** 函数声明 ******/
//这个是存放在flash
void SysTickIntRegister(void (*pfnHandler)(void));/****** 函数介绍 ******/
/* 作用 : 注册滴答定时器中断函数* 传入参数 : * void (*pfnHandler)(void):滴答定时器溢出中断的中断函数,注意,这个中断服务函数无传入参数,无返回值!!!* 返回参数 : 无
*/

ROM_SysTickIntEnable()

使能SysTick中断,如果不调用这个函数,滴答定时器的溢出中断将无法被调用。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_SysTickIntEnable(void);
//这个是存放在flash
void SysTickIntEnable(void);/****** 函数介绍 ******/
/* 作用 : 使能SysTick中断* 传入参数 : 无* 返回参数 : 无
*/

ROM_SysTickIntEnable()

使能SysTick计数器。如果没有使能滴答定时器,那么滴答定时器将不会计数,同时中断服务函数永远也进不去。

/****** 函数声明 ******/
//这个存放在ROM
void ROM_SysTickIntEnable(void);
//这个是存放在flash
void SysTickIntEnable(void);/****** 函数介绍 ******/
/* 作用 : 使能SysTick计数器* 传入参数 : 无* 返回参数 : 无
*/

实操

main.c

#include "stdio.h"
#include <stdint.h>
#include <stdbool.h>
#include "hw_memmap.h"
#include "hw_types.h"
#include "hw_gpio.h"
#include "debug.h"
#include "fpu.h"
#include "gpio.h"
#include "pin_map.h"
#include "rom.h"
#include "sysctl.h"
#include "uart.h"
#include "uartstdio.h"
#include "SystickTime.h"int main(void)
{  ROM_FPUEnable();//使能浮点单元。这个函数必须在执行任何硬件浮点运算之前被调用;如果不这样做,将导致NOCP使用错误。ROM_FPULazyStackingEnable();//浮点延迟堆栈,减少中断响应延迟  ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |SYSCTL_OSC_MAIN);//配置系统时钟,系统时钟频率400M/2/2.5=80MROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);        //使能GPIOF外设	ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_4); //将LED设置为输出initTime();        //初始化滴答定时器while(1){GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, !GPIO_PIN_4);          //置低位点亮delay_ms(100);  GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_PIN_4); //置高位熄灭delay_ms(100);}
}

SystickTime.c

#include <stdint.h>
#include <stdbool.h>
#include "Time.h"
#include "SystickTime.h"
#include "sysctl.h"
#include "systick.h"static volatile uint32_t counter;/* 滴答定时器中断,每微妙进入一次,count表示过了多少微妙,最多计时71分钟*/
static void SycTickHandler(void) {counter++;
}
/* 作用 : 初始化滴答定时器,让滴答定时器每微妙进入一次中断* 传入参数 : 无* 返回值 : 无
*/
void initTime(void) {SysTickPeriodSet(SysCtlClockGet() / 1000000UL); // 1000表示毫秒,1000000表示微秒SysTickIntRegister(SycTickHandler);  //注册滴答定时器中断服务函数SysTickIntEnable();  //使能SysTick中断SysTickEnable();     //使能SysTick计数器
}/* 作用 : 进行毫秒延时* 传入参数 :ms : 要延时多少毫秒* 返回值 : 无
*/
void delay(uint32_t ms) {delayMicroseconds(ms * 1000UL);
}/* 作用 : 进行微妙延时* 传入参数 : us : 要延时的微妙数* 返回值 : 无
*/
void delayMicroseconds(uint32_t us) {uint32_t start = micros(); //记录准备开始延时的时间,单位微秒//如果当前时间减去开始延时的时间小于传入值,阻塞。while ((int32_t)(micros() - start) < us) {// Do nothing};
}/* 作用 : 开机到现在返回过了多少毫秒* 传入参数 : 无* 返回值 : 返回开机到现在过了多少毫秒
*/
uint32_t millis(void) {return counter / 1000UL;
}/* 作用 : 开机到现在返回过了多少微秒* 传入参数 : 无* 返回值 : 返回开机到现在过了多少微秒
*/
uint32_t micros(void) {return counter;
}/* 作用 : 延时时间,单位毫秒* 传入参数 : 要延时的毫秒数* 返回值 : 无
*/
void Delay_Ms(uint32_t x)
{delay(x);
}/* 作用 : 延时时间,单位毫秒* 传入参数 : 要延时的微妙数* 返回值 : 无
*/
void delay_ms(uint32_t x)
{Delay_Ms(x);
}/* 作用 : 延时时间,单位微秒* 传入参数 : 要延时的微秒数* 返回值 : 无
*/
void delay_us(uint32_t x)
{delayMicroseconds(x);
}/* 作用 : 延时时间,单位微秒* 传入参数 : 要延时的微秒数* 返回值 : 无
*/
void Delay_Us(uint32_t x) 
{delayMicroseconds(x);
}

SystickTime.h

#ifndef __SYSTICKTIME_h__
#define __SYSTICKTIME_h__void initTime(void);                 //初始化滴答定时器
void delay(uint32_t ms);             //进行毫秒延时
void delayMicroseconds(uint32_t us); //进行微妙延时
uint32_t millis(void);               //返回开机到现在过了多少毫秒
uint32_t micros(void);               //返回开机到现在过了多少微秒
void Delay_Ms(uint32_t x);           //延时时间,单位毫秒
void Delay_Us(uint32_t x);           //延时时间,单位微秒
void delay_ms(uint32_t x);           //延时时间,单位毫秒
void delay_us(uint32_t x);           //延时时间,单位微秒#endif

相关文章:

TM4C123库函数学习(2)--- LED闪烁,滴答定时器精准延时

前言 &#xff08;1&#xff09;阅读本文之前&#xff0c;需要先看TM4C123库函数学习&#xff08;1&#xff09;— 点亮LEDTM4C123的ROM函数简介keil开发环境搭建篇。 &#xff08;2&#xff09;TM4C123是M4的内核&#xff0c;拥有一个24位向下计数的SysTick定时器。&#xff0…...

Linux: network: tcp: back-off技术

当一个包需要重传的时候&#xff0c;会使用 exponential back-off来计算下一次重传的时间。 这个back-off的使用还是相当的广泛&#xff1a;《Adaptive Backoff Synchronization Technique》https://dl.acm.org/doi/pdf/10.1145/74926.74970 The general idea of backoff has …...

36 | 银行贷款数据分析

本文将以银行贷款数据分析为主题,深入探讨如何运用数据科学的方法,揭示银行贷款领域的内在规律和趋势。通过对贷款数据的分析,我们能够洞察不同类型贷款的分布情况、贷款金额的变化趋势,以及借款人的特征和还款情况等关键信息。 通过运用Python编程语言及相关的数据分析工…...

计算机网络-物理层(二)- 传输方式

计算机网络-物理层&#xff08;二&#xff09;- 传输方式 串型传输与并行传输 串行传输:是指数据是一个比特一个比特依次发送的&#xff0c;因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可 并行传输:是指一次发送n个比特而不是一个比特&#xff0c;因此发送…...

超强台风“杜苏芮”来袭!如何实现安全可靠的通信?

暴雨来袭 超强台风“杜苏芮”是2023年太平洋台风季第5个被命名的台风&#xff0c;在我国东南沿海地区造成了巨大的影响&#xff0c;在7月28日登录福建省晋江市时&#xff0c;“杜苏芮”中心附近最大风力15级&#xff0c;达到了超强台风的等级&#xff1b;福州市区、闽侯、莆田…...

内网隧道—HTTP\DNS\ICMP

本文仅限于安全研究和学习&#xff0c;用户承担因使用此工具而导致的所有法律和相关责任&#xff01; 作者不承担任何法律和相关责任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…...

QT mouseTracking

在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent&#xff0c;但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到&#xff0c;需要setMouseTracking(true)。 如果鼠标跟踪失效&#xff08;默认&#xff09;&#xff0c;…...

java操作mongdb【超详细】

Java操作 搭建 搭建 依赖 <!--mongodb--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>配置文件 spring:data:mongodb:host…...

JavaScript函数

什么是函数&#xff1f; 在 JavaScript 中&#xff0c;函数是一段被封装起来用于特定任务的可重复使用的代码块。 例如&#xff1a; function logger() {console.log(IT知识一享); }这样就创造了logger()函数&#xff0c;后续可以重复利用这个函数让它输出日志&#xff0c;后…...

RISC-V公测平台发布 · 使用YCSB测试SG2042上的MySQL性能

实验介绍&#xff1a; YCSB&#xff08;全称为Yahoo! Cloud Serving Benchmark&#xff09;&#xff0c;该性能测试工具由Java语言编写&#xff08;在之前的MC文章中也提到过这个&#xff0c;如果没看过的读者可以去看看之前MC那一期&#xff09;&#xff0c;主要用于云端或者…...

母婴即时零售行业数据可视化分析

对新晋父母来说&#xff0c;很多母婴用品如同一位贴心的助手&#xff0c;为他们的宝宝提供温暖和呵护。从婴儿床垫到可爱的拼图玩具&#xff0c;每一件用品都是为宝宝的成长和发展量身定制。对于繁忙的父母们而言&#xff0c;这些用品不仅帮助照顾孩子&#xff0c;更是为他们减…...

快速解决IDEA中类的图标变成J,不是C的情况

有时候导入新的项目后&#xff0c;会出现如下情况&#xff0c;类的图标变成J&#xff0c;如图&#xff1a; 直接上解决方法: 找到项目的pom.xml&#xff0c;右键&#xff0c;在靠近最下方的位置找到Add as Maven Project&#xff0c;点击即可。 此时&#xff0c;一般类的图标就…...

vue学习笔记

1.官网 v2官网 https://v2.cn.vuejs.org/ v3官网 https://cn.vuejs.org/ 2.vue引入 在线引入 <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> 下载引入(下载链接) https://v2.cn.vuejs.org/js/vue.js 3.初始化渲…...

难解的bug

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord 【Android TimeCat】 解决 context.startforegroundservice() did not then call service.startforeground() | XiChens Blog http://www…...

人文景区有必要做VR云游吗?如何满足游客出行需求?

VR云游在旅游行业中的应用正在快速增长&#xff0c;为游客带来沉浸式体验的同时&#xff0c;也为文旅景区提供了新的营销方式。很多人说VR全景展示是虚假的&#xff0c;比不上真实的景区触感&#xff0c;人文景区真的有必要做VR云游吗&#xff1f;我的答案是很有必要。 如果你认…...

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…...

3.解构赋值

解构赋值是一种快速为变量赋值的简洁语法&#xff0c;本质上仍然是为变量赋值。 3.1数组解构 数组解构是 将数组的单元值快速批量赋值给一系列变量 的简洁语法 1.基本语法: &#xff08;1&#xff09;赋值运算符左侧的[ ]用于批量声明变量&#xff0c;右侧数组的单元值将被赋…...

ChatGPT在智能游戏和游戏AI中的应用如何?

ChatGPT在智能游戏和游戏AI领域具有广泛的应用潜力&#xff0c;可以为游戏体验增添智能和交互性&#xff0c;同时也有助于游戏开发者创造更丰富、更引人入胜的游戏内容。以下将详细探讨ChatGPT在智能游戏和游戏AI中的应用。 ## 1. 游戏角色的智能化 在角色扮演游戏&#xff0…...

【安卓串口通信】

安卓串口通信需要使用到串口适配器和USB OTG线。首先需要在Android设备上安装串口调试助手或其他支持串口通信的应用程序。然后将串口适配器连接到Android设备&#xff0c;使用USB OTG线连接即可。 接下来&#xff0c;您需要打开串口调试助手或其他应用程序&#xff0c…...

电气测试相关

项目&#xff1a; 长期过电压 瞬态过电压 瞬态欠压 跳跃启动 卸载 纹波电压 电源电压缓慢下降和上升 电源电压缓慢下降、快速上升 复位行为 短暂中断 启动脉冲 带电气系统控制的电压曲线 引脚中断 连接器中断 反极性 信号线和负载电路短路 启动行为 对分流不…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...