赞
踩
与固件库点亮LED相同,我们需要一个工程模板详情可以用看(1条消息) STM32固件库点亮LED灯_学c入门到入土的博客-CSDN博客
1、编程要点
1)使能GPIO端口时钟。
2)初始化GPIO目标引脚,并设置为输入模式(浮空输入模式)如果想要知道底层逻辑详情可以看(1条消息) STM32-GPIO外设详解_学c入门到入土的博客-CSDN博客。
3)编写简单测试程序,检测KEY按键的状态,实现按键控制LED 。
LED头文件
- #ifndef _LED_H_ //判断标号_LED_H_是否被定义,如果没有则#ifndef到#endif代码有效
- #define _LED_H_
-
- #include <stm32f10x.h>
-
- #define LED_GPIO_PORT GPIOA //LED的GPIO端口
- #define LED_GPIO_CLK RCC_APB2Periph_GPIOA //LED相对应的时钟端口开启
- #define LED_GPIO_PIN GPIO_Pin_0 //LED的GPIO引脚号
-
- void LED_GPIO_Config(void); //LEDGPIO端口初始化函数
-
- #endif
LED.C文件
- #include "led.h"
-
- void LED_GPIO_Config(void)
- {
- RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
- /*开启LED相关的GPIO外设时钟*/
-
- GPIO_InitTypeDef GPIO_InitStructure;
- /*定义一个GPIO_InitTypeDef类型的结构体*/
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- /*设置引脚模式为通用推挽输出*/
-
- GPIO_InitStructure.GPIO_Pin=LED_GPIO_PIN;
- /*选择要控制的引脚*/
-
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- /*设置引脚速率为50MHz*/
-
- GPIO_Init(LED_GPIO_PORT,&GPIO_InitStructure);
- /*调用库函数初始化GPIO*/
-
- }

KEY头文件
- #ifndef _KEY_H_ //判断标号_KEY_H_是否被定义,如果没有则#ifndef到#endif代码有效
- #define _KEY_H_
-
- #include <stm32f10x.h>
-
- #define KEY_GPIO_PORT GPIOB
- //KEY的GPIO端口
-
- #define KEY_GPIO_CLK RCC_APB2Periph_GPIOB
- //KEY相对应的时钟端口开启
-
- #define KEY_GPIO_PIN GPIO_Pin_0
- //KEY的GPIO引脚号
-
- #define KEY_ON 0 //不一定低电平就是按下,这样可以根据自己需要所更改
- //KEY按键状态:按下
-
- #define KEY_OFF 1
- //KEY按键状态:按键未按下
-
- void KEY_GPIO_Config(void);
- //KEY GPIO端口初始化函数
-
- void delay_ms(unsigned int ms);
- //延时函数
-
- uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
- /*功能:检查是否有按键被按下
- *输入参数1:GPIOx:具体的端口,x可以是(A~G)
- *输入参数2:GPIO_Pin:具体的端口:GPIO_Pin_x(x可以是0~15)
- *返回值:按键状态
- *KEY_ON:按键按下
- *KEY_OFF:按键未按下
- */
-
-
- #endif

KEY.C文件
- #include "KEY.h"
-
- void KEY_GPIO_Config(void)
- {
- RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
- /*开启KEY相关的GPIO外设时钟*/
-
- GPIO_InitTypeDef GPIO_InitStructure;
- /*定义一个GPIO_InitTypeDef类型的结构体*/
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
- /*设置引脚模式为浮空输入模式*/
-
- GPIO_InitStructure.GPIO_Pin=KEY_GPIO_PIN;
- /*选择要控制的引脚*/
-
- GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);
- /*调用库函数初始化GPIO*/
-
- }
- void delay_ms(unsigned int ms) //延时函数
- {
- unsigned int i,j;
- for(i=ms;i>0;i--)
- for(j=110;j>0;j--);
- }
- uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
- {
- /*检测按键是否被按下*/
- if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
- {
- /*按键去抖动*/ //如果你使用的是硬件有按键去抖处理那么这部分可以去掉
- delay_ms(50);
- /*再次确定按键是真的被按下去了*/
- if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
- {
- /*等待按键释放*/
- while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);
- return KEY_ON;
- }
- else
- return KEY_OFF;
- }
- else
- return KEY_OFF;
-
- }

main.C文件
- #include "led.h"
- #include "key.h"
-
- int main()
- {
- LED_GPIO_Config();
- //调用LED初始化函数
- KEY_GPIO_Config();
- //调用KEY初始化函数
-
- while(1)
- {
- //调用按键判断函数,使用固件库函数拉高LED引脚电平
- if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
- {
- GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);
- }
- //调用按键判断函数,使用固件库函数拉低LED引脚电平
- if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
- {
- GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);
- }
- }
- }

这个小程序就完了,没有什么特别介绍的,只是吧我们前面所学的知识组合了一下 这里面使用到了一个新的固件库函数
函数名 | GPIO_ReadInputDataBit() |
函数原型 | u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 读取指定端口引脚的输入 |
输入参数 1 | GPIOx:x可以是A,B,C,D,来选择GPIO外设 |
输入参数 2 | GPIO_Pin:待读取端口位 该参数可以取GPIO_Pin_x(x可以是0到15的任意组合) |
返回值 | 输入端口引脚值 |
函数基本原理就是读取GPIO-IDR(端口输入数据寄存器)的状态并进行返回值处理。
关注我下面我会继续更新GPIO外设输入输出的实际小程序,来帮助大家更好的理解GPIO外设的功能,后面还会更新STM32的所有特色外设。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。