香主,请教一个SysTick例程的问题:
/* SysTick end of count event each 1ms with input clock equal to 9MHz (HCLK/8, default) */
SysTick_SetReload(9000);
void SysTickHandler(void)
{
TimingDelay_Decrement();
}
也就是1ms计数一次,1ms进入一次中断?
我现在不想频繁进入中断,打算计数到20ms后进入一次中断,然后处理一些事务,应该怎么修改呢? Reload数值改成450?
只是想确认一下这个疑问
我只想确认一下是不是Reload改了之后进入中断的时间就是这个Reload。
比如:9000 是代表1ms进入一次SysTick中断,那么如果我改成180000 ,那应该是20ms进入一次SysTick中断,是不是呢?
SysTick,俺也有点迷糊
好像技术参考手册中没讲“SysTick”这个东东
Cortex-M3上讲了点点...
还不太清楚,有待试验...
香版主可否说说?
SysTick
:SysTick 是一
个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要
不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息 SysTick 定时器还可以用作闹钟,作为启动一个特定任务的时间依据。例如,如果需要
在 300 周期后执行一段代码,就可以在 SysTick 异常服务例程中设置执行那段代码的软件标
志。使用 SysTick 时,清零 CURRENT再编程 RELOAD 寄存器,以使它在 300 周期后产生异常,
如下述代码所演示:
LDR r0, =15
LDR r1, =SysTickAlarm ; SysTick异常服务例程为SetupExcpHanler
BL SetupExcpHandler ; 调用前面章节讲到的子程来建立向量
LDR R0, =0xE000E010 ; SysTick寄存器组的基地址
MOV R1, #0 ; 编程前先除能SysTick
STR R1, [R0]
STR R1, [R0,#0x8] ; 清零CURRENT
LDR R1, =(300-12) ; 设置装载值。减去12是为了补偿中延迟
STR R1, [R0,#0x4] ; 写入RELOAD
LDR R4, =SysTickFired ; 在RAM中的一个变量,指示是计时到期
MOV R5, #0 ; 初始为0
STR R5, [R4]
MOV R1, #0x7 ; 使用FCLK,使能SysTick,使能SysTick异常
STR R1, [R0] ; 启动计时
LDR R4, =SysTickFired
WaitLoop
LDR R5, [R4] ; 循环查询软件标志