廊坊電商網(wǎng)站建設(shè)2022年最火的關(guān)鍵詞
目錄
一、初始化GPIO口
二、按鍵點(diǎn)亮LED燈(輪詢法)
一、初始化GPIO口
1、點(diǎn)亮LED小燈前,需要先初始化GPIO口
HAL_GPIO_Init(GPIO_TypeDef ?*GPIOx, GPIO_InitTypeDef *GPIO_Init)
GPIO_TypeDef ?*GPIOx: //指初始化GPIO輸出口的第幾組
GPIO_InitTypeDef *GPIO_Init: //是一個(gè)結(jié)構(gòu)體指針typedef struct
{uint32_t Pin;? ? ? ? ? ?//GPIO輸出口第幾組的第幾根uint32_t Mode;? ? ? ? // 一個(gè)模式uint32_t Pull;? ? ? ? ? //電阻的上拉與下拉模式uint32_t Speed;? ? ? // 引腳的速度設(shè)置
} GPIO_InitTypeDef;
2、GPIO口初始化函數(shù)定義
void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0}; //定義一個(gè)結(jié)構(gòu)體變量/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE(); //打開GPIO口時(shí)鐘,GPIO口才可以使用__HAL_RCC_GPIOB_CLK_ENABLE(); //打開GPIO口時(shí)鐘,GPIO口才可以使用/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET); //指定某一個(gè)GPIO引腳輸出1或者0,GPIOB指GPIO口第B組,//GPIO_PIN_8指GPIO口B組的第八根,//GPIO_PIN_RESET指的是GPIO_PIN_8輸出低電平/*Configure GPIO pins : PB8 PB9 */GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; //設(shè)置GPIO輸出口的引腳GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽輸出;推挽輸出可以真正能真正的輸出高電平和低電平GPIO_InitStruct.Pull = GPIO_NOPULL; //既不上拉也不下拉電阻GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //引腳速度設(shè)置低速HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //初始化GPIO輸出口,GPIOB指GPIO的第B組,&GPIO_InitStruct是一個(gè)結(jié)構(gòu)體指針}
?3、指定某一個(gè)GPIO引腳輸出1或者0的函數(shù)
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)GPIO_TypeDef *GPIOx: 指GPIO輸出口的第幾組
uint16_t GPIO_Pin: 指GPIO輸出口第幾組的第幾個(gè)引腳
GPIO_PinState PinState:指的是GPIO第幾組的第幾個(gè)引腳輸出低電平還是高電平GPIO_PIN_RESET? ? ? 指定GPIO口輸出0(低電平)
GPIO_PIN_SET? ? ? ? ? ? 指定GPIO口輸出1(高電平)
4、推挽輸出與開漏輸出
GPIO_MODE_OUTPUT_PP; ? ?//推挽輸出;推挽輸出可以真正能真正的輸出高
GPIO_MODE_OUTPUT_OD ? // 開漏輸出;只能輸出低電平
5、翻轉(zhuǎn)函數(shù)(比如原來是低,調(diào)用此函數(shù)后就變成高)
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);GPIO_TypeDef *GPIOx: 指GPIO輸出口的第幾組
uint16_t GPIO_Pin: 指GPIO輸出口第幾組的第幾個(gè)引腳
二、按鍵點(diǎn)亮LED燈(輪詢法)
輪詢(Polling)模式:
每個(gè)外圍設(shè)備提供一個(gè)或多個(gè)狀態(tài)信息,CPU逐次讀入并測(cè)試各個(gè)外圍設(shè)備的狀態(tài)信息,若該外圍設(shè)備請(qǐng)求服務(wù)(請(qǐng)求交換信息),則為之服務(wù),然后清除該狀態(tài)信息。否則,跳過,查詢下一個(gè)外圍設(shè)備的狀態(tài)。各外圍設(shè)備查詢完一遍后,再返回從頭查詢起,直到發(fā)出停止命令為止。但是在查詢式I/O方式下,CPU要不斷地讀取狀態(tài)字和檢測(cè)狀態(tài)字,不管那個(gè)外圍設(shè)備是否有服務(wù)請(qǐng)求,都必須一一查詢,許多次的重復(fù)查詢,可能都是無用的,而又占去了CPU的時(shí)間,效率較低。
操作思路
輸入(按鍵):
KEY1:PA0
KEY2:PA1
輸出(LED燈):
LED1:PB8
LED2:PB9
1、讀取引腳的電平狀態(tài)、函數(shù)返回值為0或1
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)GPIO_TypeDef *GPIOx: 指GPIO輸入口的第幾組
uint16_t GPIO_Pin: 指GPIO輸入口的第幾組的第幾個(gè)引腳
2、自定義一個(gè)按鍵點(diǎn)亮LED燈Key_Scan函數(shù)
#define KEY_ON 0
#define KEY_OFF 1uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_RESET ){//按鍵按下的狀態(tài)while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_RESET); //防抖的作用return KEY_ON;}else{//按鍵松開的狀態(tài)return KEY_OFF;}
}
3、把Key_Scan放進(jìn)到main函數(shù)中
int main(void)
{HAL_Init(); //HAL庫函數(shù)初始化SystemClock_Config(); //系統(tǒng)時(shí)鐘初始化MX_GPIO_Init(); //GPIO初始化while (1){/* USER CODE END WHILE *///HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);if(Key_Scan(GPIOA,GPIO_PIN_0) == KEY_ON ){ //GPIO口的輸入口HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8); //翻轉(zhuǎn)電平函數(shù),GPIO口的輸出口,翻轉(zhuǎn)一次B8的電平}if(Key_Scan(GPIOA,GPIO_PIN_1) == KEY_ON ){ //GPIO口的輸入口HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); //翻轉(zhuǎn)電平函數(shù),GPIO口的輸出口,翻轉(zhuǎn)一次B9的電平}}
}
結(jié)果演示