STM32-hal库-流水灯-详细讲解

一、前言

本文是通过cubemx来配置rc8t6,一篇从配置到程序的完整代码,希望能够帮助到你学习stm32

二、开启程序        

1.首先我们先点开我们的cubemx,然后按照下图所示再次点击

f7309e86094645f988e149475977e18e.png

2.在接下来的页面选择我们的芯片型号,然后双击打开我们的芯片配置

6b37bea2725c4ab4889ff7ec4dec2376.png

  3.配置我们的rcc时钟和debug模式,右图是我将两个图形组合在一起、方便总体观看9b91196d9c9145eeb228f073b9eb27f0.png

4.接下来就是我们灯的配置,在此板上有八个led灯,我们可以直接配置我们的灯,然后将其点亮,我们点击我们的芯片引脚就可以进行配置,右图是我们判断是高电平亮,还是低电平亮,我们通过电路知识可以知道,给灯一个低电平就能够实现电路导通,从而让它亮起来,高低电平的配置在左图的GPIO output level                                

cd809f1bc35f4c6a8d09684fe96c7ae2.png

5.按键的配置,这里我们选择上拉电阻,同样也是根据原理图而选择的结构。

66128068d6a34fdc9db08cc294879fb6.png

6.由于本文没有涉及到时钟,所以也没有进行配置,下一步是配置我们的项目选择,按照下图配置完成后点击右上角的创建文件,后打开我们的keil5文件。

cc27774071de400b92762203b887d023.png

7.接下来是我们所用跑马灯代码

对于我们使用stm32来说,很重要的一点就是:看芯片引脚对应有什么功能

49191d267f91428d9c882ab6882ecfcd.png

8.点灯代码,我们的嵌入式其实也是用c语言来编写的,可以通过数组来编写我们的流水灯代码,这样我们的代码框架就不会那么臃肿,也会更加简洁

对于下图定义的数组b[],只是为了展示,可以使用数组来代替,并不是说都要使用数组

f6bc47c603ac4d3a814ca2b53667a10a.png

这个有个知识点就是关闭所有的灯,我们可以跳转到我们gpio的初始化设置,里面涵盖所有的引脚,也可以增加我们对stm32的理解

跑马灯演示视频

三、流水灯代码

45053603bba445a18466b6b9e0fd9995.png

上述是流水灯的代码,基本配置和跑马灯一样,之时程序不同

对于流水灯,其和上述所讲的跑马灯没有太大区别,只是亮灯的时间和亮灯的数量不同,我们可以看下面的代码,以及演示视频,就知道它是个什么样子,

流水灯

四、数值越界的情况

当我们使用数组,超出数组的容量的时候,就会出现一些奇怪的现象,所以我们在使用的时候要注意不要越界,这会导致程序的崩溃

数值越界情况

五、尾言

这里还是建议大家试试这些点亮灯的方式,毕竟只有自己尝试然后制作才知道自己会不会

如果觉得对你有所帮助,就请点个赞吧!

上述是如果有啥问题,请大佬点拨!

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 STM32-HAL 读取编码器时,如果出现读取到负数的情况,可能会导致程序卡死的问题。这是因为 HAL 默认使用的是 32 位定时器计数器,而编码器的计数器是一个 16 位的有符号整型,当计数器值达到 32767(0x7FFF)时,会变为负数,这会导致 HAL 出现异常。 为了解决这个问题,可以使用以下两种方法之一: 1. 使用 16 位定时器计数器 可以通过修改定时器的初始化配置,将其设置为 16 位计数器模式。这样可以保证计数器值始终为 16 位有符号整型,不会出现负数的情况。例如,对于 TIM2 定时器,可以使用以下代码进行初始化: ```c TIM_HandleTypeDef htim2; // ... htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 65535; // 设置为 16 位计数器模式 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { // 初始化失败 } if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) { // 启动失败 } ``` 2. 处理负数值 如果无法使用 16 位定时器计数器,可以在程序中对读取到的负数值进行处理。例如,可以将计数器值加上一个足够大的值,使其变为正数。具体的处理方法可以根据实际情况进行调整。以下是一个示例代码: ```c int16_t count = 0; uint32_t offset = 0x10000; // 偏移量为 65536 while (1) { count = __HAL_TIM_GET_COUNTER(&htim2); if (count < 0) { count += offset; } // ... } ``` 以上两种方法都可以解决读取编码器时出现负数导致程序卡死的问题,具体选择哪种方法应根据实际情况进行判断。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值