STM32開發,HAL函數實現待機喚醒功能以及SVN使用簡介

1 概述

1.1 資源概述

開發板:正點原子STM32F103 Nano開發板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型號:STM32F103RBT6
正點原子開發板

1.2 實現功能

1,修改:將HAL官方例程工程PWR提出,driver對應的多餘文件進行刪除,形成一個獨立的工程包;
2,include路徑進行了重新定義;
3,LED(DS0)燈點亮5S,然後進入待機模式,按下KEYUP按鍵退出待機模式;
4,支持正點原子F103 nano開發板。

2 程序實現

2.1實現原理

待機模式的進入和退出條件如下表。
待機模式原理
芯片對應的PA00爲芯片的Wakeup功能鍵,對應正點原子wake
up按鍵。我們需要將此按鍵初始化這個功能即可。

2.2 程序源碼

在原官方例程上增加了LED2,用來指示單板是否進入了待機模式。LED2採用單板上的DS0。

int main(void)
{
  /* STM32F103xB HAL library initialization:
       - Configure the Flash prefetch
       - Systick timer is configured by default as source of time base, but user 
         can eventually implement his proper time base source (a general purpose 
         timer for example or other time source), keeping in mind that Time base 
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and 
         handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
     */
  HAL_Init();

  /* Configure the system clock to 64 MHz */
  SystemClock_Config();

  /* Configure the system Power 配置系統電源 */
  SystemPower_Config();
  
	  /* Check and handle if the system was resumed from Standby mode 確認系統是否從待機模式恢復*/ 
  if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
  {
    /* Clear Standby flag 如果恢復則清楚待機標誌位*/
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
  }

  
  /* -2- Configure IO in output push-pull mode to drive external LEDs初始化LED2燈,上電時點亮 */
  LED2_GPIO_CLK_ENABLE();
  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull  = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Pin = LED2_PIN;
  HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);
  HAL_GPIO_WritePin(LED2_GPIO_PORT,LED2_PIN,GPIO_PIN_RESET);
  
  /* Insert 5 seconds delay 延時5S*/
  HAL_Delay(5000);

 /* The Following Wakeup sequence is highly recommended prior to each Standby mode entry
    mainly when using more than one wakeup source this is to not miss any wakeup event.
     - Disable all used wakeup sources,
     - Clear all related wakeup flags, 
     - Re-enable all used wakeup sources,
     - Enter the Standby mode.
  */

  /* Disable all used wakeup sources: PWR_WAKEUP_PIN1 */
  HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);

  /* Clear all related wakeup flags*/
  __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  
  /* Enable WakeUp Pin PWR_WAKEUP_PIN1 connected to PA.00 使能PA00的喚醒功能*/
  HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

  /* Enter the Standby mode進入待機模式 */
  HAL_PWR_EnterSTANDBYMode();

  /* This code will never be reached!如果沒有進入待機模式則進入此循環 */
  while (1)
  {
	 /* Insert delay 500 ms */
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);  //用於檢測是否進入待機模式,若沒進入將500ms一次閃爍LED2燈 
   
  }
}

其中HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1)函數的作用是使能PWR_CSR的相關寄存器,用於使能喚醒按鍵的操作。
WKUP使能
HAL_PWR_EnterSTANDBYMode 函數則是對進入的條件寫了一遍

void HAL_PWR_EnterSTANDBYMode(void)
{
  /* Select Standby mode */
  SET_BIT(PWR->CR, PWR_CR_PDDS);

  /* Set SLEEPDEEP bit of Cortex System Control Register */
  SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk));

  /* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM)
  __force_stores();
#endif
  /* Request Wait For Interrupt */
  __WFI();
}

3 SVN簡介

SVN運行用戶將程序保存在雲端(第三方的服務器),方便使用者備份,回退版本,保存多個版本等,是一個非常好用的工具,我使用的是SVNBUCKET,免費版本提供100M的空間,對於STM簡單的例程是足夠用了。如果文件進行了修改,文件符號會出現一個問號,可以進行提交(傳到網上的服務器上),將服務器版本進行更新。假如改錯了,可以回滾到之前版本,而不用關心是否已經提交。還可以對提交的代碼進行比較。這裏不詳細介紹,可以在B站上找到介紹視頻。使用非常靈活。
SVN比較差異
下面是我在SVNBUCKET上提交的兩個項目,使用了3MB。當然對於自己開公司的或者重要大項目還是建議保存本地備份,以免SVN服務提供商哪天黃了或者跑路。
已經提交項目

4官方例程庫driver精簡

爲了充分利用SVN的100M,我對Driver文件夾進行了精簡,下面是精簡的文件夾結構,刪除掉多餘LL庫,第三方器件支持等
文件夾結構
BSP即爲Board support pack,文件夾下爲單板支持的一個頭文件和一個C文件
BSP
Device爲芯片平臺支持的文件夾,三個文件。
硬件支持文件
Hal_drive 文件夾即爲Hal函數的庫文件(函數聲明)和C文件(函數定義)。可以依據項目需要進行裁剪。
項目的.S文件放置工程文件夾中MDK_ARM中。最後精簡後的工程可以進行獨立編譯,大小僅爲5MB
.s文件
頭文件進行了重新指向,否則工程將會報錯,找不到目標文件。
頭文件重定向

5實驗結果

實驗結果在Nano板上實現,符合預期。
實驗結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章