STM32实战演练:从基础GPIO到高级传感器控制的49个经典实验解析

1. 从点灯到通信:STM32入门四部曲

很多朋友拿到STM32开发板,看着密密麻麻的引脚和复杂的开发环境,第一反应就是“从哪儿开始?”。我刚开始玩STM32的时候也这样,感觉比51单片机复杂太多了。但后来我发现,只要抓住几个最核心、最基础的外设,把它们的操作流程摸透,后面的路就顺了。这就像学开车,先学会起步、刹车、转向,复杂的路况无非是这些基础操作的组合。对于STM32来说,GPIO(通用输入输出)定时器串口(UART)中断 就是你的“起步、刹车、转向”。下面我就结合几个最经典的实验,带你一步步上手,你会发现STM32其实没那么可怕。

1.1 实验1:你的第一个“Hello, World!”——LED闪烁

几乎所有嵌入式学习的第一个实验都是点亮LED,这可不是因为它简单,而是因为它能帮你打通从代码到硬件的整个流程。实验要求是控制一个外接LED每隔3秒亮灭一次,同时在电脑上显示MCU的计时时间。这看似简单,实则包含了GPIO输出控制串口通信两个核心知识点。

第一步,硬件连接。 我建议你用STM32最小系统板,找一个空闲的GPIO口,比如PA5(很多板子的LED就接在这里)。LED的长脚(阳极)通过一个220欧姆或1k欧姆的限流电阻接到PA5,短脚(阴极)接GND。千万别忘了电阻,直接接上去电流太大可能烧坏LED甚至单片机引脚。串口部分,你需要一个USB转TTL模块,它的TX接STM32的RX(PA10),RX接STM32的TX(PA9),GND对GND。这是最基础的接线,一定要确保无误。

第二步,软件配置。 我用的是STM32CubeMX+HAL库,这对新手特别友好。新建工程,选好你的芯片型号。首先配置GPIO:找到PA5,设置为GPIO_Output模式,输出速度选Low就行(点灯用不到高速)。然后配置串口:找到USART1,模式选Asynchronous(异步通信),参数一般用默认的115200波特率、8位数据位、无校验、1位停止位。最关键的一步是打开串口全局中断,这样我们才能接收电脑发来的数据。最后配置一个定时器,比如TIM2,用来做3秒定时。计算一下,如果你的系统时钟是72MHz,预分频设为7200-1,那么计数器每增加1就是0.1毫秒。把自动重装载值设为30000-1,这样定时器溢出就是3秒。别忘了在NVIC设置里开启定时器中断。

第三步,写代码逻辑。 在生成的代码里,找到主循环while(1),这里我们先不做事,主要逻辑都在中断回调函数里写。首先,在HAL_UART_RxCpltCallback中断回调函数里,处理电脑发来的初始时间设置命令,并解析出小时、分钟、秒,设置给你的计时变量。然后,在HAL_TIM_PeriodElapsedCallback定时器中断回调函数里,每3秒进来一次,在这里用HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5)函数翻转PA5的电平,LED就闪烁了。同时,你需要维护一个软件计时器(比如几个全局变量hour, min, sec),每次中断除了点灯,还要让秒数加3,并处理进位。最后,通过HAL_UART_Transmit函数,将格式化好的时间字符串(比如"Time: 12:05:30\r\n")发送给电脑,你就能在串口助手上看到时间更新了。

这个实验踩过最大的坑就是中断优先级时间精度。如果串口中断和定时器中断打架,可能导致时间显示卡顿。通常把定时器中断优先级设得比串口接收中断低一点会更稳定。另外,单纯靠定时器中断做长时间定时会有累积误差,对于要求高的场合,可以用RTC(实时时钟),但入门阶段这个方案完全够用。

1.2 实验2与3:输入的艺术——按键与串口命令控制

点亮了LED,我们就要学会控制它。控制信号从哪里来?两个最直接的来源:物理按键和电脑指令。实验2让你用两个GPIO口模拟按键,根据四种组合控制三色灯(比如一个RGB LED)呈现四种流水灯效果。实验3则是通过电脑串口发送1、2、3、4四个数字来实现同样的控制。

先看实验2:GPIO输入与状态判断。 找两个GPIO口,比如PC13和PC14,设置为GPIO_Input模式。硬件上,每个引脚通过一个10k欧姆电阻上拉到3.3V(STM32内部通常也有上拉电阻可软件开启),同时接一个按键到GND。这样,按键没按下时,引脚读到高电平;按下时,读到低电平。代码里,你在主循环中不断用HAL_GPIO_ReadPin函数读取这两个引脚的状态,得到一个2位的二进制数(00, 01, 10, 11),正好对应四种情况。根据这四种状态,你去调用四个不同的流水灯函数。流水灯函数怎么写?其实就是控制RGB三个引脚按照特定顺序和延时进行亮灭。比如“模式一”是红灯流过去,接着绿灯,接着蓝灯;“模式二”是红绿蓝同时渐变(需要PWM,后面会讲)。这里的关键是消抖。机械按键按下瞬间会产生一段时间的抖动,可能被误读为多次按下。最简单的消抖方法是检测到电平变化后,延时10-20毫秒再读一次,如果状态不变才确认。更高级的做法是用定时器中断去扫描按键状态。

再看实验3:串口命令解析。 这在实际项目中太常用了,比如通过电脑调试器控制设备。配置好串口(实验1已做),在串口接收中断回调函数里,你将收到的字符(比如‘1’)存到一个缓冲区。通常我们会约定一个简单的协议,比如以换行符‘\n’作为命令结束标志。当收到结束符后,在主循环或专门的任务中解析这个缓冲区。如果内容是“1”,就调用流水灯模式一;是“2”就调用模式二,以此类推。这里比实验2高级的地方在于,命令可能不

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值