Clion开发stm32之Systick驱动(标准)

本文介绍了如何使用HAL库编程方式来实现STM32的Systick滴答定时器,包括设置时钟频率、初始化定时器、提供延迟功能以及获取系统滴答数的方法。此外,还包括了中断处理函数SysTick_Handler,用于在每个周期结束时递增系统计数器uwTick。
摘要由CSDN通过智能技术生成

前言

  1. 模仿HAL库编程的Systick
  2. 滴答定时器

头文件

// @ Copyright (c) [scl]。保留所有权利。
//     本文仅供个人学习和研究使用,禁止用于商业用途。

#ifndef STM32_STD_TEMPLATE_BSP_SYSTICK_H
#define STM32_STD_TEMPLATE_BSP_SYSTICK_H

#include "sys_core.h"

#define MAX_DELAY      0xFFFFFFFFU
typedef enum {
    TICK_FREQ_10HZ = 100U,
    TICK_FREQ_100HZ = 10U,
    TICK_FREQ_1KHZ = 1U,
    TICK_FREQ_DEFAULT = TICK_FREQ_1KHZ
} tick_freq_typedef;
extern __IO uint32_t uwTick;
extern tick_freq_typedef uwTickFreq;

/**
 * 设置时钟频率类型
 * @param tick_freq  This parameter can be a value of @ref tick_freq_typedef
 */
void sys_tick_set(tick_freq_typedef tick_freq);

/**
 * 滴答定时器初始化
 */
void sys_tick_init();
/**
 * @brief 函数根据变量递增提供最小延迟(以毫秒为单位)
 * @param delay 指定延迟时间长度(以毫秒为单位)
 */
SYS_WEAK void sys_delay(uint32_t delay);
/**
 * @brief 提供以毫秒为单位的刻度值.
 * @return tick value
 */
SYS_WEAK uint32_t sys_get_tick(void);
/**
 * @brief 调用此函数以递增用作应用程序时基的全局变量“uwTick”。
 */
SYS_WEAK void sys_inc_tick(void);

#endif //STM32_STD_TEMPLATE_BSP_SYSTICK_H

源文件

// ? Copyright (c) [scl]。保留所有权利。
//     本文仅供个人学习和研究使用,禁止用于商业用途。

#include "bsp_systick.h"

__IO uint32_t uwTick;
tick_freq_typedef uwTickFreq = TICK_FREQ_DEFAULT;  /* 1KHz */
void sys_tick_set(tick_freq_typedef tick_freq) {
    uwTickFreq = tick_freq;
}

void sys_tick_init() {
    /* SysTick end of count event each 1ms */
    RCC_ClocksTypeDef RCC_Clocks;
    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / (1000U / uwTickFreq));
}


SYS_WEAK void sys_delay(uint32_t delay) {
    uint32_t tick_start = sys_get_tick();
    uint32_t wait = delay;
    /* Add a freq to guarantee minimum wait */
    if (wait < MAX_DELAY) {
        wait += (uint32_t) (uwTickFreq);
    }
    while ((sys_get_tick() - tick_start) < wait);
}

SYS_WEAK uint32_t sys_get_tick(void) {
    return uwTick;
}

SYS_WEAK void sys_inc_tick(void) {
    uwTick += uwTickFreq;
}

中断函数调用

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void) {

    sys_inc_tick();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

詩不诉卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值