를 기록, 읽기 - 미래 촉진하기 위해
시험 내용 : 천막은, 부저 및 키 입력
공식 정보 : "는 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 학습 : 새로운 프로젝트 템플릿 .