【STM32】10.基于SysTick实现LED闪烁

一.原理分析

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.效果展示

[STM32]基于SysTick实现LED灯闪烁_哔哩哔哩_bilibili

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mark的游戏人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值