STM32 experiencia de cinco aprendizaje: experimento GPIO - en base a la operación de bit

Grabarlo, leer - para facilitar el futuro
contenido de la prueba : Carpa, zumbador y un insumo clave
información oficial:
1) "el Manual de Referencia STM32 chino V10" Capítulo 8 General y las funciones de multiplexión IO (GPIO y Afio)
2) "la Cortex M3 guía definitiva (chino) "Capítulo operación 5 bits
características : operación de bit
de principio de la figura :
1) como se muestra, marquesinas, PB5 entonces LED0, PE5 entonces Ledl;
Aquí Insertar imagen Descripción
2) como se muestra, un zumbador, PB8 entonces BEEP (zumbador);
Aquí Insertar imagen Descripción
3) Como se muestra, PE4 entonces KEY0, PE3 entonces TECLA1, PE2 entonces TECLA2, PA0 entonces WK_UP.
Aquí Insertar imagen Descripción
Works no entrar en detalles, asegúrese de ver lo periféricos y GPIO de acoplamiento pasador.
funciones de biblioteca GPIO involucrados han aprendido :

1void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)//初始化作用

El nuevo conocimiento : Bit El cálculo de dirección:
Aquí Insertar imagen Descripción)
se supone que es un quinto pines de salida para GPIOA: Paout (5), y vista stm32f10x.h sys.h dos cabeceras encontrados:
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
De acuerdo con ello, GPIOA_ODR_Addr = 0x4001080C, n = 5 . Antes de fórmula púrpura en el código de clave de archivo de cabecera es única, la dirección del alias se puede calcular Paout (5) a.
Aquí Insertar imagen Descripción
Por lo tanto, la manipulación de bits puede hacer esto:
se define en el archivo de cabecera led.h:

#define LED0 PBout(5);

Led.c define en el archivo:

PBout(5)=0; //设GPIOB的第五管脚为低电平。

Por último, mencionar por qué es GPIOA_BASE + 12? mencionados desplazamientos de dirección manuales de referencia STM32 china, GPIOx_ODR son 0Ch, y por lo tanto es 12. En correspondencia, GPIOx_IDR compensado dirección es 0x08, por lo tanto 8. En cuanto a por qué el GPIOA_BASE igual APB2PERIPH_BASE + 0x0800, no encontró la respuesta, Daniel puede explicar.
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Procedimiento experimental :
1) plantilla de construcción nueva;
2) un nuevo hardware carpeta vacía (el usuario carpeta atada);
3) en el software MDK, el nuevo led.c, beep.c y key.c tres archivos .c y la correspondencia la led.h, beep.h key.h y archivos de cabecera se guardan en la carpeta HARDWARE;
código de cabecera 4) led.h son los siguientes.:

#ifndef __LED_H
#define __LED_H
#include "sys.h"
void LED_Init(void);    //初始化函数
#define LED0 PBout(5)   // PB5
#define LED1 PEout(5)   // PE5 
#endif

5) código de cabecera beep.h son como sigue:

#ifndef __BEEP_H
#define __BEEP_H
void BEEP_Init(void);   //初始化函数
#define BEEP PBout(8)   // PB8
#endif

6) código de cabecera key.h son como sigue:

#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
#define KEY0 PEin(4)    //PE4
#define KEY1 PEin(3)   //PE3 
#define KEY2 PEin(2)   //PE2
#define WK_UP PAin(0)  //PA0  WK_UP
void KEY_Init(void);
u8 KEY_Scan(u8);
#endif

7) código de archivo led.c son los siguientes:

#include "led.h"
#include "sys.h"
void LED_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure; 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能PB端口时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);  //使能PE端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;           //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);              //根据设定参数初始化GPIOB.5
 LED0=1;                                         //PB.5 输出高,LED0灭
 GPIO_Init(GPIOE, &GPIO_InitStructure);               //根据设定参数初始化GPIOE.5
 LED1=1;                                          //PE.5 输出高,LED1灭  
}

8) código de archivo beep.c son los siguientes:

#include "beep.h"
#include "sys.h"
void BEEP_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure; 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能PB端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;           //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);              //根据设定参数初始化GPIOB.5
 BEEP=0;                                          //PB8 输出低,LED0灭
} 

9) código de archivo key.c son los siguientes:

#include "key.h"
#include "sys.h"
#include "delay.h"
void KEY_Init(void) //IO初始化
{ 
 GPIO_InitTypeDef GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);    //使能PA,PE端口时钟
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;             //KEY0-KEY2
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;                                //设置成上拉输入
 GPIO_Init(GPIOE, &GPIO_InitStructure);                                       //初始化GPIOE2,3,4
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                                //PA0设置成输入,默认下拉   
 GPIO_Init(GPIOA, &GPIO_InitStructure);                                       //初始化GPIOA.0
}
u8 KEY_Scan(u8 mode)
{  
 static u8 key_up=1;                                                          //按键按松开标志
 if(mode)key_up=1;                                                            //支持连按    
 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
 {
  delay_ms(10);                                                              //去抖动 
  key_up=0;
  if(KEY0==0)return 1;                                                       //KEY0按下,即PE4为低电平
  else if(KEY1==0)return 2;                                                  //KEY1按下,即PE3为低电平
  else if(KEY2==0)return 3;                                                  //KEY2按下,即PE2为低电平
  else if(WK_UP==1)return 4;                                                 //WK_UP按下,即PA0为高电平
 }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;      
  return 0;                                                                    // 无按键按下
}

10) En el software MDK, Destino1 derecha, haga clic en el Manejo de Elementos de proyecto ..., en el Proyecto de interfaz de artículos, columna de Grupos, el nuevo hardware, y led.c, beep.c y key.c se añaden tres archivos .c a entrar;
11) en el software MDK, haga clic en la varita mágica en la opción C / C ++, haga clic en Incluir
el derecho de los Caminos ..., agregue el directorio led.h, beep.h y tres archivos de cabecera key.h (es decir, hardware);
12 ) Nueva función principal main.c, de la siguiente manera:

#include "led.h"
#include "beep.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
int main(void)
{
   vu8 key=0;
  delay_init();
    LED_Init();
    BEEP_Init();
   KEY_Init();
    while(1)
  {
   key=KEY_Scan(1);
      if(key)
    {        
       switch(key)
     {     
      case 4:
       BEEP=1;   //控制蜂鸣器叫   
       break;
      case 3: 
        LED0=0;     //控制LED0亮       
       break; 
      case 2: 
        LED1=0;     //控制LED1亮  
       break;
      case 1:                               
        LED0=0;     //控制LED0亮 
        LED1=0;     //控制LED1亮 
       break;
     }
     delay_ms(300);  //延迟300ms
     BEEP=0;         //控制蜂鸣器不叫
     LED0=1;         //控制LED0灭
     LED1=1;         //控制LED1灭
   }else delay_ms(10); 
  }
 }

13) Una vez finalizado se puede ejecutar para ver resultados.
El conocimiento :
1) operación de bit de aprendizaje Conceptos básicos;
2) revisar los archivos GPIO key.c y bibliotecas U8 KEY_Scan (U8) de funciones lógicas, de referencia puede STM32 experiencia de aprendizaje de tres: Experimento GPIO - bibliotecas basadas
y STM32 experiencia de aprendizaje de cuatro : GPIO experimento - basada registro
de cómo 4) revisión de nuevas plantillas de proyecto, la referencia STM32 experiencia de aprendizaje II: Nuevo proyecto de plantilla

Publicado 24 artículos originales · ganado elogios 2 · Vistas 4128

Supongo que te gusta

Origin blog.csdn.net/Leisure_ksj/article/details/105111870
Recomendado
Clasificación