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의 초기화 코드가 일치하는 것을 발견할 수 있다.
// 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;
}
}
#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);
}
// 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;
}
}
#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);
}