【STM32·标准库·学习·铁头山羊】关于串口发送数据Delay_Init的修改

参考教程UP主主页:【铁头山羊的个人空间-哔哩哔哩】 https://b23.tv/n2b9Rxd
本文参考教程:https://www.bilibili.com/video/BV11X4y1j7si?t=0.1&p=14

当复现串口输出时间代码时,遇到的问题是主函数的while循环卡在了Delay函数,无法按照循环输出时间(只有按下复位键才能输出一次)

在这里插入图片描述

由于还没学中断和定时,所以这里暂时只给出修改后的函数文件(delay.c和delay.h)

delay.c

#include "delay.h"

__IO uint32_t ulTicks;
static uint8_t delay_initialized_flag = 0;
static uint32_t fac_us;  // 微秒系数
static uint32_t fac_ms;  // 毫秒系数

/**
  * @简介:初始化延迟函数
  * @返回值:无
  */
void Delay_Init(void)
{
    if(!delay_initialized_flag)
    {
        delay_initialized_flag = 1;
        
        // 关闭SysTick定时器
        SysTick->CTRL &= ~SysTick_CTRL_ENABLE;
        
        // 系统时钟为75MHz
        // 选择外部时钟,即HCLK/8
        SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE;
        
        // 不开启中断
        SysTick->CTRL &= ~SysTick_CTRL_TICKINT;
        
        // 计算系数
        // HCLK/8 = 75MHz/8 = 9.375MHz
        fac_us = 9;    // 每微秒的计数次数,取整
        fac_ms = fac_us * 1000;  // 每毫秒的计数次数
        
        // 初始化计数器
        ulTicks = 0;
    }
}

/**
  * @简介:微秒级延迟
  * @参数:us - 要延迟的时间,单位是微秒
  */
void DelayUs(uint32_t us)
{
    uint32_t temp;
    
    Delay_Init();
    
    // 设置装载值
    SysTick->LOAD = us * fac_us;
    // 清空计数器
    SysTick->VAL = 0;
    // 开始计数
    SysTick->CTRL |= SysTick_CTRL_ENABLE;
    
    // 等待时间到达
    do
    {
        temp = SysTick->CTRL;
    } while((temp & SysTick_CTRL_ENABLE) && !(temp & SysTick_CTRL_COUNTFLAG));
    
    // 关闭计数器
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE;
    // 清空计数器
    SysTick->VAL = 0;
}

/**
  * @简介:毫秒级延迟
  * @参数:ms - 延迟时长,以毫秒为单位(千分之一秒)
  * @返回值:无
  * @注意:不允许在中断响应函数中调用此方法
  */
void Delay(uint32_t ms)
{
    uint32_t repeat = ms;
    uint32_t i;
    
    Delay_Init();
    
    // 处理大延时
    for(i=0; i<repeat; i++)
    {
        DelayUs(1000);
        ulTicks++;  // 手动增加计数器
    }
}

/**
  * @简介:获取当前时间,以毫秒(千分之一秒)为单位
  * @参数:无
  * @返回值:当前时间,单位为毫秒(千分之一秒)
  */
uint32_t GetTick(void)
{
    return ulTicks;
}

/**
  * @简介:获取当前的微秒级时间
  * @返回值:当前的微秒级时间
  * @注意:此函数基于ulTicks计数,精度有限
  */
uint64_t GetUs(void)
{
    uint64_t tick = GetTick();
    
    // 将毫秒转换为微秒
    return tick * 1000;
}

delay.h


#ifndef __DELAY_H
#define __DELAY_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stm32f10x.h"

extern __IO uint32_t ulTicks;

void Delay_Init(void);
void Delay(uint32_t Delay);
uint32_t GetTick(void);
uint64_t GetUs(void);
void DelayUs(uint32_t us);

#ifdef __cplusplus
}
#endif

#endif /* __DELAY_H */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值