stm32F407按键输入Sample

stm32核心板的第二个实验,因为板子、面包板、轻触开关等硬件原因,踩了几个坑,总算搞定了。

一、硬件

  1. stm32F407最小系统板
  2. 发光二极管
  3. 面包板
  4. 杜邦线

二、接口连接方式

  1. 板载LED:(原理图上显示板载的两个led等均上拉了一个电阻,因此是低电平才能点亮,但是系统里设置的是初始化输出为high高电平,因此是连接电源之后是不亮的。)
    1. LED0--PF9:GPIO output level设置为high
    2. LED1--PF10:GPIO output level设置为high
  2. 外部LED:(外部led是直接连接GPIO引脚,因此初始化后,根据电平高低,会点亮PF7,PF8因为设置的low,因此是不亮的。)
    1. LED3--PF7:GPIO output level设置为high
    2. LED4--PF8:GPIO output level设置为low
  3. 板载按键:
    1. KEY0--PE4:板子上下拉连接一个10k电阻,需要设置GPIO Pull down/Pull uppull down,高电平触发有效
    2. KEY_UP--PA0:需要设置GPIO Pull down/Pull uppull down,高电平触发有效
  4. 外部按键
    1. KEY_PF--PF6:外部按键上拉一个电阻,需要设置模式为GPIO Pull down/Pull uppull up,低电平触发有效。(这个按键是外购的,一般外购的轻触开关,基本都是上拉电阻,因此都是低电平触发有效
  5. 面包板连接
    1. 面包板两侧只有两个的是竖向联通
    2. 面包板中间的两块多导轨的,是横向联通的
    3. 这里一定要搞清楚面包板的联通方式,两侧和中间的联通方式不同,搞错了按键是无效的。

三、代码

将按键扫描封装为一个函数scanKeys()

void scanKeys() {
    //KEY0是下拉电阻,高电平触发
    //这个按键是按下去就转换电平信号,然后重设按键电平
    if(KEY0==GPIO_PIN_SET){
        HAL_Delay(100);
        if(KEY0==GPIO_PIN_SET) {
            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);
//            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8);
            while(KEY0==GPIO_PIN_RESET);
        }
    }
//KEY_UP是高电平触发
    //这个按键的模式是按键松开后,才转换输出电平型号,
    if(KEY_UP==GPIO_PIN_SET) {
        HAL_Delay(100);
        if(KEY_UP==GPIO_PIN_SET) {

//检测按键有没有松开
            while(KEY_UP==GPIO_PIN_SET);
            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
//            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_7);
        }
    }
//KEY_PF是上拉电阻,低电平触发,其他同KEY_UP
    if(KEY_PF==GPIO_PIN_RESET) {
        HAL_Delay(100);
        if(KEY_PF==GPIO_PIN_RESET) {

            while(KEY_PF==GPIO_PIN_RESET);
//            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
            //7:初始化高电平,通电灯即亮
            //8:初始化低电平,通电灯不亮
            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_7);
            HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_8);
        }
    }
}

四、注意事项

  1. 按键电阻的上拉、下拉方式,决定了触发电平信号的高低,这里核心板和外购的按键的模式就不同;
  2. 面包板的连接方式,这里折腾了我很久,不同区域的导轨联通方式是不同的;
  3. GPIO接口是否被占用,需要查看核心板的GPIO接口分配表,尽量选用完全独立的IO接口;
  4. 使用#define宏定义,代码美观好看,又容易理解;
  5. 这个例程的难点不是几行代码,而是GPIO接口、接口模式的选择和配置,尤其是使用了非板载的LED灯和按键。
  6. 记录一段关于上拉电阻和下拉电阻的注释:
    电源到器件引脚上的电阻叫上拉电阻,作用是平时使该引脚为高电平,地到器件引脚上的电阻叫下拉电阻,作用是平时使该引脚为低电平。
    上拉电阻的目的是为了保证在无信号输入时输入端的电平为高电平。而在信号输入为低电平是输入端的电平应该也为低电平。如果没有上拉电阻,在没有外界输入的情况下输入端是悬空的,它的电平是未知的无法保证的,上拉电阻就是为了保证无信号输入时输入端的电平为高电平,同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平
    

results matching ""

    No results matching ""

    results matching ""

      No results matching ""