sys文件夹介绍
这些函数都是在sys.c中实现 在sys.h中声明 int是中断(interrupt)的缩写
开启所有中断 给中断使能 enable 关闭所有中断 给中断失能 disable (就是一句话使用外设前要给中断使能)
delay文件夹的介绍 包含在system文件夹中
同样delay也是有着delay.C 和delay.h来实现和声明函数 在这里OS不做介绍
systick工作原理
注意实在芯片的内核里 24位表示能记下2的24次方的数字 当来一个时钟信号(一个方波)这个滴答定时器就减一 (递减)
上图是两个时钟信号
时钟源来自于HCLK(AHB总线)然后分频(调用时钟初始化函数设定好每条总线的预分频值)
滴答定时器的时钟来源来自HCLK 然后分频到达VAL给VAL提供时钟信号 (方波 往上数第三个图片)每次收到一个时钟信号就减一 一开始是2的24次方的数然后随着时钟信号的到来 依次减一 减到0 VAL==0 系统就把寄存器中的一个位 countFlag 赋值为1表示延时完成 然后系统自动重载 把2的24次方(LOAD)赋值给VAL
寄存器里的位 COUNTFLAG如果系统读取了就自动置为0 在这个寄存器(CTRL)中CLKSOURCE这个位是来决定分频的倍数的 (因为在F4中滴答定时器的时钟来源已经确定来自于AHB总线)TICKINT当Systick计数被减到0这个时刻发起中断请求(类似于51的定时器) 中断哪里会详细介绍 ENABLE就是使能定时器 不使能时钟信号进不来
LOAD就是当VAL=0时系统自动重装的值
VAL就是当前存放的值
这个函数传入的参数是传入滴答定时器的时钟(来自于AHB总线的时钟 F1是72Mhz)传入的值就为72 然后把滴答定时器(sytick)的相关寄存器CTRL全部置为0(初始化)然后调用函数把输入的时钟值72分频/8 72/8=9 (第二行) 第三行 g_fac_us就被赋值为9 systick(72)/8=9
这个如何理解 就是1mhz就是1s计数1000000
记一次数就是1us 但是这个滴答定时器的时钟频率是9MHZ systick(72)/8=9 计数1就是 1/9000000 s 所以想要计数1us就要9 计数9次
这个9就是 systick(72)/8(调用函数 设立分频系数)=9 这个9就是这么来的 给到全局变量g_fac_us
第一行就是创建一个变量temp来获取滴答定时器寄存器CTRL的值 然后nus就是你传入的值(要及时多少毫秒)g_fac_us就是全局变量9 (1us要计数9次)LOAD寄存器被赋予要计数多少的值 (如要计数900us 就传入参数nus=900) 然后nusg_fac_us=8100 就是滴答定时器VAL的值位8100 一直减一 直到减到0就是计时了900us
第三行就是把寄存器VAL的值置为0 然后系统就自动重载值(从LOAD中取得)
第四行就是时钟使能
进入do while语句 temp为寄存器的值(一整个寄存器的值 里面有很多位)如果不满足循环条件就一直执行
循环条件:这个寄存器CTRL的值的两个位第一位和第16位都要为1
然后失能 清空计时器
大致看看 要会用!!!
如何测试延时函数是否精准
打开一个工程 点击魔术棒
点击setting
在第二个红框输入系统时钟
让程序执行到断点的位置 右下角的t1就是到这个程序执行的时间 通过两个时间相减 就是延时了500ms