GPIO | çº¢å¤æ¢æµ
å°è½¦ç循迹åè½å°±æ¯éè¿4è·¯çº¢å¤æ¢æµé»çº¿æ¥å®ç°ç
GPIO ç®ä»
GPIOå°±æ¯ä»STM32è¯çä¸å¼åºçå¼èï¼å¯ä»¥éè¿æé«/æä½çµå¹³çæ¹å¼ç®åç²æ´å°æ§å¶ï¼ä¹å¯ä»¥ä½¿ç¨TIMãUARTçç³»ç»èµæºæ§å¶ï¼ä¹å¯ä»¥æ£æµGPIO端å£çµå¹³çé«ä½æ¥å®ç°æ°æ®è¾å ¥ã
GPIOè¾åº--以ç¹äº®LED为ä¾
ç¼ç¨é¡ºåº
- 使è½GPIOç«¯å£æ¶é
- åå§åGPIOå¼è
- æ§å¶GPIOè¾åºé«ãä½çµå¹³
代ç åæ
1.å¨.hæä»¶ä¸ååºéè¦çGPIOçå®
ç¼ç¨æ¶ä½¿ç¨å®å®ä¹ä¾¿äºæé«ç¨åºçå¯ç§»æ¤æ§
æ¯ä¸ª.hæä»¶é½includeè¿ä¸ªå¤´æä»¶
#include "stm32f10x.h"
/* å®ä¹LEDè¿æ¥çGPIO端å£, ç¨æ·åªéè¦ä¿®æ¹ä¸é¢ç代ç å³å¯æ¹åæ§å¶çLEDå¼è */
#define LED1_GPIO_PORT GPIOC /* GPIOç«¯å£ */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOC /* GPIOç«¯å£æ¶é */
#define LED1_GPIO_PIN GPIO_Pin_2 /*LED1å¨C2ä¸*/
#define LED2_GPIO_PORT GPIOC /* GPIOç«¯å£ */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOC /* GPIOç«¯å£æ¶é */
#define LED2_GPIO_PIN GPIO_Pin_3 /*LED2å¨C3ä¸*/
/*ä¸¤ç§æ§å¶GPIOçµå¹³çå®å®ä¹æ¹æ³*/
/* ä½¿ç¨æ åçåºä»¶åºæ§å¶IO*/
#define LED1(a) if (a) \
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
else \
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2(a) if (a) \
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
else \
GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
//SetBits为é«çµå¹³ï¼ResetBits为ä½çµå¹³
/* ç´æ¥æä½å¯åå¨çæ¹æ³æ§å¶IO */
#define digitalHi(p,i) {p->BSRR=i;} //è¾åºä¸ºé«çµå¹³
#define digitalLo(p,i) {p->BRR=i;} //è¾åºä½çµå¹³
#define digitalToggle(p,i) {p->ODR ^=i;} //è¾åºåè½¬ç¶æ
/* å®ä¹æ§å¶IOçå® */
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_HI digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_LO digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_HI digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_LO digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
//å¨å®é
使ç¨ä¸ä¹å¯ä»¥æ ¹æ®å¼åæ¿LEDå®é
亮çæéçµå¹³æ
åµå®ä¹ä¸ºLED1_ON.LED1_OFF
2.å¨.cæä»¶ä¸ç¼åGPIOåå§å彿°
void LED_GPIO_Config(void)
{
/*å®ä¹ä¸ä¸ªGPIO_InitTypeDefç±»åçç»æä½*/
GPIO_InitTypeDef GPIO_InitStructure;
/*å¼å¯LEDç¸å
³çGPIOå¤è®¾æ¶é*/
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK , ENABLE);
/*éæ©è¦æ§å¶çGPIOå¼è*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
/*设置å¼è模å¼ä¸ºéç¨æ¨æ½è¾åº*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置å¼èéç为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*è°ç¨åºå½æ°ï¼åå§åGPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*éæ©è¦æ§å¶çGPIOå¼è*/
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
/*è°ç¨åºå½æ°ï¼åå§åGPIO*/
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/* å
³éææledç¯ */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* å
³éææledç¯ */
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}
è¿ä¸ªåå§å彿°æ¯å©ç¨åºæä»¶åçï¼é¦å è¦æå¼GPIO端å£çæ¶éï¼ç¶ååGPIO_InitTypeDefç»æä½éå¡«å ¥æ³è¦é ç½®çç¸å ³ä¿¡æ¯ï¼æåç¨GPIO_Init()宿é ç½®
3.GPIO端å£ç8ç§å·¥ä½æ¨¡å¼
1ã4ç§è¾å ¥æ¨¡å¼
ï¼1ï¼GPIO_Mode_IN_FLOATING 浮空è¾å
¥
ï¼2ï¼GPIO_Mode_IPU 䏿è¾å
¥
ï¼3ï¼GPIO_Mode_IPD 䏿è¾å
¥
ï¼4ï¼GPIO_Mode_AIN 模æè¾å
¥
2ã4ç§è¾åºæ¨¡å¼
ï¼5ï¼GPIO_Mode_Out_OD 弿¼è¾åºï¼å¸¦ä¸ææè
䏿ï¼
ï¼6ï¼GPIO_Mode_AF_OD å¤ç¨å¼æ¼è¾åºï¼å¸¦ä¸ææè
䏿ï¼
ï¼7ï¼GPIO_Mode_Out_PP æ¨æ½è¾åºï¼å¸¦ä¸ææè
䏿ï¼
ï¼8ï¼GPIO_Mode_AF_PP å¤ç¨æ¨æ½è¾åºï¼å¸¦ä¸ææè
䏿ï¼
æå¸¸ç¨çå°±æ¯åä¸ç§è¾å ¥æ¨¡å¼ï¼æ ¹æ®å¤è®¾å®é æ åµèå®ï¼ï¼åå¤ç¨æ¨æ½è¾åºï¼é度å¤é50MHZå10MHZ
ç¼ç¨é¡ºåº
- 使è½GPIOç«¯å£æ¶é
- åå§åGPIOå¼è
- æ§å¶GPIOè¾åºé«ãä½çµå¹³
代ç åæ
1.å¨.hæä»¶ä¸ååºéè¦çGPIOçå®
ç¼ç¨æ¶ä½¿ç¨å®å®ä¹ä¾¿äºæé«ç¨åºçå¯ç§»æ¤æ§
æ¯ä¸ª.hæä»¶é½includeè¿ä¸ªå¤´æä»¶
#include "stm32f10x.h"
/* å®ä¹LEDè¿æ¥çGPIO端å£, ç¨æ·åªéè¦ä¿®æ¹ä¸é¢ç代ç å³å¯æ¹åæ§å¶çLEDå¼è */
#define LED1_GPIO_PORT GPIOC /* GPIOç«¯å£ */
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOC /* GPIOç«¯å£æ¶é */
#define LED1_GPIO_PIN GPIO_Pin_2 /*LED1å¨C2ä¸*/
#define LED2_GPIO_PORT GPIOC /* GPIOç«¯å£ */
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOC /* GPIOç«¯å£æ¶é */
#define LED2_GPIO_PIN GPIO_Pin_3 /*LED2å¨C3ä¸*/
/*ä¸¤ç§æ§å¶GPIOçµå¹³çå®å®ä¹æ¹æ³*/
/* ä½¿ç¨æ åçåºä»¶åºæ§å¶IO*/
#define LED1(a) if (a) \
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\
else \
GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2(a) if (a) \
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\
else \
GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
//SetBits为é«çµå¹³ï¼ResetBits为ä½çµå¹³
/* ç´æ¥æä½å¯åå¨çæ¹æ³æ§å¶IO */
#define digitalHi(p,i) {p->BSRR=i;} //è¾åºä¸ºé«çµå¹³
#define digitalLo(p,i) {p->BRR=i;} //è¾åºä½çµå¹³
#define digitalToggle(p,i) {p->ODR ^=i;} //è¾åºåè½¬ç¶æ
/* å®ä¹æ§å¶IOçå® */
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_HI digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_LO digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_HI digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_LO digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)
//å¨å®é
使ç¨ä¸ä¹å¯ä»¥æ ¹æ®å¼åæ¿LEDå®é
亮çæéçµå¹³æ
åµå®ä¹ä¸ºLED1_ON.LED1_OFF
2.å¨.cæä»¶ä¸ç¼åGPIOåå§å彿°
void LED_GPIO_Config(void)
{
/*å®ä¹ä¸ä¸ªGPIO_InitTypeDefç±»åçç»æä½*/
GPIO_InitTypeDef GPIO_InitStructure;
/*å¼å¯LEDç¸å
³çGPIOå¤è®¾æ¶é*/
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK , ENABLE);
/*éæ©è¦æ§å¶çGPIOå¼è*/
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
/*设置å¼è模å¼ä¸ºéç¨æ¨æ½è¾åº*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置å¼èéç为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*è°ç¨åºå½æ°ï¼åå§åGPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*éæ©è¦æ§å¶çGPIOå¼è*/
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
/*è°ç¨åºå½æ°ï¼åå§åGPIO*/
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/* å
³éææledç¯ */
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
/* å
³éææledç¯ */
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
}
è¿ä¸ªåå§å彿°æ¯å©ç¨åºæä»¶åçï¼é¦å è¦æå¼GPIO端å£çæ¶éï¼ç¶ååGPIO_InitTypeDefç»æä½éå¡«å ¥æ³è¦é ç½®çç¸å ³ä¿¡æ¯ï¼æåç¨GPIO_Init()宿é ç½®
3.GPIO端å£ç8ç§å·¥ä½æ¨¡å¼
1ã4ç§è¾å ¥æ¨¡å¼
ï¼1ï¼GPIO_Mode_IN_FLOATING 浮空è¾å
¥
ï¼2ï¼GPIO_Mode_IPU 䏿è¾å
¥
ï¼3ï¼GPIO_Mode_IPD 䏿è¾å
¥
ï¼4ï¼GPIO_Mode_AIN 模æè¾å
¥
2ã4ç§è¾åºæ¨¡å¼
ï¼5ï¼GPIO_Mode_Out_OD 弿¼è¾åºï¼å¸¦ä¸ææè
䏿ï¼
ï¼6ï¼GPIO_Mode_AF_OD å¤ç¨å¼æ¼è¾åºï¼å¸¦ä¸ææè
䏿ï¼
ï¼7ï¼GPIO_Mode_Out_PP æ¨æ½è¾åºï¼å¸¦ä¸ææè
䏿ï¼
ï¼8ï¼GPIO_Mode_AF_PP å¤ç¨æ¨æ½è¾åºï¼å¸¦ä¸ææè
䏿ï¼
æå¸¸ç¨çå°±æ¯åä¸ç§è¾å ¥æ¨¡å¼ï¼æ ¹æ®å¤è®¾å®é æ åµèå®ï¼ï¼åå¤ç¨æ¨æ½è¾åºï¼é度å¤é50MHZå10MHZ
GPIOè¾å ¥ ä»¥çº¢å¤æ¢æµä¸ºä¾
红å¤ä¼ æå¨ä½¿ç¨æ¹æ³
éè¿æ¥é 使ç¨è¯´ææè æ·å®è¯¦æ å¾ç¥ï¼å½çµæåº¦è°æ´æ£ç¡®æ¶ï¼å¨ç½è²å¤è¾åºä½çµå¹³ï¼LED亮ï¼å¨é»è²å¤è¾åºé«çµå¹³ï¼LEDçãæä»¥è®¾è®¡ç¨åºåºè¯¥è®¾ç½®GPIOä¸ºä¸æè¾å ¥ææµ®ç©ºè¾å ¥ï¼å³å½æ¢æµå°é»çº¿æ¶äº§çè¾å ¥ãè¿éæéæ©ä¸æè¾å ¥ï¼å ä¸ºä¸æè¾å ¥æ´éåè°æ´è¾å ¥å产ççå¨ä½å¯¹åºçå»¶è¿ã
å¦å¤ä½¿ç¨ GPIO_ReadInputDataBit(GPIOx_PORT,GPIOx_PIN) æ¥è¯»å䏿è¾å ¥ã
XUNJI.h éé¢çå®ä¹
//IN 1 2 3 4 - A12 A2 A4 A5
//循迹5å°±æ¯åé¢å£éççº¢å¤æ¢å¤´
#define XUNJI1_GPIO_CLK RCC_APB2Periph_GPIOA
#define XUNJI1_GPIO_PORT GPIOA
#define XUNJI1_GPIO_PIN GPIO_Pin_12
#define XUNJI2_GPIO_CLK RCC_APB2Periph_GPIOA
#define XUNJI2_GPIO_PORT GPIOA
#define XUNJI2_GPIO_PIN GPIO_Pin_2
#define XUNJI3_GPIO_CLK RCC_APB2Periph_GPIOA
#define XUNJI3_GPIO_PORT GPIOA
#define XUNJI3_GPIO_PIN GPIO_Pin_4
#define XUNJI4_GPIO_CLK RCC_APB2Periph_GPIOA
#define XUNJI4_GPIO_PORT GPIOA
#define XUNJI4_GPIO_PIN GPIO_Pin_5
#define XUNJI5_GPIO_CLK RCC_APB2Periph_GPIOC
#define XUNJI5_GPIO_PORT GPIOC
#define XUNJI5_GPIO_PIN GPIO_Pin_0
#define R1 GPIO_ReadInputDataBit(XUNJI1_GPIO_PORT,XUNJI1_GPIO_PIN)
#define R2 GPIO_ReadInputDataBit(XUNJI2_GPIO_PORT,XUNJI2_GPIO_PIN)
#define L2 GPIO_ReadInputDataBit(XUNJI3_GPIO_PORT,XUNJI3_GPIO_PIN)
#define L1 GPIO_ReadInputDataBit(XUNJI4_GPIO_PORT,XUNJI4_GPIO_PIN) // L1 L2 R2 R1
#define F1 GPIO_ReadInputDataBit(XUNJI5_GPIO_PORT,XUNJI5_GPIO_PIN)
é ç½®XUNJI.cï¼åå§åGPIO端å£ï¼å读åGPIOè¾å ¥å½æ°
void xunji_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( XUNJI1_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = XUNJI1_GPIO_PIN|XUNJI2_GPIO_PIN|XUNJI3_GPIO_PIN|XUNJI4_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//䏿è¾å
¥
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(XUNJI1_GPIO_PORT , &GPIO_InitStructure);
RCC_APB2PeriphClockCmd( XUNJI5_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = XUNJI5_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//䏿è¾å
¥
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(XUNJI5_GPIO_PORT , &GPIO_InitStructure);
}
void Read_xunji_Date(void)
{
L1;
L2;
R2;
R1;
F1;
}
å¨ main.c ä¸ï¼å¯ä»¥ç¨å¾ªç¯åifè¯å¥æ¥è¯»å红å¤ä¼ æå¨çå¼å¹¶ä½åºæä»¤
while(1)
{
Read_xunji_Date();
if(L1==0&&L2==1&&R2==1&&R1==0)//1ä¸ºæ¢æµå°é»çº¿ï¼0为ç½çº¿
{
Go();
delay_ms(100);
}
}
å ·ä½ç循迹æä»¤å¯ä»¥åèæºæä»¶
使¯ä¸»è¦æ¯è¦ç解循迹çé»è¾ï¼å ·ä½ç代ç è¿è¦æ ¹æ®å®é è·éè¿è¡ä¼å