玩转STM32成为LED点灯大师(STM32F103C8T6)

这篇文章是入门嵌入式最最最基础的一部分,你想要入门嵌入式,首先得是个点灯大师,任何形势LED变化情况都难不倒你!!!!!!!

第一步:打开CubeMX

打开CubeMX,配置相关引脚

点击新建工程,输入芯片型号STM32F103C8T6,然后就可以进入到配置界面。

上图我们可以看到,我们首先需要配置时钟,serial wire(这个是配置下载器得接口的,如果没有配置sys,后果则是下载一次后,芯片就卡死了,不能再下载,只能刷机后才能重新下载,后期我还会更新如何解决此类问题)

,PC13为STM32F103C8T6的板载LED,点击PC13引脚,配置为GPIO_Output(输出模式),并配置引脚初始电平为高电平,开漏输出模式(温馨提示:开漏输出IO口给低电平量,给高电平灭)

第二步:生成文件开始写代码

打开工程,我们首先需要点击魔术棒,点击Debug,点击Settings,然后勾选Reset and Run,如果不勾选Reset and Run,我们没下载一次单片机,我们都需要复位一下,单片机才会执行你所下载的程序。

在代码中找到main文件,然后在main函数中的begin 与 end 之间写代码(因为只有在begin和end之间写代码才可以在重新配置引脚或者其他外设功能的时候,不被刷新点)

想要点亮板载LED,只需要记住一个接口函数:HAL_GPIO_WritePin();这个接口函数,第一个写入端口号,第二个写入端口号所对应的引脚,第三个写入则是端口号的电平设置。

我们这里设置的端口号为低电平,点亮板载LED。

下面我们来一个难一丢丢的,实现LED闪烁

我们使用了HAL_Delay(),这个HAL库自带的延时函数,这个函数是毫秒延时(小伙伴们需要注意),这里图中写了,每过1000ms == 1s就反转一次PC13引脚的电平,相当于每过1s点亮或熄灭一次LED。

上图的程序简单的为了闪烁LED,当然是最简单的方法了,但在实际写代码程序中,我们应该尽量避免在while里面加过大的延时,这样会阻塞掉我们其他想要及时运行的程序(上面我们写的代码为阻塞式写法)

下面我们来使用非阻塞试来实现LED的闪烁:(重难点)

下面我们使用定时器中断来实现LED非阻塞试闪烁!!!

配置定时器1,时钟源选择内部时钟,分频使用7分频,计数周期为999,下图我们使用的主频为8Mhz,分频7,则获得最后的给到的时钟周期为8/(7+1) = 1Mhz,1Mhz == 1us,我们设置的计数周期为999,则1us * (999 + 1) == 1ms,则我们每一个技术周期为1毫秒,当完成一次计数周期我们会触发一次更新中断,后面我们还会对其解释,继续往下看!!!

我们这里使用的主频默认8Mhz

点击NVIC Settings(中断设置),点击TIM1 update interrupt(定时器1更新中断),简单解释一下这个中断的含义,当计数周期(我们上面给的计数周期为999),当(计数值 > 计数周期),触发更新中断。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);//中断回调函数

我们先来介绍中断回调函数,这个函数就是当定时器触发中断的时候,就会执行这个函数。所以,我们只要在这个函数里面通过设置标志位就可以实现LED灯的闪烁。

在我们重新生成工程时候:别忘记了重新勾选一下Reset and Run,不然每次下载需要手动复位才可以正常运行。

下图:我们定义了一个标志位Flag,一个计数值count,因为我们设置的计数周期为999,每当进入一次中断回调函数的时候,单片机计数了999(也就是相当于1ms),所以当我们在中断回调函数中计数1000次(1000 * 1ms == 1s),那我们就得到了1s,然后使用if判断把count置0(这样就可以循环往复的实现1s翻转一次电平),Flag使用异或(异或类似于与或非,他的计算是(相同为0,不同为1)),举列一个0 和1异或,输出则为1。

我们使用Flag作为标志位在while循环里使用Flag进行LED的电平转换

上面则是比较常用的非阻塞式写法,下常见的图则是非阻塞式写法,且精度上没有上面两种好,感兴趣的小伙伴们也可以看看。

另外我提供另一个思路给小伙伴们留一个思考题,如何运用更新中断标志位来实现非阻塞式LED闪烁

需要使用到的接口函数:__HAL_TIM_GET_FLAG(),感兴趣的小伙伴们可以想想如何实现

小伙伴们对博客感兴趣的点点关注,点点赞哦,持续更新

总结,我们这篇文章学习了从单独点亮一个LED,到使用阻塞式点亮LED,到使用非阻塞试点亮LED。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值