STM32 Quick Initialization Quick Initialization Quick Initialization Quick 한 줄 코드로 Initialization Initialization 완료

21518 단어 STM32 팁

전언


평소 STM32를 개발할 때 초기화 스크립트와 자주 관련되어 빠른 초기화 스크립트 함수를 작성하여 각각 F1, F4에서 사용할 수 있으며sys.c 중

하드웨어 준비


STM32 개발 플랫폼

프로그램 설계


STM32F1 플랫폼의 경우:

//          sys.h
#define PA RCC_APB2Periph_GPIOA
#define PB RCC_APB2Periph_GPIOB
#define PC RCC_APB2Periph_GPIOC
#define PD RCC_APB2Periph_GPIOD
#define PE RCC_APB2Periph_GPIOE
#define PF RCC_APB2Periph_GPIOF
#define PG RCC_APB2Periph_GPIOG
#define PP    0x10
#define IPD   0x28 
#define IPU   0x48  
void FAST_INIT(u32 port,u8 pin,u8 mode);

//      sys.c
void FAST_INIT(u32 port,u8 pin,u8 mode)
{	
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(port, ENABLE);	 //      
 GPIO_InitStructure.GPIO_Pin = 1<<pin;	
 GPIO_InitStructure.GPIO_Mode = mode;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
 switch(port)
 {
	 case PA:GPIO_Init(GPIOA, &GPIO_InitStructure);break;
	 case PB:GPIO_Init(GPIOB, &GPIO_InitStructure);break;
	 case PC:GPIO_Init(GPIOC, &GPIO_InitStructure);break;
	 case PD:GPIO_Init(GPIOD, &GPIO_InitStructure);break;
	 case PE:GPIO_Init(GPIOE, &GPIO_InitStructure);break;
	 case PF:GPIO_Init(GPIOF, &GPIO_InitStructure);break;
	 case PG:GPIO_Init(GPIOG, &GPIO_InitStructure);break;
 }	
}

F1 사용 예: 초기화 LED:
#include "led.h"

void LED_Init(void)
{
	FAST_INIT(PB,5,PP);
	FAST_INIT(PE,5,PP);
	PBout(5)=1;
	PEout(5)=1;
}

예를 들어 키 초기화:
#include "stm32f10x.h"
#include "key.h"							    
//       
void KEY_Init(void) //IO   
{ 
 	FAST_INIT(PE,3,IPU);
	FAST_INIT(PE,4,IPU);
	FAST_INIT(PA,0,IPD);
}

STM32F4 플랫폼의 경우:

//          sys.h
#define PA RCC_AHB1Periph_GPIOA
#define PB RCC_AHB1Periph_GPIOB
#define PC RCC_AHB1Periph_GPIOC
#define PD RCC_AHB1Periph_GPIOD
#define PE RCC_AHB1Periph_GPIOE
#define PF RCC_AHB1Periph_GPIOF
#define PG RCC_AHB1Periph_GPIOG
#define PP    0x10
#define IPD   0x28 
#define IPU   0x48  
#define NP    0x00  
void FAST_INIT(u32 port,u8 pin,u8 mode);

//      sys.c
void FAST_INIT(u32 port,u8 pin,u8 mode)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(port, ENABLE);
	GPIO_InitStructure.GPIO_Pin = 1<<pin;
	switch(mode)
	{
		case PP:
		{
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//      
			GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//    
		}break;
		case IPU:
		{
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//      
			GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//  
		}break;
		case IPD:
		{
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//      
			GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//  
		}break;
		case NP:
		{
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//      
			GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
		}break;
	}
	switch(port)
 {
	 case PA:GPIO_Init(GPIOA, &GPIO_InitStructure);break;
	 case PB:GPIO_Init(GPIOB, &GPIO_InitStructure);break;
	 case PC:GPIO_Init(GPIOC, &GPIO_InitStructure);break;
	 case PD:GPIO_Init(GPIOD, &GPIO_InitStructure);break;
	 case PE:GPIO_Init(GPIOE, &GPIO_InitStructure);break;
	 case PF:GPIO_Init(GPIOF, &GPIO_InitStructure);break;
	 case PG:GPIO_Init(GPIOG, &GPIO_InitStructure);break;
 }	
	
}

F4 사용 예: 초기화 LED:
#include "led.h"

void LED_Init(void)
{
	FAST_INIT(PB,5,PP);
	FAST_INIT(PE,5,PP);
	PBout(5)=1;
	PEout(5)=1;
}

예를 들어 키 초기화:
#include "stm32f10x.h"
#include "key.h"							    
//       
void KEY_Init(void) //IO   
{ 
 	FAST_INIT(PE,3,IPU);
	FAST_INIT(PE,4,IPU);
	FAST_INIT(PA,0,IPD);
}

총결산


프로그램이 케이스로 이루어지는 기법은 결코 고급스럽지 않지만,,, 쓰기 좋다!또한 초기화는 이런 2차 봉인을 거친 후 프로그램의 이식성을 크게 증가시켰다는 장점이 있다.예를 들어 상기 두 플랫폼에서 LED, KEY의 초기화 코드가 일치하는 것을 발견할 수 있다.

좋은 웹페이지 즐겨찾기