TM4C123系列(五)————timer定时器(timer模式)

这篇具有很好参考价值的文章主要介绍了TM4C123系列(五)————timer定时器(timer模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.实验简介

通过定时器的timer模式来计时实现以1s为间隔将LED翻转。

二.板载定时器介绍

TM4C有两种定时器,一种为16/32bit的,一种是32/64bit的,两种定时器各有六个,对于每个定时器来说,它可以单独以较大的bit位作为一个定时器工作,也可以拆分为两个较小的bit位的定时器分别工作。比如对于16/32bit位的定时器,可以以32bit位的定时器工作,也可以以两个16bit的定时器A和B分别工作。

tm4c123g定时器,TM4C123,arm,单片机,嵌入式硬件

tm4c123g定时器,TM4C123,arm,单片机,嵌入式硬件

tm4c123g定时器,TM4C123,arm,单片机,嵌入式硬件

三.原理图及引脚分布

tm4c123g定时器,TM4C123,arm,单片机,嵌入式硬件

 

tm4c123g定时器,TM4C123,arm,单片机,嵌入式硬件

 tm4c123g定时器,TM4C123,arm,单片机,嵌入式硬件

 四.所需函数

用到的控制LED的GPIO相关函数与UART函数还有中断相关函数不再提起,有疑问的可以看我之前的文章

1.SysCtlPeripheralEnable(uint32_t ui32Peripheral)

参数:ui32Peripheral如果为16/32bit的定时器就是TIMER,如果是32/64bit的定时器就是WTIMER。

作用:使能外设

2.TimerConfigure(uint32_t ui32Base, uint32_t ui32Config)

参数:ui32Base为定时器基地址,ui32Config定时器所配置模式

作用:如果在定时器不拆分的情况下,可以将ui32Config设置为以下模式之一:

        TIMER_CFG_ONE_SHOT – 单次减计数模式
        TIMER_CFG_ONE_SHOT_UP – 单次加计数模式
        TIMER_CFG_PERIODIC – 连续减计数模式
        TIMER_CFG_PERIODIC_UP – 连续加计数模式
        TIMER_CFG_RTC – 实时时钟模式

如果将定时器拆分的话则将ui32Config设置为TIMER_CFG_SPLIT_PAIR(分裂为一对)然后与以下模式进行或运算:

        TIMER_CFG_A_ONE_SHOT – 定时器A单次减计数
        TIMER_CFG_A_ONE_SHOT_UP –定时器A单次加计数
        TIMER_CFG_A_PERIODIC – 定时器A连续减计数
        TIMER_CFG_A_PERIODIC_UP – 定时器A连续加计数

        TIMER_CFG_B_ONE_SHOT – 定时器B单次减计数
        TIMER_CFG_B_ONE_SHOT_UP –定时器B单次加计数
        TIMER_CFG_B_PERIODIC – 定时器B连续减计数
        TIMER_CFG_B_PERIODIC_UP – 定时器B连续加计数

拆分之后的定时器AB都一样,用哪个就设置哪个,只是函数名有区别。

3.TimerLoadSet(uint32_t ui32Base, uint32_t ui32Timer, uint32_t ui32Value)

参数:ui32Base为定时器基地址,ui32Timer有TIMER_A,TIMER_B和TIMER_BOTH(单独A,单独B,AB都用)三种选择,在定时器拆分的情况下用哪个就设置哪个,在不拆分的情况下就设置为TIMER_A(对于其他函数也是,如果在级联的情况下还需要选择,那默认为选择TIMER_A),ui32Value为定时器加载值,一般来说定时时间=1/N,那么定时器加载值=SysCtlClockGet()/N-1,即根据自己的定时时间求出N,即可得定时器加载值。

此函数适用于16bit,32bit的定时器,即适用于16/32bit的定时器拆分与级联,32/64bit定时器的拆分三种情况,对于64bit的定时器,即32/64bit定时器的级联使用TimerLoadSet64。

作用:配置定时器加载值。

4.TimerIntRegister(uint32_t ui32Base, uint32_t ui32Timer,void (*pfnHandler)(void))

参数:ui32Base为定时器基地址,ui32Timer也是有TIMER_A,TIMER_B和TIMER_BOTH三种,对于级联的定时器设置为TIMER_A即可,void (*pfnHandler)(void)为中断函数名

作用:注册中断函数

5.TimerIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)

参数:ui32Base为定时器基地址,ui32IntFlags为中断模式,在定时器状态下一般设置为TIMER_TIMB_TIMEOUT或TIMER_TIMA_TIMEOUT

作用:使能定时器中断

9.TimerEnable(uint32_t ui32Base, uint32_t ui32Timer)

参数:ui32Base为定时器基地址,ui32Timer也是有TIMER_A,TIMER_B和TIMER_BOTH三种。

五.代码文章来源地址https://www.toymoban.com/news/detail-605401.html

timer_timer.c
/*此代码分别使用16/32bit的定时器拆分与32/64bit的定时器级联实现同样的功能*/
#include "timer.h"
#include "timer_timer.h"
#include "hw_memmap.h"
#include "gpio.h"
#include "sysctl.h"
#include "interrupt.h"
#include "hw_ints.h"
_Bool flag=0;
void TIMER_IRQHandler(void);
void TIMER_WID_IRQHandler(void);
//16/32bit定时器拆分
void Timer_Config(void)
{
    //使能定时器TIMER0,16/32bit
    SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0);
    //配置定时器,将定时器拆分,并配置拆分后的定时器A为周期性计数
	TimerConfigure( TIMER0_BASE,  TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PERIODIC_UP);
    //设置定时器A装载值,因为要1ms进一次中断,所以1ms=1/1000,
    所以重装载值为SysCtlClockGet()/1000-1
	TimerLoadSet( TIMER0_BASE,  TIMER_A,
                          SysCtlClockGet()/1000-1);
    //为定时器A注册中断函数
	TimerIntRegister( TIMER0_BASE,  TIMER_A,
                             TIMER_IRQHandler);
    //使能time0的定时器A为超时中断
	TimerIntEnable( TIMER0_BASE,  TIMER_TIMA_TIMEOUT);
    //设置中断优先级
	IntPrioritySet( INT_TIMER0A,  0);
    //使能中断
	IntEnable( INT_TIMER0A);
	IntMasterEnable();
    //使能定时器
	TimerEnable( TIMER0_BASE,  TIMER_A);
}
void TIMER_IRQHandler(void)
{
	static uint32_t time_count=0;
	//读取定时器中断状态
    uint32_t status=TimerIntStatus( TIMER0_BASE,  true);
    //清除中断标志位
	TimerIntClear( TIMER0_BASE,  status);
	//1ms进一次中断
	time_count++;
    //进一千次,也就是1s,翻转flag
	if(time_count==1000)
	{
	    time_count=0;
		flag=!flag;
	}
}
//32/64bit的定时器级联
void Timer_Wid_Config(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER0);
    //设置不拆分并且周期计数
	TimerConfigure(WTIMER0_BASE,TIMER_CFG_PERIODIC_UP);
	TimerLoadSet64( WTIMER0_BASE,  SysCtlClockGet()/1000-1);
	//级联的情况下默认都是设置定时器A
	TimerIntEnable( WTIMER0_BASE,  TIMER_TIMA_TIMEOUT);
	TimerIntRegister( WTIMER0_BASE,  TIMER_A,
                             TIMER_WID_IRQHandler);
	IntPrioritySet( INT_WTIMER0A,  1);
	IntEnable( INT_WTIMER0A);
	IntMasterEnable();
	TimerEnable( WTIMER0_BASE,  TIMER_A);
}
void TIMER_WID_IRQHandler(void)
{
    static uint32_t time_count=0;
	
    uint32_t status=TimerIntStatus( WTIMER0_BASE,  true);
	TimerIntClear( WTIMER0_BASE,  status);
	
	time_count++;
	if(time_count==1000)
	{
	    time_count=0;
		flag=!flag;
	}
}
timer_timer.h
#ifndef __TIMER_TIMER_H
#define __TIMER_TIMER_H
extern _Bool flag;
void Timer_Config(void);
void TIMER_IRQHandler(void);
void Timer_Wid_Config(void);
void TIMER_WID_IRQHandler(void);
#endif
led.c
#include "led.h"
#include "gpio.h"
#include "sysctl.h"
#include "hw_gpio.h"
#include "hw_memmap.h"
void LED_Config(void)
{
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF);
	GPIODirModeSet( GPIO_PORTF_BASE,  GPIO_PIN_2,
                            GPIO_DIR_MODE_OUT);
	GPIOPadConfigSet( GPIO_PORTF_BASE,  GPIO_PIN_2,
                              GPIO_STRENGTH_2MA,  GPIO_PIN_TYPE_STD);
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Config(void);
#endif
main.c
#include "tm4c123gh6pm.h"
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_sysctl.h"
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "uartstdio.h"
#include "usart.h"
#include "timer_timer.h"
#include "led.h"
void main(void)
{
	SysCtlClockSet( SYSCTL_SYSDIV_4|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN|SYSCTL_USE_PLL);
	LED_Config();
    //Timer_Config();
	Timer_Wid_Config();
	while(1)
	{
	    if(flag==0)
		{
		    GPIOPinWrite( GPIO_PORTF_BASE,  GPIO_PIN_2,  GPIO_PIN_2);
		}
		else
		{
		    GPIOPinWrite( GPIO_PORTF_BASE,  GPIO_PIN_2,  0);
		}
	}
}

到了这里,关于TM4C123系列(五)————timer定时器(timer模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TM4C123GH学习笔记(1.0)——keil搭建开发环境

    关于安装keil5 KDM的教程参考B站江科大即可。本文需要安装好keil5。 本文附有keil的pack和相关驱动,以及创建好的空工程: 百度云链接:提取码:tc1e 站内链接:CSDN下载(免费)      打开设备管理器     选择文件夹下的驱动    装好之后,插着TM4C123GH6PM板子可以检测到ICDI。

    2024年02月17日
    浏览(39)
  • GD32系列笔记六:定时器Timer

    目录 一、定时器的作用 二、定时器介绍 三、定时器配置 1. 用作封装延时函数,提高程序实时性; 2. 测试某段代码的执行时间; 3. 一些外设的核心,如PWM输入捕获、输出比较等。 1.时钟树 2.结构图(基本定时器为例)  TIMER_CK就是CK_TIMER    3. 工作原理               1. 

    2024年02月13日
    浏览(42)
  • Flink timer定时器

    常见timer 基于处理时间或者事件时间处理过一个元素之后, 注册一个定时器, 然后指定的时间执行. Context和OnTimerContext 所持有的TimerService对象拥有以下方法: currentProcessingTime(): Long 返回当前处理时间 currentWatermark(): Long 返回当前watermark的时间戳 registerProcessingTimeTimer(timestamp: Lon

    2024年02月07日
    浏览(49)
  • Python中的定时器用法:Timer定时器和schedule库

    目录 一、引言 二、Timer定时器 1、Timer定时器的原理 2、Timer定时器的使用方法 3、Timer定时器的实际应用案例 三、schedule库 1、schedule库的原理 2、schedule库的使用方法 3、schedule库的实际应用案例 四、Timer定时器和schedule库的比较 1、功能差异 2、适用场景 五、实际应用案例 六、

    2024年01月16日
    浏览(71)
  • Jmeter之同步定时器(Synchronizing Timer)

    同步定时器类似LoadRunner的集合点,作用是阻塞线程,达到指定的线程数量后,再一起释放。 添加定时器同步定时器(Synchronizing Timer) 1、模拟用户组的数量:每次释放的线程数量,即 并发数。 默认为0 设置为0则并发数等于线程租中的线程数;设置大于0则等待达到这个数量

    2024年02月11日
    浏览(55)
  • MSP432---Timer_A定时器详解

    msp432数据手册slau356h.pdf,P782 目录 1. 时钟源选择和分频器 2. 定时器A工作(计数)模式  2.1 停止模式  2.2 增计数模式  2.3 连续计数模式  2.4 增减计数模式 3. 捕获/比较模块  3.1 捕获模式 3.2 比较模式  4. 中断 5. Timer_A寄存器 6. 软件实例 MSP432单片机定时器模块 有:看门狗定时

    2024年02月16日
    浏览(49)
  • 物联网操作系统-软件定时器(software timer)

    软件定时器就是\\\"闹钟\\\",你可以设置闹钟, ⚫ 在 30 分钟后让你起床工作 ⚫ 每隔 1 小时让你例行检查机器运行情况 软件定时器也可以完成两类事情: ⚫ 在\\\"未来\\\"某个时间点,运行函数 ⚫ 周期性地运行函数 日常生活中我们可以定无数个\\\"闹钟\\\",这无数的\\\"闹钟\\\"要基于一个真实

    2024年02月21日
    浏览(41)
  • 【Java|多线程与高并发】定时器(Timer)详解

    在Java中,定时器 Timer 类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行,或者以固定的时间间隔重复执行。 在服务器开发中,客户端向服务器发送请求,然后等待服务器响应. 但服务器什么时候返回响应,并不确定. 但也不能让客户端一直等下去

    2024年02月07日
    浏览(44)
  • C#里面的三种定时计时器:Timer

    在.NET中有三种计时器: 1、System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet。Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器。Timer控件和它所在的

    2024年02月07日
    浏览(39)
  • RT-Thread 15. list_timer与软定时器

    1. 代码 2. list_timer结果 3. 解释 0x0000012c: 300个时钟周期,即处于rt_thread_mdelay(3000); 0x00000032: 50个时钟周期,即处于rt_thread_mdelay(500); 4.增加软定时器 //usrtimer.c 5. MSH命令开启软件定时器 timer_static_sample()会执行,timer1和timer2会开始工作。输入list_timer,发现多了timer1、timer2

    2024年01月19日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包