STM32 경험 네 개의 학습 : GPIO 실험 - 기반 레지스터

를 기록, 읽기 - 미래 촉진하기 위해
시험 내용 : 천막은, 부저 및 키 입력
공식 정보 : "는 STM32 중국어 레퍼런스 매뉴얼 V10"제 8 장 일반 및 다중화 기능 IO (GPIO 및 AFIO가)
특징 : 비트 연산이 관련 포함되지 않습니다 초보자 친구 등록 조작하기위한 코드
도 원리 :
1)에 도시 된 바와 같이, 윤곽, PB5 다음 LED0, PE5 LEDl 후,
그림 삽입 설명 여기2)에 도시 된 바와 같이, 버저 후 PB8 음 (부저)
그림 삽입 설명 여기
(3) )에 도시 된 바와 같이, 다음쪽에 KEY0 PE4, PE3 다음 KEY1, KEY2 PE2 후 다음 PA0 WK_UP.
그림 삽입 설명 여기
작품 수 있는지 어떤 주변 장치 및 GPIO 핀 도킹을보고, 세부 사항으로하지 않습니다.
: 등록은 관련
.) 1를 RCC --APB2 주변 시계 등록 (RCC_APB2ENR), 오프셋 주소 사용 등록 : 0x18을 값을 재설정 : 0000 0000,
그림 삽입 설명 여기2) GPIO 레지스터 - 포트 구성 레지스터 저 (GPIOx_CRL) (X = A ... E), 오프셋 주소 : 0x00으로 리셋 값 : 0x4444 4444;
그림 삽입 설명 여기
그림 삽입 설명 여기
3) 포트 구성 레지스터 높은 (GPIOx_CRH) (X = A .... E) : 오프셋은 0x04, 리셋 값 : 0x4444 4444]
그림 삽입 설명 여기
. 4) GPIO 레지스터 - 출력 데이터 포트 (GPIOx_ODR)를 등록 (X = A ... E)은, 상기 어드레스 오프셋 : 0CH 리셋 값 : 0000 0000;
그림 삽입 설명 여기
5) 포트에 입력 된 데이터가 레지스터 (GPIOx_IDR) (X = A .... E), 오프셋 어드레스 :을 0x08, 리셋 값 : 0000 XXXX;
그림 삽입 설명 여기)
실험 절차 :
1) 새로운 프로젝트 템플릿;
2) 새 하드웨어 빈 폴더 (연결 폴더 USER)
MDK 소프트웨어 3), 새로운 led.c, beep.c 및 key.c 세 가지가 .c 파일과 주도 대응. 시간은 beep.h key.h와 헤더 파일은 폴더 하드웨어에 저장됩니다;
4) led.h 헤더 코드로 다음이다. :

#ifndef __LED_H
#define __LED_H
void LED_Init(void);
#endif

5) beep.h 헤더 코드는 다음과 같습니다 :

#ifndef __BEEP_H
#define __BEEP_H
void BEEP_Init(void);
#endif

6) key.h 헤더 코드는 다음이다 :

#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
void KEY_Init(void);
u8 KEY_Scan(u8);
#endif

7) led.c 파일의 코드는 다음과 같습니다 :

#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{
 RCC->APB2ENR|=1<<3;      //使能PORTB时钟      
 RCC->APB2ENR|=1<<6;      //使能PORTE时钟       
 GPIOB->CRL&=0XFF0FFFFF;  
 GPIOB->CRL|=0X00300000;  //PB5推挽输出,3对应二进制0011,即推挽输出模式,最大速率50MHz,     
  GPIOB->ODR|=1<<5;        //PB.5输出高             
 GPIOE->CRL&=0XFF0FFFFF;
 GPIOE->CRL|=0X00300000;  //PE.5推挽输出,3对应二进制0011,即推挽输出模式,最大速率50MHz,
 GPIOE->ODR|=1<<5;        //PE.5输出高 
}

8) beep.c 파일의 코드는 다음과 같습니다 :

#include "beep.h"
#include "stm32f10x.h"
void BEEP_Init(void)
{
  RCC->APB2ENR|=1<<3;          //使能PORTB时钟   
  GPIOB->CRH&=0XFFFFFFF0; 
   GPIOB->CRH|=0X00000003;      //PB.8推挽输出,3对应二进制0011,即推挽输出模式,最大速率50MHz,     
  GPIOB->ODR&=~(1<<8);         //PB.8输出低 
}

9) key.c 파일의 코드는 다음과 같습니다 :

#include "stm32f10x.h"
#include "key.h"
#include "delay.h"
void KEY_Init(void) //IO初始化
{ 
 RCC->APB2ENR|=1<<2;          //使能PORTA时钟  
 RCC->APB2ENR|=1<<6;          //使能PORTE时钟   
 GPIOA->CRL&=0XFFFFFFF0; 
 GPIOA->CRL|=0X00000008;      //PA0配置为下拉输入,8对应二进制1000,即输入,下拉要在ODR中设置
 GPIOE->CRL&=0XFFF000FF; 
 GPIOE->CRL|=0X00088800;      //PE2,PE3,PE4配置为输入模式,8对应二进制1000,即输入
 GPIOE->ODR|=7<<2;           //PE2,PE3,PE4配置为上拉输入
}
u8 KEY_Scan(u8 mode)
{  
 static u8 key_up=1;//按键按松开标志
 if(mode)key_up=1;  //支持连按    
 if(key_up&&(((GPIOE->IDR&0X0004)==0)||((GPIOE->IDR&0X0008)==0)||((GPIOE->IDR&0X0010)==0)||((GPIOA->IDR&0X0001)==1)))
 {
  delay_ms(10);//去抖动 
  key_up=0;
  if((GPIOE->IDR&0X0004)==0)return 1;
   else if((GPIOE->IDR&0X0008)==0)return 2;
  else if((GPIOE->IDR&0X0010)==0)return 3;
  else if((GPIOA->IDR&0X0001)==1)return 4;
 }else if(((GPIOE->IDR&0X0000)==0)&&((GPIOA->IDR==0X0000)==0))key_up=1;      
  return 0;// 无按键按下
}

10)이 MDK 소프트웨어에서 바로이 target1, 프로젝트 항목 관리를 클릭 ..., 프로젝트 항목 인터페이스, 그룹 열, 새로운 하드웨어 및 led.c에 beep.c 및 key.c 세 가지가 .c 파일에 와서 추가;
11)이 MDK 소프트웨어에 마법을 클릭이 (가) beep.h 및 key.h 세 개의 헤더 파일 (즉, 하드웨어), 디렉토리 led.h를 추가 할 수의 ... 올바른 경로를 포함을 클릭, C / C ++ 옵션에 지팡이;
(12) ) 새로운 main.c의 주요 기능은, 같은 다음과 같습니다 :

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
int main(void)
{
  vu8 key=0;
 delay_init(72);
 LED_Init();
  BEEP_Init();
 KEY_Init(); 
 while(1)
 {
    key=KEY_Scan(1);
      if(key)
  {         
   switch(key)
   {     
    case 4:
     GPIOB->ODR|=1<<8;         //PB.8输出高  
     break;
    case 3: 
    GPIOB->ODR&=~(1<<5);        //PB.5输出低       
     break; 
    case 2: 
    GPIOE->ODR&=~(1<<5);        //PE.5输出低
     break;
    case 1:                               
    GPIOB->ODR&=~(1<<5);        //PB.5输出低
    GPIOE->ODR&=~(1<<5);        //PE.5输出低 
     break;
   }
   delay_ms(100);                         //延迟1000ms
   GPIOB->ODR&=~(1<<8);      //PB.8输出低
   GPIOB->ODR|=1<<5;         //PB.5输出高
   GPIOE->ODR|=1<<5;         //PE.5输出高
  }                         
 }
}

13)이 완료되면 당신은 결과를 볼 수 실행할 수 있습니다.
지식 :
1) 학습 중국어 매뉴얼 STM32 다섯 개 레지스터가 참여,
2) 검토 key.c 파일 (U8) 논리 U8 KEY_Scan 기능은 참조 할 수있다 STM32 학습 경험 세 : GPIO 실험 - 기반 라이브러리 ;
3) 어떻게 새 프로젝트 템플릿을 검토, 참조 STM32 경험 II 학습 : 새로운 프로젝트 템플릿 .

게시 24 개 원래 기사 · 원 찬양 2 · 조회수 4129

추천

출처blog.csdn.net/Leisure_ksj/article/details/105074515