調試STM32-HAL


要移植UCOS的話,最先要把閃燈和串口給解決好,閃燈已經做好了,現在是串口了。
  1. 找到HAL庫文件中的如何使用這個Driver這一章。
  2. 在安裝目錄下面,找到STM32F4xx的模板,里面找到串口的中斷傳輸這個模板代碼。
  3. 讀模板代碼,將里面的初始化部分看一遍之后,結合第1步的介紹,慢慢將其移植到自己的代碼中間來。
  4. 注意里面有一個MSP初始化的部分,看了半天,理解就是這是一個針對具體板卡的初始化,以后再調用模塊初始化(ppp_Init)的時候,它再來調用這個(ppp_MspIit),也蠻有意思的。
  5. 一開始就出現問題,直接調到下面這個地方第10行(原startup_stm32f407xx.s文件第406行):
    1.  1 I2C3_ER_IRQHandler
       2 OTG_HS_EP1_OUT_IRQHandler
       3 OTG_HS_EP1_IN_IRQHandler
       4 OTG_HS_WKUP_IRQHandler
       5 OTG_HS_IRQHandler
       6 DCMI_IRQHandler
       7 HASH_RNG_IRQHandler
       8 FPU_IRQHandler
       9 B .
      10 ENDP
      11 ALIGN
      12 ;*******************************************************************************
      13 ;UserStack and Heap initialization
      14 ;*******************************************************************************

       

     
  6. 結合以前的經驗發現,我好像並沒有設置中斷,后來仔細閱讀文檔,發現它這個中斷的調用機制是下面這樣的,如果還需要在中斷里面做點別的事情的話,則調用回調函數。
    1.  1 /**
       2 * @brief This function handles UART interrupt request.
       3 * @param None
       4 * @retval None
       5 * @Note This function is redefined in "main.h" and related to DMA stream
       6 * used for USART data transmission
       7 */
       8 void USART1_IRQHandler(void)
       9 {
      10 HAL_UART_IRQHandler(&huart);
      11 }

       

  7. 修改之后再試,嘗試了一下發送沒有問題,能夠每個0.5s發送一段文字。
  8. 但是接收的時候出問題了。我的代碼是這樣的
    1.  1 /**
       2 * @brief Rx Transfer completed callback
       3 * @param UartHandle: UART handle
       4 * @note This example shows a simple way to report end of IT Rx transfer, and
       5 * you can add your own implementation.
       6 * @retval None
       7 */
       8 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hsart)
       9 {
      10 uint8_t c ='a';
      11 /* Set transmission flag: trasfer complete*/
      12 UartReady= SET;
      13 // HAL_USART_Transmit_IT(husart, &c, 1);
      14 /* Turn LED4 on: Transfer in reception process is correct */
      15 HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);
      16 }

      症狀表現如下:

    1. 會間斷性的向上位機發送0xFF,即使我沒有調用Transmit這個函數
    2. 如果直接運行的話,會不停的進這個回調Handler中斷,但是只要在USART1_Handler那個中斷這里斷一下之后,就不會再進了,即使我上位機開始發送。
  9. 這個問題折騰了我好久,症狀也不固定,中斷這個東西也不是很好調試,從單步,到慢慢刪代碼,到不停的查閱文檔和例程看有什么遺漏之處,最后被逼的對着參考手冊跟蹤寄存器。(其實一般的調試思路也都是這樣的吧)
  10. 接近3個小時的奮戰后,發現串口的CR2:CLKEN位總是會使能,這表示它進入的是同步串口模式,而我們電腦上用的都是異步串口啊。更詭異的是,反復翻閱文檔,都沒有找到這一位要用什么函數禁用掉!
  11. 最后很無語的發現,異步串口是UART,而我由於一直以來的習慣,直接調用的是USART,這個在很多地方都是不分的,比如USART1模塊,可以通過設置成同步的或者是異步的。但是這個HAL庫里面就分了,異步的必須使用UART庫!
  12. 修改之后問題解決,以上! 紀要!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM