天天看點

STM32F103個人學習基礎篇(1)STM32F103個人學習基礎篇(1)

STM32F103個人學習基礎篇(1)

  • 流水燈程式的寫法與詳解
  • 按鍵程式的寫法與詳解

流水燈程式的寫法與詳解

要制作一個流水燈程式,首先應該配置野火闆上相對應的引腳PG12~15(因為每個闆子都不同還是得找到闆子所對應的原理圖在進行配置),将他們選為輸出類型,在選擇configuration項進行PG12~15的配置(例如輸出高低電平,模式,速度的配置和使用者标簽的寫入)
STM32F103個人學習基礎篇(1)STM32F103個人學習基礎篇(1)
STM32F103個人學習基礎篇(1)STM32F103個人學習基礎篇(1)

其次就是使用者代碼的寫入,制作流水燈隻需要用到兩個.c檔案,一個是main.c檔案,另一個就是stm32f1XX-hal-gpio.c檔案。

打開stm32f1XX-hal-gpio.c檔案找到翻轉函數(翻轉函數就是将參數中對應的GPIO引腳不斷的來回置1和置0)

/**
  * @brief  Toggles the specified GPIO pin
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral 
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None
  */
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));

  GPIOx->ODR ^= GPIO_Pin;
}
           
接下來打開main.c檔案找到while循環(while(1)是一個死循環在裡面的函數會不斷的被調用和執行),因為要達到流水燈的效果是以還要添加一個HAL_Delay函數,而這個函數内的參數則是延遲的毫秒數(由個人定最好是幾百毫秒這樣效果比較明顯)
while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
        HAL_GPIO_TogglePin(GPIOG,LED1_Pin);
    HAL_Delay();
        HAL_GPIO_TogglePin(GPIOG,LED2_Pin);
    HAL_Delay();
        HAL_GPIO_TogglePin(GPIOG,LED3_Pin);
    HAL_Delay();
        HAL_GPIO_TogglePin(GPIOG,LED4_Pin);
    HAL_Delay();

  }
  /* USER CODE END 3 */

}
           

程式寫完之後進行編譯然後下載下傳到闆子上檢視流水燈效果

按鍵程式的寫法與詳解

要制作一個按鍵程式,首先應該配置野火闆上相對應的引腳PF8~PF11,将他們設定為輸入類型,再選擇configuration項進行PF8~PF11的配置(其中在上拉和下拉電阻選擇是選擇上拉電阻),為了更直覺的看到按鍵的效果,我們這裡做的是按鍵按下熄滅led燈的程式
STM32F103個人學習基礎篇(1)STM32F103個人學習基礎篇(1)
STM32F103個人學習基礎篇(1)STM32F103個人學習基礎篇(1)
uint16_t  key_dn=;(全局變量)
void HAL_SYSTICK_Callback(void)//滴答定時器的回調函數
{
  static uint16_t key_o=x0f00;//PF8~,老按鍵狀态key_o=
  uint16_t key_n=;//新按鍵狀态
  static uint8_t b=;//靜态檢測按鍵變量 
  if(++b>=)
  {
    if(HAL_GPIO_ReadPin(GPIOF,k1_Pin))
      key_n|=k1_Pin;
    if(HAL_GPIO_ReadPin(GPIOF,k2_Pin))
      key_n|=k2_Pin;
    if(HAL_GPIO_ReadPin(GPIOF,k3_Pin))
      key_n|=k3_Pin;
    if(HAL_GPIO_ReadPin(GPIOF,k4_Pin))
      key_n|=k4_Pin;
     key_dn=(key_n^key_o)&key_o;//當按鍵按下key_o為x0000是key_dn按鍵被按下的那位就會被指派為
     key_o=key_n;
     b=;
  }
 }
           
再main.c中找到while(1)循環, 在其中寫上按鍵按下的判斷語句以及按鍵按下後led的變化控制函數
while ()
  {
        if(key_dn)
        {
            if(key_dn&k1_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led1_Pin,GPIO_PIN_SET);
            }
                if(key_dn&k2_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led2_Pin,GPIO_PIN_SET);
            }
                if(key_dn&k3_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led3_Pin,GPIO_PIN_SET);
            }
                if(key_dn&k4_Pin)
            {
                HAL_GPIO_WritePin(GPIOG,led4_Pin,GPIO_PIN_SET);
            }
        }
}
           
寫完函數之後編譯下載下傳看到的效果應該是,剛開始led燈是全亮狀态,當對應按鍵按下後led燈也會熄滅

繼續閱讀