在线时间74 小时
UID3323317
注册时间2016-10-25
NXP金币120
TA的每日心情 | 慵懒 2019-7-22 13:56 |
---|
签到天数: 38 天 连续签到: 1 天 [LV.5]常住居民I
金牌会员
 
- 积分
- 1820
- 最后登录
- 2020-10-13
|
本帖最后由 邹姆斯特朗 于 2016-11-16 15:54 编辑
软件平台:keil5.14
硬件平台:LPC824Lite
目的:认识M0+内核的SysTick定时器。
.
STC89C51
51里好像没有这个东西。
LPC824
SysTick能产生定时的中断,类似于心跳吧,可以作为系统的基时。它是一个 24 位的定时器,即一次最多可以计数 2^24 ( =16777216)个时钟脉冲。
其中主要配置的寄存器:
1、STK_VAL :前计数值寄存器,脉冲计数值被保存到里面,只能向下计数,每接收到一个时钟脉冲 STK_VAL 的值就向下减 1,直至 0。触发异常,就可以在中断服务函数中处理定时事件了。
2、STK_LOAD:重载寄存器,当 STK_VAL 的值被减至0 时,由硬件自动把重载寄存器 STK_LOAD中保存的数据加载STK_VAL,重新向下计数(填充值不能超过 2^24)。
3、STK_CTRL: SysTick 配置,只有三个控制位和一个标志位,包括时钟源选择、使能、停止等。
STK_CTRL的配置:
这是一个32位的寄存器,但我们只需要配置其中3位即可
0 bit:写1使能SysTick,写0停止
1 bit:写1允许SysTick中断
2 bit:写1选择系统时钟(30Mhz),写0选择1/2系统时钟(15Mhz)
现在编写一个SysTick定时翻转IO电平的程序,时钟源选择系统时钟(30Mhz),每两个tick之间间隔为1/30M 秒,30000个间隔,即是1ms的定时中断。中断服务函数为SysTick_Handler(void)。STK_CTRL的控制字0000 0000 0000 0111,即0x0007。
- /******************** Copyright(C) 2016, Lab1209 of UJN **********************
- * 文件名 :main.c
- * 描述 :SysTick实验
- *
- * 软件平台 :Keil5.14
- * 硬件平台 :LPC824
- *
- * 作者 :邹姆斯特朗
- * 修改时间 :2016/11/15
- * 补充 :
- ******************************************************************************/
- #include "peri_driver.h"
- #define IN 0
- #define OUT 1
- #define LOW 0
- #define HIGH 1
- /**************************************************************
- ** 名称 :SysTick_Handler(void)
- ** 描述 :SysTick中断服务函数
- ** 参数 :
- **
- ** 返回值 : 无
- ***************************************************************/
- void SysTick_Handler(void)
- {
- Chip_GPIO_PinToggleState(LPC_GPIO_PORT, 0, 17); //io电平翻转
- }
- /**************************************************************
- ** 名称 : main(void)
- ** 描述 : mian函数,SysTick初始化
- ** 参数 :
- **
- ** 返回值 : 无
- ***************************************************************/
- int main(void)
- {
- Chip_GPIO_Init(LPC_GPIO_PORT); //初始化GPIO外设
- Chip_GPIO_PinSetDIR(LPC_GPIO_PORT, 0, 17, OUT); //设置0.17脚方向为出
- Chip_GPIO_PinSetState(LPC_GPIO_PORT, 0, 17, LOW); //设置0.17脚输出高低电平
-
- SysTick->LOAD = 29999; //重装值,30M主频,tick之间间隔为1/30000000s,填充29999为定时1ms
- SysTick->VAL = 0;
- SysTick->CTRL |= 0x0007; //使能SysTick,系统时钟30M为时钟
-
- }
复制代码
|
|