这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
systick定时器实验_定时点亮led [2020/07/04 09:09] zgf |
systick定时器实验_定时点亮led [2022/03/22 10:17] (当前版本) sean |
||
---|---|---|---|
行 3: | 行 3: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-07-04 | gingko | 初次建立 | | | V1.0 | 2020-07-04 | gingko | 初次建立 | | ||
行 28: | 行 27: | ||
=== 1、时钟系统简介 === | === 1、时钟系统简介 === | ||
- | * (1)STM32时钟源分以下五类: | + | * 1、STM32时钟源分以下五类: |
* 内部高速时钟(HSI):RC振荡器,精度不高。 | * 内部高速时钟(HSI):RC振荡器,精度不高。 | ||
* 外部高速时钟(HSE):可接石英/陶瓷谐振器或者接外部时钟源。 | * 外部高速时钟(HSE):可接石英/陶瓷谐振器或者接外部时钟源。 | ||
行 35: | 行 34: | ||
* 锁相环倍环输出(PLL):其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频倍数 | * 锁相环倍环输出(PLL):其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频倍数 | ||
* 可调,但是其最大输出频率受限数值因芯片型号而异。 | * 可调,但是其最大输出频率受限数值因芯片型号而异。 | ||
- | * (2)系统时钟SYSCLK可来源于: | + | * 2、系统时钟SYSCLK可来源于: |
* HSI振荡器时钟 | * HSI振荡器时钟 | ||
* HSE振荡器时钟 | * HSE振荡器时钟 | ||
行 60: | 行 59: | ||
|2 |CLKSOURCE |R/W |0 |时钟源选择位:| | |2 |CLKSOURCE |R/W |0 |时钟源选择位:| | ||
|:::|:::|:::|:::|0 = AHB/8| | |:::|:::|:::|:::|0 = AHB/8| | ||
- | |||||1 = 处理器时钟AHB| | + | |:::|:::|:::|:::|1 = 处理器时钟AHB| |
- | |1 |TICKINT |R/W |0 |启用SysTick异常请求:| | + | |1|TICKINT|R/W |0 |启用SysTick异常请求:| |
- | |||||0 = 计时器数到0时没有异常请求。| | + | |:::|:::|:::|:::|0 = 计时器数到0时没有异常请求。| |
- | |||||1 = 计时器数到0时产生SysTick异常请求| | + | |:::|:::|:::|:::|1 = 计时器数到0时产生SysTick异常请求| |
- | |||||通过读取COUNTFLAG位可以确定计数器是否递减到0| | + | |:::|:::|:::|:::|通过读取COUNTFLAG位可以确定计数器是否递减到0| |
- | |0 |ENABLE |R/W |0 |SysTick定时器的使能位| | + | |0|ENABLE|R/W|0 |SysTick定时器的使能位| |
(2)LOAD重装载值寄存器 | (2)LOAD重装载值寄存器 | ||
行 74: | 行 73: | ||
* RELOAD值可以是0x00000001 - 0x00FFFFFF范围内的任何值。起始值可以为0,但是没有效果,因为SysTick异常请求和COUNTFLAG在从1到0计数时才被激活。重新装载值是根据其使用情况计算的。例如,要生成周期为N个处理器时钟周期的多次触发定时器,可以配置RELOAD值为N-1。如果每100个时钟脉冲需要SysTick中断,则将RELOAD设置为99。 | * RELOAD值可以是0x00000001 - 0x00FFFFFF范围内的任何值。起始值可以为0,但是没有效果,因为SysTick异常请求和COUNTFLAG在从1到0计数时才被激活。重新装载值是根据其使用情况计算的。例如,要生成周期为N个处理器时钟周期的多次触发定时器,可以配置RELOAD值为N-1。如果每100个时钟脉冲需要SysTick中断,则将RELOAD设置为99。 | ||
(3)VAL当前数值寄存器 | (3)VAL当前数值寄存器 | ||
- | |||
|位段 |名称 |类型 |复位值 |描述| | |位段 |名称 |类型 |复位值 |描述| | ||
行 84: | 行 82: | ||
|位段 |名称 |类型 |复位值 |描述| | |位段 |名称 |类型 |复位值 |描述| | ||
|31 |NOREF |R |0 |指示是否有参考时钟提供给处理器| | |31 |NOREF |R |0 |指示是否有参考时钟提供给处理器| | ||
- | |||||0:提供参考时钟| | + | |:::|:::|:::|:::|0:提供参考时钟| |
- | |||||1:不提供参考时钟| | + | |:::|:::|:::|:::|1:不提供参考时钟| |
- | |||||如果器件不提供参考时钟,SYST_CSR.CLKSOURCE标志位为1,不可改写。| | + | |:::|:::|:::|:::|如果器件不提供参考时钟,SYST_CSR.CLKSOURCE标志位为1,不可改写。| |
|30 |SKEW |R |1 |S指示TENMS的值是否精确| | |30 |SKEW |R |1 |S指示TENMS的值是否精确| | ||
- | |||||0:TENMS是精确值| | + | |:::|:::|:::|:::|0:TENMS是精确值| |
- | |||||1:TENMS不是精确值或者不提供| | + | |:::|:::|:::|:::|1:TENMS不是精确值或者不提供| |
- | |||||不精确的TENMS值可以影响作为软件实时时钟节拍器的适用性。| | + | |:::|:::|:::|:::|不精确的TENMS值可以影响作为软件实时时钟节拍器的适用性。| |
- | |||||23:0 |TENMS |R |0 |重新加载 10ms (100Hz) 计时的值, 受系统时钟偏差的错误。如果值读取为零, 校准值未知。| | + | |23:0 |TENMS |R |0 |重新加载 10ms (100Hz) 计时的值, 受系统时钟偏差的错误。如果值读取为零, 校准值未知。| |
==== 四、 实验程序 ==== | ==== 四、 实验程序 ==== | ||
行 209: | 行 207: | ||
* 以下是系统滴答定时器中断回调函数,每发生一次滴答定时器中断进入该回调函数一次,主要实现定时1s,改变一次标志位,使用LED显色状态变换一次。 | * 以下是系统滴答定时器中断回调函数,每发生一次滴答定时器中断进入该回调函数一次,主要实现定时1s,改变一次标志位,使用LED显色状态变换一次。 | ||
<code c> | <code c> | ||
+ | void HAL_SYSTICK_Callback(void) | ||
+ | { | ||
+ | // 中断时间1ms,每1ms进入中断一次 | ||
+ | static int counter = 0; | ||
+ | | ||
+ | if((counter ++ % 1000) == 0){ | ||
+ | systick.second_flag = 1; | ||
+ | } | ||
+ | } | ||
</code> | </code> |