系统定时器SYSTEM文件夹介绍
1,sys文件夹介绍
sys_nvic_set_vector_table():设置中断向量表地址
sys_intx_enable():开启所有中断
sys_intx_disable():关闭所有中断(但是不包括fault和NMI中断)
sys_wfi_set():执行: WFI指令(执行完该指令进入低功耗状态)
sys_standby():进入待机模式
sys_soft_reset():系统软复位
sys_msr_msp():设置栈顶地址
sys_stm32_clock_init():设置系统时钟
sys_cache_enable():使能I-Cache和D-Cache, 开启D-Cache强制透写
2,deley文件夹介绍
delay_init():初始化系统滴答定时器
void delay_init(uint16_t sysclk)
{
SysTick->CTRL = 0;
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); //配置CLKSOURCE寄存器置0,8分频
//计数频率=系统时钟(72M)/8(分频)=9M
g_fac_us = sysclk / 8; //全局变量,赋值=参数uint16_t sysclk/8,标志这1us的次数
}
delay_us():用系统滴答定时器实现微秒延时
void delay_us(uint32_t nus)
{
uint32_t temp; //定义变量temp
SysTick->LOAD = nus * g_fac_us; /* 时间加载,重装载值一般要-1 */
SysTick->VAL = 0x00; /* 清0计数器 */
SysTick->CTRL |= 1 << 0 ; /* 开始倒数 */
do
{
temp = SysTick->CTRL;
} while ((temp & 0x01) && !(temp & (1 << 16))); /* (temp &(1<<16))非0则跳出循环 */
SysTick->CTRL &= ~(1 << 0) ; /* 关闭SYSTICK */
SysTick->VAL = 0X00; /* 清空计数器 */
}
时间 = 计数个数 / 计数频率
while循环条件判断是为0跳出循环
&&操作符:A && B: 如果A和B都是1,则 A&&B整体表达式为真,如果A && B中只要有一个为0,则整体为0.
!取反
A && !B则A固定不变B要为1
temp&0x01只要temp的最低位是1(真),那么结果就是1,反之就是0(假)。
(temp &(1<<16))非0则跳出循环
delay_ms():用微秒延时函数实现毫秒延时
void delay_ms(uint16_t nms)
{
/* 这里用1000,是考虑到可能有超频应用,
* 比如128Mhz的时候, delay_us最大只能延时1/(128 000 000/8)*2^24=1.048576s
*/
uint32_t repeat = nms / 1000; //大于1s的整数部分
uint32_t remain = nms % 1000; //大于1s的小数部分
while (repeat)
{
delay_us(1000 * 1000); /* 利用delay_us 实现 1000ms 延时 */
repeat--;
}
if (remain)
{
delay_us(remain * 1000); /* 利用delay_us, 把尾数延时(remain ms)给做了 */
}
}
SysTick,即系统滴答定时器,包含在M3/4/7内核里面,核心是一个24位的递减计数器
测试:魔术棒->Utilities->Settings->Trace->Core Clock:输入系统时钟->仿真->打断点运行延时->看t1变化->->
3.usart文件夹介绍
printf函数输出流程:printf()->C标准库->fputc()->->
用户需要根据fputc最终输出的硬件重新定义该函数,此过程称为:printf重定向
printf函数支持:
1,避免使用半主机模式,两种方法:微库法、代码法
半主机模式:就是通过仿真器实现开发板在电脑上的输入和输出
微库法:魔术棒->Target->勾选:Use Micro LIB
2,实现fputc函数