要移植UCOS的話,最先要把閃燈和串口給解決好,閃燈已經做好了,現在是串口了。
- 找到HAL庫文件中的如何使用這個Driver這一章。
- 在安裝目錄下面,找到STM32F4xx的模板,里面找到串口的中斷傳輸這個模板代碼。
- 讀模板代碼,將里面的初始化部分看一遍之后,結合第1步的介紹,慢慢將其移植到自己的代碼中間來。
- 注意里面有一個MSP初始化的部分,看了半天,理解就是這是一個針對具體板卡的初始化,以后再調用模塊初始化(ppp_Init)的時候,它再來調用這個(ppp_MspIit),也蠻有意思的。
- 一開始就出現問題,直接調到下面這個地方第10行(原startup_stm32f407xx.s文件第406行):
-
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 ;*******************************************************************************
-
- 結合以前的經驗發現,我好像並沒有設置中斷,后來仔細閱讀文檔,發現它這個中斷的調用機制是下面這樣的,如果還需要在中斷里面做點別的事情的話,則調用回調函數。
-
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 }
-
- 修改之后再試,嘗試了一下發送沒有問題,能夠每個0.5s發送一段文字。
- 但是接收的時候出問題了。我的代碼是這樣的
-
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 }
症狀表現如下:
-
- 會間斷性的向上位機發送0xFF,即使我沒有調用Transmit這個函數
- 如果直接運行的話,會不停的進這個回調Handler中斷,但是只要在USART1_Handler那個中斷這里斷一下之后,就不會再進了,即使我上位機開始發送。
- 這個問題折騰了我好久,症狀也不固定,中斷這個東西也不是很好調試,從單步,到慢慢刪代碼,到不停的查閱文檔和例程看有什么遺漏之處,最后被逼的對着參考手冊跟蹤寄存器。(其實一般的調試思路也都是這樣的吧)
- 接近3個小時的奮戰后,發現串口的CR2:CLKEN位總是會使能,這表示它進入的是同步串口模式,而我們電腦上用的都是異步串口啊。更詭異的是,反復翻閱文檔,都沒有找到這一位要用什么函數禁用掉!
- 最后很無語的發現,異步串口是UART,而我由於一直以來的習慣,直接調用的是USART,這個在很多地方都是不分的,比如USART1模塊,可以通過設置成同步的或者是異步的。但是這個HAL庫里面就分了,異步的必須使用UART庫!
- 修改之后問題解決,以上! 紀要!