expérience d'apprentissage STM32 cinq: expérience GPIO - basée sur l'opération de bits

Enregistrer, lire - pour faciliter futur
contenu du test : Chapiteau, avertisseur sonore et une entrée clé
information officielle:
1) « le manuel STM32 chinois V10 Référence » Chapitre 8 général et aux fonctions de multiplexage IO (GPIO et afio)
2) « le Cortex- M3 Definitive Guide (chinois) « opération Chapitre 5 bits
caractéristiques : bit fonctionnement
principe de la figure :
1) Comme le montre, marquises, PB5 puis led0, PE5 puis Ledl;
Insérer ici l'image Description
2) Comme le montre, un avertisseur sonore, PB8 puis BEEP (buzzer);
Insérer ici l'image Description
3) Comme représenté, PE4 puis KEY0, PE3 puis KEY1, KEY2 puis PE2, PA0 puis WK_UP.
Insérer ici l'image Description
Works ne va pas dans les détails, assurez - vous de voir ce que les périphériques et docking broches GPIO.
bibliothèque de fonctions GPIO impliquées ont appris :

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

Les nouvelles connaissances : Le bit de calcul d'adresse:
Insérer ici l'image Description)
est supposé être un cinquième ordre des broches de sortie de GPIOA: PAout (5), et vue stm32f10x.h sys.h deux têtes Résultats: En
Insérer ici l'image Description
Insérer ici l'image Description
conséquence, GPIOA_ODR_Addr = 0x4001080C, n = 5 . Avant la formule pourpre dans le code clé de fichier d' en- tête est unique, l'adresse de l'alias peut être calculé PAout (5) a.
Insérer ici l'image Description
Par conséquent, la manipulation de bits peut faire ceci:
est défini dans le fichier d' en- tête led.h:

#define LED0 PBout(5);

Led.c défini dans le fichier:

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

Enfin, il est pourquoi GPIOA_BASE + 12? STM32 manuel de référence chinois mentionnés, les décalages d'adresse GPIOx_ODR sont 0Ch, et est donc 12. Correspondant, GPIOx_IDR adresse offset est 0x08, donc 8. Quant à savoir pourquoi le GPIOA_BASE égal APB2PERIPH_BASE + 0x0800, n'a pas trouvé la réponse, Daniel peut expliquer.
Insérer ici l'image Description
Insérer ici l'image Description
Procédure expérimentale :
1) nouveau modèle de construction;
2) Nouveau matériel dossier vide (le dossier USER lié);
3) dans le logiciel MDK, le nouveau led.c, beep.c et key.c trois fichiers .c et de la correspondance le led.h, beep.h key.h et les fichiers d' en- tête sont enregistrés dans le dossier HARDWARE, le
code d' en- tête 4) led.h sont les suivantes.:

#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) le code d'en-tête de beep.h sont les suivantes:

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

6) le code d'en-tête de key.h sont les suivantes:

#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) le code de fichier led.c sont les suivantes:

#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) le code de fichier beep.c sont les suivantes:

#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) Code de fichier key.c sont les suivantes:

#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) Dans le logiciel MDK, droit Target1, cliquez sur Gérer des éléments de projet ..., dans l' interface Éléments du projet, colonne Groupes, le nouveau matériel et led.c, beep.c et key.c trois fichiers .c sont ajoutés à venir;
11) dans le logiciel MDK, cliquez sur la baguette magique dans l'option de C / C, cliquez sur Inclure
le droit de ... les chemins, ajoutez le led.h annuaire, beep.h et key.h trois fichiers d' en- tête (c. -à -matériel);
12 ) Nouvelle fonction principale main.c, comme suit:

#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) Une fois que vous pouvez exécuter pour voir les résultats.
Connaissances :
1) Fonctionnement de base peu d' apprentissage;
2) examen GPIO fichiers key.c et bibliothèques U8 KEY_Scan (U8) des fonctions logiques, référence peut l' expérience d' apprentissage STM32 trois: GPIO Expérience - bibliothèques à base
et l' expérience d' apprentissage STM32 quatre : expérience GPIO - registre sur
la façon dont 4) examiner de nouveaux modèles de projets, référence expérience d' apprentissage STM32 II: Nouveau modèle de projet

Publié 24 articles originaux · a gagné les éloges 2 · Vues 4128

Je suppose que tu aimes

Origine blog.csdn.net/Leisure_ksj/article/details/105111870
conseillé
Classement