萌新的STM32学习-9
我们在使用某个外设,必须线使能该外设时钟
SYSTEM 文件夹里面的代码由正点原子提供,是 STM32F1xx 系列的底层核心驱动函数,
可以用在 STM32F1xx 系列的各个型号上面,方便大家快速构建自己的工程。本章,我们将向大
家介绍这些代码的由来及其功能,也希望大家可以灵活使用 SYSTEM 文件夹提供的函数,来快
速构建工程,并实际应用到自己的项目中去。
SYSTEM 文件夹下包含了 delay、sys、usart 等三个文件夹。分别包含了 delay.c、sys.c、usart.c
及其头文件。这 3 个 c 文件提供了系统时钟设置、延时和串口 1 调试功能,任何一款 STM32F1
都具备这几个基本外设,所以可以快速地将这些设置应用到任意一款 STM32F1 产品上,通过
这些驱动文件实现快速移植和辅助开发的效果。
12.1 deley 文件夹代码介绍
12.2 sys 文件夹代码介绍
12.3 usart 文件夹代码介绍
delay 文件夹内包含了 delay.c 和 delay.h 两个文件,这两个文件用来实现系统的延时功能,
其中包含 7 个函数:
void delay_osschedlock(void);
void delay_osschedunlock(void);
void delay_ostimedly(uint32_t ticks);
void SysTick_Handler(void);
void delay_init(uint16_t sysclk);
void delay_us(uint32_t nus);
void delay_ms(uint16_t nms);
前面 4 个函数,仅在支持操作系统(OS)的时候,需要用到,而后面 3 个函数,则不论是
否支持 OS 都需要用到。
void delay_init(uint16_t sysclk);
初始化系统滴答定时器
void delay_us(uint32_t nus);
用系统滴答定时器实现微妙延时
void delay_ms(uint16_t nms);
用微妙延时函数实现毫秒延时
CM3 内核处理器,内部包
含了一个 SysTick 定时器,SysTick 是一个 24 位的向下递减的计数定时器,当计数值减到 0 时,
将从 RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在 SysTick 控制及
状态寄存器中的使能位清除,就永不停息
CLKSOURCE 可以通过 0 1 来选择是几分频 比如说 0 就是选择8分频 1就是选择 1分频
/**
- @brief 初始化延迟函数
- @param sysclk: 系统时钟频率, 即 CPU 频率(HCLK)
- @retval 无
/
void delay_init(uint16_t sysclk)
{
#if SYS_SUPPORT_OS / 如果需要支持 OS. /
uint32_t reload;
#endif
SysTick->CTRL = 0; /清 Systick 状态,以便下一步重设,如果这里开了中断会关闭其中断/
/ SYSTICK 使用内核时钟源 8 分频,因 systick 的计数器最大值只有 2^24 /
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
g_fac_us = sysclk / 8; / 不论是否使用 OS,g_fac_us 都需要使用,作为 1us 的基础时基 /
#if SYS_SUPPORT_OS / 如果需要支持 OS. /
reload = sysclk / 8; / 每秒钟的计数次数 单位为 M /
reload = 1000000/delay_ostickspersec;/ 根据 delay_ostickspersec 设定溢出时间/
g_fac_ms = 1000 / delay_ostickspersec;/* 代表 OS 可以延时的最少单位 /
SysTick->CTRL |= 1 << 1; / 开启 SYSTICK 中断 /
SysTick->LOAD = reload; / 每 1/delay_ostickspersec 秒中断一次 /
SysTick->CTRL |= 1 << 0; / 开启 SYSTICK */
#endif
}
下面对这句话进行简单的理解和分析
g_fac_us = sysclk / 8; /* 不论是否使用 OS,g_fac_us 都需要使用,作为 1us 的基础时基 */
假设滴答计数器的计数频率是1M 1000000 那么每数一次 就是1/1000000 对于我们F1 系列来说就是72MHz 8分频 滴答计数器真正的计数频率是9M 而我们1M 得到1微妙是1/1000000 而在9M的情况下 就需要9/9000000 那么这个9哪里来 本来都是?/9000000 那么想要得到? 就需要我们把这个数据截取出来用 72/8=9 得到
500ms延时正确