GD32F30x系列的系统时钟最大运行频率是120MHZ;
打开GD32F30x用户手册,找到系统时钟树,如下图所示:
可以看到systick时钟通过AHB时钟8分频后作为systick的外部时钟,AHB时钟可以通过预分频设置其频率,最大120MHz。
1、在Application文件夹下的sources文件夹下创建一个systick.c文件,在include文件夹下创建一个systick.h文件。并将文件添加到keil工程中,如下图所示:
2,根据系统时钟树,对systick进行初始化,在system_gd32f30x.c文件中已经提供了systick时钟的初始化,因此我们只需要在这里选择相对应的时钟频率即可,使用固件库开发可以大大提高效率,如下图所示:
//systick.c文件
#include "systick.h"
static uint32_t g_systick=0;//systick时钟变量,每触发一次systick,该变量增加1
/*!
注SysTick_Config 和 NVIC_SetPriority 函数在m4 的内核头文件中有详细实现,大家可以参考下
配置systick
*/
void systick_config(void)
{
/*设置systick中断1000Hz,即1ms触发一次中断 */
if (SysTick_Config(SystemCoreClock / 1000U)){
/* capture error */
while (1){
}
}
/* 设置systick中断优先级 */
NVIC_SetPriority(SysTick_IRQn, 0x00U);
}
/*!
SysTick 中断函数
*/
void SysTick_Handler(void)
{
g_systick++;
}
/*!
延时ms函数,输入延时时间
*/
void delay_1ms(uint32_t count)
{
uint32_t last_tick=g_systick;
while((count+last_tick)>g_systick){
}
}
/*
获取系统当前的systick
*/
uint32_t systick_get(void)
{
return g_systick;
}
/*
获取上次系统的systick到当前系统的systick 距离多久
*/
uint32_t systick_distance_get(uint32_t last_tick)
{
return (g_systick - last_tick);
}
//systick.h文件
#ifndef SYS_TICK_H
#define SYS_TICK_H
#include "gd32f30x.h"
void systick_config(void);
void SysTick_Handler(void);
void delay_1ms(uint32_t count);
uint32_t systick_get(void);
uint32_t systick_distance_get(uint32_t last_tick);
#endif /* SYS_TICK_H */
3、在keil工程中main.c文件main函数中调用systick_config函数,如下图所示:
4、连接好硬件板和电脑后,编译下载程序到硬件板中,点击调试运行,如下图所示:
5、设置断点在systick中断函数中,查看系统运行是否进入该中断,以及查看g_systick 的值是否1ms增加1次,如下图所示:
这里可以看到systick中断基本上满足1ms触发一次,说明systick配置成功。