参考教程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 */

1965

被折叠的 条评论
为什么被折叠?



