【GD32】从0开始学GD32单片机(10)—— TIMER基本定时器详解+1毫秒延时例程

这篇具有很好参考价值的文章主要介绍了【GD32】从0开始学GD32单片机(10)—— TIMER基本定时器详解+1毫秒延时例程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

在GD32中定时器是非常重要的外设,它可以帮我们精准的控制程序的调度,就如之前讲过的SysTick就是一个定时器,我们可以通过设置这个定时器的寄存器实现延时函数。
GD32的定时器可大致分为3种——基本定时器、通用定时器、高级定时器
它们之间的区别如下图所示:

gd32 timer1,GD32系列,单片机,stm32,嵌入式硬件
这一节先介绍当中最简单的基本定时器。

简介

GD32中的定时器外设都是使用16位计时器;计数模式只有向上计数;支持单脉冲模式;支持DMA传输请求;在内部有触发线连接至DAC,这样可以使用定时器定时触发DAC的数据转换,这个在后面会讲到。

gd32 timer1,GD32系列,单片机,stm32,嵌入式硬件

时钟设置

要想定时器按预期工作,那么对时钟进行正确的设置是十分重要的。先找到对应的时钟树框图。
gd32 timer1,GD32系列,单片机,stm32,嵌入式硬件
首先,基本定时器挂载在APB1总线上,APB1总线的最高频率为54MHz(GD32F103C8T6),那么是不是进入定时器的频率就是这个呢?不是!不是!不是!(重要事情说3遍)
由时钟树中可看到,从AHB总线上过来的频率经过APB1分频器变成CK_APB1,但还需要经过一个分频器,才能变成定时器的时钟(CK_TIMER);这个分频器非常关键,因为它是带条件的,还是用户不可修改的。根据注释,当APB1分频器的分频系数为1时,该分频器的分频系数为1(不分频),否则倍频2倍。因为CK_APB1的频率为54MHz,所以APB1分频器的分频系数自然为2。当然我们也可以在固件库中找到答案,在system_gd32f10x.c文件中,我们可以找到以下这几行代码。
gd32 timer1,GD32系列,单片机,stm32,嵌入式硬件
从247行看到,在系统时钟初始化时,对APB1分频器进行了2分频的设置。
因为APB1分频器的分频系数为2,所以定时器信号分频器会倍频2倍,所以频率最终会跟AHB总线是一样的108MHz
对于挂载到APB2的定时器,它们的分频器也是这个规则。

基本定时器只有在高密度或以上的产品才搭载

很明显,从APB1总线上进来的时钟频率较快,因此定时器外设给了一个预分频器,预分频器寄存器是16位的,因此可以实现1-65536分频,分频后的时钟频率才是定时器计数的频率。
预分频器的工作其实比较好理解,例如我们的预分频是2分频,那么定时器等待2个CK_TIMER时钟周期才让定时器计数1次,以此类推。
下图是预分频系数从1变为2的时序图。

gd32 timer1,GD32系列,单片机,stm32,嵌入式硬件
其中TIMER_CK是定时器的频率,PSC_CLK是预分频之后的频率。

计数模式

基本定时器只支持向上计数这一种模式。计数器从0开始向上连续计数到自动加载值,一旦计数器计数到自动加载值,会重新从0开始向上计数并产生上溢事件。
下面是一个向上计数的时序图。

gd32 timer1,GD32系列,单片机,stm32,嵌入式硬件

上面的PSC值代表不同的预分频系数,PSC等于0和1分别表示1和2分频。
由上图可以看出当寄存器里的值达到了自动加载值后,会产生更新事件标志位和更新中断标志位会置1(若我们开启了对应的中断),不同的是更新事件标志位在置1后会很快被硬件置0,但更新中断标志位则需要用户进行软件清除,这在代码中是要注意的

例程

现象:LED灯以1秒的间隔闪烁。

timer.c文件

#include "timer.h"

static __IO uint32_t timer_val = 0;

void TIM_Init(void)
{
    timer_parameter_struct tim_struct = {0};
    
    rcu_periph_clock_enable(RCU_TIMER1);
    
    tim_struct.counterdirection = TIMER_COUNTER_UP;  // 向上计数
    tim_struct.prescaler = (108 - 1);  // 预分频:108MHz / 108 = 1MHz
    tim_struct.period = (1000 - 1);  // 周期:1000 / 1MHz = 1ms
    
    timer_init(TIMER1, &tim_struct);
    
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
    nvic_irq_enable(TIMER1_IRQn, 1, 1);
    
    timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
    timer_interrupt_enable(TIMER1, TIMER_INT_UP);

    timer_enable(TIMER1);
}

void TIM_DelayMs(__IO uint32_t ms)
{
    timer_val = ms;
    while(timer_val);
}

void TIM_ValDecrese(void)
{
    if(timer_val) --timer_val;
}

gd32f10x_it.c文件

void TIMER1_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP)){
        timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
        TIM_ValDecrese();
    }
}

总体的设计跟SysTick是差不多的,但SysTick没有预分频器,定时的配置没有定时器要灵活。我们用定时器实现的是一个1ms的延时,预分频系数为107,把频率定成1MHz,这样重装载值为999就可以实现1ms的定时。文章来源地址https://www.toymoban.com/news/detail-797434.html

到了这里,关于【GD32】从0开始学GD32单片机(10)—— TIMER基本定时器详解+1毫秒延时例程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • GD32单片机和STM32单片机的对比分析

    GD32单片机和STM32单片机都是基于Arm Cortex-M3/M4内核的32位通用微控制器,广泛应用于各种嵌入式系统和物联网领域。两者之间有很多相似之处,但也有一些不同之处,本文将从以下几个方面对比分析两者的特点、优势和开发成本。 GD32单片机采用的是二代的M3/M4内核,而STM32单片

    2024年02月16日
    浏览(24)
  • GD32单片机串口DMA发送

    一:在使用GD32单片机进行串口DMA发送时,需要进行以下配置: 使能 DMA 时钟和 串口时钟 。 配置 DMA通道 ,包括数据 方向 、数据 宽度 、传输 模式 等参数。 配置串口发送端口 GPIO 的模式和引脚。 配置串口的 基本参数 ,如波特率、数据位、停止位、校验位等。 配置串口D

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

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

    2024年02月13日
    浏览(19)
  • 从头开始学51单片机之实例4:用定时器输出方波

    Proteus8.9 Keil5 需求:fosc = 12MHz,利用T0实现在P1.0输出周期为1ms的方波 机器周期:T = 12/fosc = 1us 每隔一定时间让P1.0信号翻转,就能得到方波信号 方波周期为1ms,半周期为500us 所以t = 500us,T = 1us 定时器初值: 将TC拆为高8位和低5位,其中高8位1111 0000B(F0H)、低5位0 1100B(0CH),

    2024年02月12日
    浏览(34)
  • 单片机移植freemodbus主机(STM32、GD32、瑞萨、国民技术等)

    从github下载:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 无法下载或者下载太慢可以用资源下载,无需积分。freeModbus主机源码下载 示例代码 参考从机代码创建 将FreeModbus主机源代码拷贝到工程中间件-第三方库-freemodbus源码库:即MiddlewaresThird_PartyFreeModbusMaster文件夹中。

    2024年02月11日
    浏览(18)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月11日
    浏览(18)
  • GD32 单片机 硬件I2C死锁解决方法

    在I2C恢复函数下个断点(检测到I2C多次超时之后,应该能跳转到I2C恢复函数) 使用镊子,将SCL与SDA短接,很快就能看到程序停到恢复函数的断点上,此时再执行恢复函数,看能否正常走出(可在回复函数中写个死循环,只有I2C正常才跳出,检测I2C正常的办法,可以读从设备的

    2024年02月05日
    浏览(26)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(23)
  • 如果STM32/GD32一类的ARM单片机解除读写保护的方法

    有时候啊,使用ST-Link给STM32一类的ARM单片机下载程序的时候,发现怎么也下载不了,可能是由于芯片被写保护了。那怎么办呢?可以使用STM32 ST-LINK Utility工具解除芯片的写保护,本篇博文介绍操作步骤,文章最后有工具下载链接。 双击“STM32 ST-LINK Utility.exe”,打开软件。 软

    2024年02月09日
    浏览(21)
  • 单片机(STM32,GD32,NXP等)中BootLoader的严谨实现详解

    Bootloader( 引导加载程序 )的主要任务是引导加载并运行应用程序,我们的软件升级逻辑也一般在BootLoader中实现。本文将详细介绍BootLoader在单片机中的实现,包括 STM32、GD32、NXP Kinetis 等等的所有单片机,因为无论是什么样的芯片,它实现的逻辑都是一样的。 注意,本篇文章主

    2024年02月02日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包