systemtick定时器封装

C文件

#include "SystemTick.h"
#include "gd32f30x.h" 
#include "gd32f30x_rcu.h"

static volatile SYSTEM_TICK_TYPE gSystickOverCnt = 0;
static int gSysTickPerUs = 0;
void SysTick_Handler(){ ++gSystickOverCnt;}

#define SYSTICK_REAL  (SYSTEM_TICK_TYPE)((~SysTick->VAL)&0xFFFFFF | (gSystickOverCnt)<<24)

SYSTEM_TICK_TYPE GetSystemRealTick(){return SYSTICK_REAL;}

void delay_us(unsigned int us){
    SYSTEM_TICK_TYPE dest = SYSTICK_REAL + us*gSysTickPerUs;
    while( SYSTICK_REAL < dest );
}

SYSTEM_TICK_TYPE us2SystemTick(unsigned int us){
    return us*gSysTickPerUs;
}

int IsSystemTimeOut(SYSTEM_TICK_TYPE startTick,unsigned int dUs){
    return SYSTICK_REAL>=( startTick + us2SystemTick(dUs) );
}
void SystemTickInit(){
    SysTick_Config( 0x1000000 );
    systick_clksource_set( SYSTICK_CLKSOURCE_HCLK_DIV8 );
    
    gSysTickPerUs = rcu_clock_freq_get(CK_AHB)/8e6;
}

头文件

#ifndef SYSTEM_TICK_H
#define SYSTEM_TICK_H

typedef unsigned long long SYSTEM_TICK_TYPE;

extern void   delay_us(unsigned int us);
extern void   SystemTickInit();
extern inline SYSTEM_TICK_TYPE GetSystemRealTick();
extern SYSTEM_TICK_TYPE us2SystemTick(unsigned int us);
extern int IsSystemTimeOut(SYSTEM_TICK_TYPE startTick,unsigned int dUs);

#endif

主程序

#include "gd32f30x.h" 
#include "SystemTick.h"

int main(){
    SystemTickInit();
    
    rcu_periph_clock_enable(RCU_GPIOA);
    gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1);

    while(1){
        gpio_bit_set(GPIOA,GPIO_PIN_1);
        delay_us(5e5);
        gpio_bit_reset(GPIOA,GPIO_PIN_1);
        delay_us(5e5);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值