本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发
向上代码兼容GD32F450ZGT6中使用
后续项目主要在下面该专栏中发布:
https://blog.csdn.net/qq_62316532/category_12608431.html?spm=1001.2014.3001.5482
感兴趣的点个关注收藏一下吧!
电机驱动开发可以跳转:
GD32F103RCT6/GD32F303RCT6-实战项目-无刷电机驱动(1)_gd32f103rct6例程-CSDN博客
BMS电源系统开发可以跳转:
暂未放链接
DCDC-双向BUCK-BOOST实战链接:
向上代码兼容GD32F303RCT6中使用
本项目配套开发板:
基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板
前面我们已经完成了GPIO输入输出的实验,但是在其中我们所使用的延时函数是采用自己编写的阻塞延时,定时的时长其实决定于程序运行的情况,不是十分准确,那么今天我们就会学习一种最常用的方法:SysTick定时。
学习SysTick定时首先我们需要了解它本身。
SysTick —系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 108M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
如图是官方手册中给出的时钟树配置:
SysTick定时遵守以下路径:
SysTick库函数
GPIO的库函数声明都在"gd32f10x_misc.hh"文件中。
官方资料路径:GD32F10x_Firmware_Library_V2.2.2\Firmware\GD32F10x_standard_peripheral\Include\gd32f10x_misc.h
设置SysTick时钟源
函数声明如下:
void systick_clksource_set(uint32_t systick_clksource)
参数:
systick_clksource | 参数1 | 需要选择的系统时钟源 |
返回 | 无 | 无 |
参数1:
名称 | 功能 |
SYSTICK_CLKSOURCE_HCLK | SysTick时钟源为AHB时钟 |
SYSTICK_CLKSOURCE_HCLK_DIV8 | SysTick时钟源为AHB时钟的8分频 |
关于其他的一些函数:
这里我们暂时用不上,所以只贴出来不进行讲解。
/*设置优先级组*/
void nvic_priority_group_set(uint32_t nvic_prigroup);
/*启用NVIC中断请求*/
void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority);
/*禁用NVIC中断请求*/
void nvic_irq_disable(uint8_t nvic_irq);
/*设置NVIC向量表的基址*/
void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset);
/*设置低功耗模式*/
void system_lowpower_set(uint8_t lowpower_mode);
/*复位低功耗模式*/
void system_lowpower_reset(uint8_t lowpower_mode);
SysTick 时间的计算
SysTick代码编写
我们在编写SysTick计时器的时候,我们并不需要从0去配置,在官方提供的示例中,有写好的代码
在GD32F10x_Firmware_Library_V2.2.4\Template中
我们在第一章新建工程的时候,已经将该文件放置在我们建立的USER文件夹中,所以这里我们就不需要再次移植,直接复制第一次工程的文件就行
记得在编译器的文件管理器中加入该文件,不然会有报错。
接下来在主函数中引用该头文件
然后在gd32f10x_it.c文件中引用该头文件,然后在SysTick的中断服务函数中加入delay_decrement函数
例程如下:
实验成功!
群号:621154399
有问题欢迎大家加入我们一起交流,这个群是开源性技术交流群。