STM32

您所在的位置:网站首页 gpio管脚pa2初始化为输入模式的代码 STM32

STM32

2023-08-22 19:17| 来源: 网络整理| 查看: 265

目录

 

写在前面:

程序思路:

要用到的库函数:

LED.C

 LED.H

Key.c

Key.h

主函数

写在前面:

1        左边是STM322里电路每一个端口均可以配置的电路部分,右边部分是外接设备 电路图。

2        配置为 上拉输入模式的意思就是,VDD开关闭合,VSS开关断开。

               浮空输入模式的意思就是,VDD开关断开,VSS开关断开。

               下拉输入模式的意思就是,VDD开关断开,VSS开关闭合。

3        在 按键控制LED灯亮灭 中,必须要求配置为上拉输入模式。在按键开k1断开,及不操作的时候,上拉输入模式有①VDD上拉电阻将引脚电平上拉,保证了不会出现浮动的现象。

配置好了上拉输入模式,②VSS开关就已经断开了,下拉 通过K1按键开关的通断来实现的。所以在这种方式下,按下K1为低电平,松开K1位高电平。

4     如果外部元件如下图加上一个电阻R1(下图),就可以将端口 配置为浮空模式。R1电阻充当了上拉模式中的①VDD的作用。

   

程序思路:

LED主文件,头文件

按键主文件,头文件

主程序调用

要用到的库函数:

初始化程序。

RCC_APB2PeriphClockCmd    :使能或者失能APB2外设时钟。

GPIO_SetBits  :设置指定的数据端口位。置高1。

GPIO_ResetBits       :清除指定的数据端口位。置低0。

GPIO_ReadOutputDataBit     :读取指定端口管脚的输出。

GPIO_ReadInputDataBit                  :读取指定端口管脚的输入。

LED.C #include "stm32f10x.h" // Device header void LED_Init(void) //初始化 { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); //由于初始化后默认是为低电平,SetBits为了让端口置高。设定为了让LED开始是熄灭的状态。 } void LED1_ON(void) //LED1点亮程序 { GPIO_ResetBits (GPIOA, GPIO_Pin_1); } void LED1_OFF(void) //LED1熄灭程序 { GPIO_SetBits(GPIOA, GPIO_Pin_1); } void LED1_Turn(void) //状态取反。实现按下送开LED亮,按下送开LED熄灭 { if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0) { GPIO_SetBits(GPIOA, GPIO_Pin_1); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_1); } } void LED2_ON(void) //LED2点亮程序 { GPIO_ResetBits(GPIOA, GPIO_Pin_2); } void LED2_OFF(void) //LED2熄灭程序 { GPIO_SetBits(GPIOA, GPIO_Pin_2); } void LED2_Turn(void) //状态取反。 { if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0) //读取指定端口管脚的输出。If读取的管脚(GPIO_Pin_2)输出为0。 { GPIO_SetBits(GPIOA, GPIO_Pin_2); //就将GPIO_Pin_2置高(置1) } else { GPIO_ResetBits(GPIOA, GPIO_Pin_2); //否则置底(置0) } }  LED.H #ifndef __LED_H #define __LED_H void LED_Init(void); void LED1_ON(void); void LED1_OFF(void); void LED1_Turn(void); void LED2_ON(void); void LED2_OFF(void); void LED2_Turn(void); #endif Key.c #include "stm32f10x.h" // Device header #include "Delay.h" void Key_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //这里需要读取按键K1,用的上拉输入。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11; //K1按键引脚接在了,PB1和PB11两个接口上。 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } uint8_t Key_GetNum(void) //右键查询:uint8_t是typedef unsigned char { uint8_t KeyNum = 0; if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) //if判断按键1按下没有松手。 { Delay_ms(20); //消抖动 while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); //还没有松手,在while里面循环。 Delay_ms(20); //松手,跳出while,延时消抖动。 KeyNum = 1; //按键1返回1 } if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0) //if判断按键2按下没有松手。 { Delay_ms(20); while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0); Delay_ms(20); KeyNum = 2; } return KeyNum; }

if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)

        uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);这个函数是用来读取输入寄存器(图)某一个端口的输入值的

        uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); 这个函数是用来读取整个输入寄存器的,返回值是一个16位的数据,每一位代表一个端口值

        uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); 这个函数是用来读取输出寄存器(图)某一个端口的输出值的,用来看一下自己输出了什么

        uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); 这个函数是用来读取整个输出寄存器的,返回值是一个16位的数据,每一位代表一个端口值。

按下按键一端接B1端口,按键按下为低电平,if 判断 当B1端口为低电平时(按下按键),消抖之后返回值,返回1 LED1 亮起,返回2 LED2亮起。

Key.h #ifndef __KEY_H #define __KEY_H void Key_Init(void); uint8_t Key_GetNum(void); #endif 主函数 #include "stm32f10x.h" // Device header #include "Delay.h" #include "LED.h" #include "Key.h" uint8_t KeyNum; int main(void) { LED_Init(); Key_Init(); while (1) { KeyNum = Key_GetNum(); //将 Key_GetNum() 返回值给KeyNum if (KeyNum == 1) { LED1_Turn(); } if (KeyNum == 2) { LED2_Turn(); } } }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3