中级会员
 
- 积分
- 218
- 金钱
- 218
- 注册时间
- 2015-1-19
- 在线时间
- 28 小时
|
早在大二就买了一块战舰开发板,但是由于各种原因,开发一直使用51系列的,STC差不多都用了个遍,但是随着开发时间越来越长,很多需要高性能多中外设的单片机,所以从今天开始我准备定期更新自己的学习过程,并把心得分享给大家。
兵欲善其事必先利其器,对于开发过程中使用最多的莫过于延时了,对于时序要求不高的场合我们可以通过仿真来计算出大致的延时时间,但是对于一些需要严格时序的场合就不一样了,比如通过时序获取或者设置一些传感器或者芯片等。
战舰的开发板延时函数做的很好,兼容性也很高,但是一些初学者或许正因如此卡在这里,因为他们用别人的程序,虽然不用去读懂,但是感觉自己好像还是什么东西没有学,然而学了又看不懂,这里我用SysTick编写了us和ms级的延时函数,其实和原子用的都是状态
查询法,但是这个更简单,然而却不支持ucos,但是你可以使用系统自带的延时(ms)或者需要us级的延时再用原子带的。
废话不多说,上代码:
[mw_shl_code=c,true]/*****************************
* @file elay.h
* @brief:initializing SysTick registers as base time for delay and set us&ms delay
* @author:zx
* @date: 2016/5/18
* @version: V0.1
* @attention:none
*****************************/
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f10x.h"
extern void SysTick_Init(void);
extern void Delay_us(u32 us);
extern void Delay_ms(u32 ms);
#endif
[/mw_shl_code]
[mw_shl_code=c,true]/*****************************
* @file elay.c
* @brief:initializing SysTick registers as base time for delay and set us&ms delay
* @author:zx
* @date: 2016/5/18
* @version: V0.1
* @attention: none
*****************************/
#include "Delay.h"
void SysTick_Init(void)
{
//SysTick_CLKSource_HCLK 72MHz
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //配置SysTick时钟源为8分频 即 72MHz/8 也可选择不分频
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; //计数器减到0时 不产生异常中断
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关定时器
SysTick->CTRL &= ~SysTick_CTRL_COUNTFLAG_Msk; //异常标志位清零
SysTick->LOAD = 9; // 72MHz/8/9 = 1us 我要每1us产生一次异常则就在重装寄存器中存9
SysTick->VAL = 0; //默认计数器内容是0
}
void Delay_us(u32 us)
{
SysTick->VAL = 0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开定时器
while(us--)
{
while(!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk)); //判断标志位是否置位,没有就等待
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关定时器
}
void Delay_ms(u32 ms)
{
while(ms--)
{
Delay_us(1000); // 延时1ms
}
}
[/mw_shl_code]
|
|