文章目录
- STM32 SYSTEM文件夹介绍
- 1. delay文件夹
- 2. sys文件夹
STM32 SYSTEM文件夹介绍
1. delay文件夹
-
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函数调用次数减少,计数会更加精准。
2. sys文件夹
-
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