单片机学习小组
直播中

王强

7年用户 1341经验值
私信 关注

如何使用STM32扩展板实现按键驱动?

树莓派和STM32之间如何连线?
如何使用STM32扩展板实现按键驱动?

回帖(1)

刘嵩

2022-1-17 11:33:27
前几天入了个树莓派3B+,之前用过树莓派zero  W觉得很方便,但是外围接口少了点。准备用3B+做个远程多路视频监控系统,现在还在熟悉树莓派的硬件和系统接口,后续会更新实现过程和原码。
树莓派里引出了40个pin,其中有8个引脚可以作为GPIO口使用。实验的主要功能就是验证树莓派中使用Python控制GPIO输入输出的功能。用户指南里用的是面包板插线的方法来进行实验的,我手上没有这些器件,但是有好几块单片机开发板,可以用这些单片机作为扩展板实现上面的实验。扩展板选的是个人比较喜欢的ST家的STM32L476VGT6G  Discovery开发板。
感谢Eben大牛做的贡献,让我们这些小白能以低廉的价格用到性能如此卓越的计算机。Eben大牛写的《Raspberry Pi用户指南》入门必备书籍,在这里分享给大家,还有一些树莓派书籍买板子送的:
《Raspberry用户指南》中文第3版:https://pan.baidu.com/s/19s9PDvrXWtu_eSl7GWPuRg       提取码:2gg2
                                       英文第4版:https://pan.baidu.com/s/1pP8PZPa2pPW9MuxcJOqGdQ    提取码:fa5v
其他书籍:链接:https://pan.baidu.com/s/1-27kV8ko4vH8FEd9vswpAg   提取码:66s7
实现流程: STM32板上的按键JOY_DOWN被按下后翻转LED4的状态,同时把和LED4连接的PB2引脚用杜邦线和树莓派上的GPIO12连接。树莓派上检测到GPIO12的状态改变就会打印一段信息到屏幕上。功能很简单,但是在第一次实验时还是遇到一些问题。
树莓派的引脚图:


从上图看到按照引脚标号顺序看第12引脚对应GPIO18,第32引脚对应GPIO12。


先看用户指南里给的demo:


import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.IN)
while True:
        input_value = GPIO.input(12)
        if input_value == False:
                print("The button has been pressed.")
                while input_value == False:
                        input_value = GPIO.input(12)
其中第2行定义的就是GPIO和引脚的对应关系,这里参考https://www.linuxhub.org/?p=629。所以BOARD模式使用的是物理引脚的定义,而BCM模式的引脚对应CPU上的GPIO。


下面再来看STM32板上的连线,板上的按键连接PA5引脚,而LED灯和PB2连接,这里把PB2和树莓派的第12 引脚相连。还要注意把STM32 板上的GND和树莓派的GND连接,使2者共地,否则会看不到结果。


树莓派和STM32的连线:







STM32实现的核心代码:


void Key_Scan(void)
{
  if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
    while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_SET);
  }
}
功能很简单,就是按键按下后翻转LED状态。


树莓派上的代码是检测到GPIO12状态改变后打印提示:


#!/usr/bin/env python

import RPi.GPIO as GPIO

#忽略警告信息,没有这句每次重新运行会提示警告
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.IN)
flag = GPIO.input(12)

#GPIO12状态改变后打印提示
while True:
    input_value = GPIO.input(12)
    if input_value == (not flag):
        print("The button has been pressed.")
        flag = not flag
上面运行后,每当STM32上的按键按下,树莓派就会打印“The button has been pressed.”,同时STM32板上的LED4翻转。




实验用其他单片机开发板也能实现,只要更改单片机的引脚就行。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分