GPIO驱动程序-gpio点亮led-stm32

【实验目的】

学会编写GPIO驱动程序

【实验要求】

使用按键控制LED,第一次按下指示灯点亮,第二次按下指示灯熄灭,可重复;

【基本理论】

1、GPIO驱动程序编写方法

【实验内容】

1.编写GPIO输出驱动程序,控制LED指示灯;

2.编写GPIO输入驱动程序,读取按键值,并消除按键抖动;

3.编写控制逻辑程序,实现按键切换LED状态;

4.截取至少两个典型的控制寄存器状态截图,说明每一位的作用也当前值含义;

【实验步骤】

1、LED的GPIO初始化

  1. GPIO_InitTypeDef GPIO_InitStructure; 
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟 
  3. GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2 
  4. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入 
  5. GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
  6. //初始化 WK_UP-->GPIOA.0      下拉输入 
  7. GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0; 
  8. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉       
  9. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0

2、按键的GPIO初始化

  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);   //使能PB,PE端口时钟  
  2. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //LED0-->PB.5 端口配置  
  3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出  
  4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz  
  5. GPIO_Init(GPIOB, &GPIO_InitStructure);                   //根据设定参数初始化GPIOB.5  
  6. GPIO_SetBits(GPIOB,GPIO_Pin_5);                      //PB.5 输出高  
  7.   
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //LED1-->PE.5 端口配置推挽输出  
  9. GPIO_Init(GPIOE, &GPIO_InitStructure);                   //推挽输出 IO口速度为50MHz  
  10. GPIO_SetBits(GPIOE,GPIO_Pin_5);                          //PE.5 输出高

3、控制逻辑

  1. #include "sys.h"  
  2. #define LED0 PBout(5)  
  3. #define LED1 PEout(5)  
  4. #define Key0 PEin(4)  
  5. #define Key1 PEin(3)  
  6. #define Key2 PEin(2)  
  7.     while(1)  
  8.     {  
  9.         if(Key1 == 0)  
  10.         {  
  11.             delay_ms(5);      
  12.             while( !Key1 ){} //消抖             
  13.          LED0 =~ LED0;  
  14.          LED1 =~ LED1;    
  15.         }  
  16.       
  17.     }  

按键消抖,在按下微动后,由于按键拨片金属的物理特性出现抖动,第一次抖动通过延时5ms消除,通过while函数一直等待按键松开,在按键松开后,由于需要执行程序,不会立即再次读取,在此状态下可以忽略第二次消抖,在此省略延时消抖,可以提高单片机的响应速度。

使用正点原子官方库文件sys.h,使用位带操作来简化操作逻辑与操作步骤。位带控制代码如下:

  1. #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出   
  2. #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入   
  3. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出   
  4. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入   
  5. #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出   
  6. #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入   
  7. #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出   
  8. #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入   
  9. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出   
  10. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入  
  11. #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出   
  12. #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入  
  13. #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出   
  14. #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

4、GPIO控制状态器状态观察

在按键被触发后,通过观察可以发现GPIOB控制寄存器中IDR与ODR寄存器发生改变。

IDR:端口输入数据寄存器寄存器。

是用来读取当前端口的电平状态,低16位(0~15)每一位对应每一个端口。

数据由FAD3变为FAF3即为1111 1010 1101 0011->1111 1010 1111 0011

可见第三组1101变化为1111,也就是GPIO_PIN_5发生改变,对应LED1。

ODR:端口输出数据寄存器。

用来设置当前端口的电平状态,低16位(0~15)每一位对应每一个端口。

显而易见由0x00000010->0x00000030,也就是0001->0011,即打开P5输出。

CRL:端口配置低位寄存器

CRH:端口配置高位寄存器

CRL与CRH复位地址均为0x44444444,可以发现CRH并未配置,CRH对应高组寄存器也就是8~15,也就复位值。

CRL则由复位地址转化为0x4438444,修改的为GPIO_B项,对应第五第六位。

配置项为MODE与CNF,对应3与8,其中3对应typedef enum中的第三个50MHz;8对应0x1000,就是输出模式,GPIO_Mode_Out_PP = 0x10。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值