天天看點

STM32Cube HAL:GPIO輸入/輸出(一)

實驗内容:按鍵KEY1控制RGB燈顔色變換。

一、原理圖

STM32Cube HAL:GPIO輸入/輸出(一)
STM32Cube HAL:GPIO輸入/輸出(一)

二、 CubeMX配置

Step1. 打開 STM32CubeMX ,點選“ New Project ”,選擇晶片型号, STM32F103VETx 。

STM32Cube HAL:GPIO輸入/輸出(一)

 Step2.選擇時鐘源,并配置時鐘樹。選擇Crystal/Ceramic Resonator,并配置系統時鐘為72M。

STM32Cube HAL:GPIO輸入/輸出(一)
STM32Cube HAL:GPIO輸入/輸出(一)

Step3.配置SYS,我們這裡選擇的是Serial Wire。(正常情況配置不配置不影響,debug可以使用。但是你不可以把這兩個引腳用于其他複用功能,如果用于其他複用功能,debug就不起作用了。)

STM32Cube HAL:GPIO輸入/輸出(一)

 Step4.GPIO引腳配置,點選搜尋框,選擇相應的引腳。PB0/PB1/PB5  配置為GPIO_Output,PA0 配置為GPIO_Input。

STM32Cube HAL:GPIO輸入/輸出(一)

 KEY引腳配置:方框3 第一行是GPIO模式,這裡選擇輸入模式,第二行是選擇上拉還是下拉,這裡選擇既不上拉也不下拉,第三行是使用者标簽(可以自己給該引腳命名)。

STM32Cube HAL:GPIO輸入/輸出(一)

 RGB燈引腳配置:方框中 第一行是初始化引腳電平,(我的開發闆燈是低電平亮,是以初始化高電平),第二行是GPIO模式,這裡選擇推挽輸出,第三行是選擇上拉還是下拉,這裡選擇既不上拉也不下拉,第四行是IO口翻轉速度,這裡選擇低速,第五行是使用者标簽(可以自己給該引腳命名)。

STM32Cube HAL:GPIO輸入/輸出(一)

 Step5.Project工程設定,這個選項是配置工程重要的一個選項,其中配置的資訊也比較重要,且容易了解。

STM32Cube HAL:GPIO輸入/輸出(一)

  Step6.Project代碼生成配置界面。

STM32Cube HAL:GPIO輸入/輸出(一)

  Step7.Project進階配置界面。(一般情況下,采用預設配置即可)

STM32Cube HAL:GPIO輸入/輸出(一)

   Step8.點選“GENRATE CODE”生成代碼。

STM32Cube HAL:GPIO輸入/輸出(一)

三、添加功能代碼

按鍵掃描程式:

uint8_t KEY_SCAN(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==1)
	{
		while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==1);//松手檢測
		return 1;
	}
		return 0;
}
           

RGB燈控制程式:

uint8_t cnt=0;
	uint8_t value=0;
           
while (1)
  {
		value=KEY_SCAN(KEY_CTRL_GPIO_Port, KEY_CTRL_Pin);
		if(value==1)
		{
			switch(cnt)
			{
				case 0:
				{
				    HAL_GPIO_WritePin(GPIOB, LED_R_Pin,0);
				    HAL_GPIO_WritePin(GPIOB, LED_G_Pin,1);
				    HAL_GPIO_WritePin(GPIOB, LED_B_Pin,1);
				    cnt++;
				    break;
				}
				case 1:
				{
					HAL_GPIO_WritePin(GPIOB, LED_R_Pin,1);
					HAL_GPIO_WritePin(GPIOB, LED_G_Pin,0);
				    HAL_GPIO_WritePin(GPIOB, LED_B_Pin,1);
					cnt++;
				    break;
				}
				case 2:
				{
					HAL_GPIO_WritePin(GPIOB, LED_R_Pin,1);
					HAL_GPIO_WritePin(GPIOB, LED_G_Pin,1);
				    HAL_GPIO_WritePin(GPIOB, LED_B_Pin,0);
					cnt++;
				    break;
				}
				case 3:
				{
					HAL_GPIO_WritePin(GPIOB, LED_R_Pin,1);
					HAL_GPIO_WritePin(GPIOB, LED_G_Pin,1);
				    HAL_GPIO_WritePin(GPIOB, LED_B_Pin,1);
					cnt=0;
				    break;
				}
			}
					
		}

  }
           

繼續閱讀