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);
delay编程思想:CM3内核处理器,内部包含一个SysTick定时器,SysTick是一个24位的向下递减的计数定时器,当计数值减到0时,将从RELOAD
寄存器中自动重装载定时初值,开始新一轮计数。只要不把它在SysTick控制及状态寄存器中的使能位清除,就不会停止。我们利用STM32的内部SysTick来实现延时的,这样即不占用中断,也不占用系统定时器。
使用的寄存器
SysTick->CTRL
寄存器SysTick->LOAD
寄存器SysTick->VAL
寄存器delay_us
函数
void delay_us(uint32_t nus)
{
uint32_t temp;
SysTick->LOAD = nus * g_fac_us; //向LOAD寄存器的RELOAD位装载初始值
SysTick->VAL = 0x00; //清空VAL寄存器的CURRENT位,使计数器从0开始
SysTick->CTRL |= 1 << 0 ; //使能CTRL寄存器的ENABLE位,开始计数
do
{
temp = SysTick->CTRL; //获取CTRL寄存器的各个位的状态
}
while ((temp & 0x01) &&!(temp & (1 << 16))); //判断使能位是否为1且通过COUNTFLAG判断是否数到0
SysTick->CTRL &= ~(1 << 0) ; /* 关闭 SYSTICK */
SysTick->VAL = 0X00; /* 清空计数器 */
}
delay_ms
函数
void delay_ms(uint16_t nms)
{
/*这里用 1000,是考虑到可能有超频应用,如 128Mhz 时,delay_us 最大只能延时 1048576us 左右*/
uint32_t repeat = nms / 1000;
uint32_t remain = nms % 1000;
while (repeat)
{
delay_us(1000 * 1000); /* 利用 delay_us 实现 1000ms 延时 */
repeat--;
}
if (remain)
{
delay_us(remain * 1000); /* 利用 delay_us, 把尾数延时(remain ms)给做了 */
}
}
函数接受一个参数 nms
,表示需要延时的毫秒数。函数内部首先将毫秒数分解为整秒数和剩余的毫秒数。接着使用一个循环,每次循环调用 delay_us
函数来实现 1000 毫秒(1秒)的延时,直到整秒数全部延时完成。最后,如果有剩余的毫秒数,再调用 delay_us
函数来延时剩余的时间。 这样处理使delay_us函数调用次数减少,计数会更加精准。
sys文件夹包含sys.c和sys.h两个文件,在sys.c包含以下函数:
//函数声明
void sys_nvic_set_vector_table(uint32_t baseaddr, uint32_t offset); //设置中断向量表偏移地址
void sys_standby(void); //进入待机模式
void sys_soft_reset(void); //系统软复位
uint8_t sys_stm32_clock_init(uint32_t plln); //系统时钟初始化函数
声明:资料来源(战舰STM32F103ZET6开发板资源包)
- Cortex-M3权威指南(中文).pdf
- STM32F10xxx参考手册_V10(中文版).pdf
- STM32F103 战舰开发指南V1.3.pdf
- STM32F103ZET6(中文版).pdf
- 战舰V4 硬件参考手册_V1.0.pdf