一.原理分析
1.什么是SysTick?
查Cortex-M3 权威指南
SysTick(系统滴答定时器)是STM32芯片内的硬件计时器, 跟NVIC一样, 在ARM公司提供的内核中。
查Cortex-M3 编程手册
三个相关寄存器分别是:
STK_LOAD(重装载寄存器)
STK_VAL(当前值寄存器)
STK_CTRL(控制寄存器):规定时钟频率是(AHB)72Mhz,使能定时器,计数到零是失能定时器。
我想要一秒一个中断, 进行LED的状态切换, 怎么做?
答:72Mhz频率表示经历一个中断需要1/72000000秒, 我需要一个中断一微秒, 把1改成72。
二.程序分析
1.初始化LED
参考Led_Key.c
2.初始化SysTick
查库函数手册, 发现函数2~6都无法使用, 没有相关函数定义。
2.1.这时候得去内核找函数, 找到core_m3.h, 在1694行对SysTick_Config()的函数定义, 参数为时钟源(我这里设置成72, 表示中断时间是一微秒)
2.2.初始化完成后, SysTick就会工作。我们先关闭他,只要用到就开启。
怎么关闭?
关闭就置零, 所以用&运算。
直接给CTRL寄存器写0:用位操作~(1<<0)表示。
void SysTick_Configuration(void)
{while(SysTick_Config(72));
SysTick->CTRL &= ~(1<<0);
}
3.while(1):点亮熄灭LED+利用SysTick实现延时函数
3.1点亮熄灭LED:GPIO_WriteBit();
3.2 开启SysTick
3.3延时函数:定义全局变量, 规定进中断次数(我这里是一微秒进一个中断), 我把进中断次数设为1000000, 就表示延时一秒。当次数为零时, 延时结束!
3.4 关闭SysTick
宏
unsigned int TimingDelay;
延时函数
void Delay_us(unsigned int i)
{
TimingDelay = i;
SysTick->CTRL |= (1<<0);
while(TimingDelay);
SysTick->CTRL &= ~(1<<0);
}
进中断
void SysTick_Handler(void)
{
if(TimingDelay != 0)
TimingDelay--;
}
main()
SysTick_Configuration();
Led_Configuration();
while(1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4, Bit_SET);
Delay_us(1000000);
GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4, Bit_RESET);
Delay_us(1000000);
}
4.效果展示