STM32F767-Issue-UART傳送時出現亂碼

開發環境:MDK uVision V5.24.2.0
晶片廠商:ST (http://www.st.com)
晶片型號:STM32F767ZIT
相關文件:https://goo.gl/QL7tXR
問題描述:使用UART傳送字元時出現亂碼
晶片腳位:

時鐘架構圖:


問題處理方式與思維:
1.Confirm clock source
第一件重要的事情就是無庸置疑就是必須確認時鐘來源,在此就務必得花時間看一下schematic理面的物理配置,如下圖,這是STM官方所提供的開發板線路,可以看到SB8 & SB9都是open,SB149是close,所以這裡很清楚就是使用外部bypass mode的方式提供時鐘來源(直接使用示波器確認得知來源MCO為8Mhz)。

2. Setting HSE_VALUE
先仔細檢查時鐘源是由外部還是內部提供(一般都使用外部HSE),並且確定時鐘頻率,因本身是使用HAL庫做開發,第一步先檢查位於stm32f7xx_hal_conf.h內部的HSE_VALUE參數的值,是否與外部所提供的頻率相同(無論是8M還是25M),如果為25M的話,須把下方代碼8000000U改為25000000U
stm32f7xx_hal_conf.h
#if !defined  (HSE_VALUE)
#define HSE_VALUE    ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
3. Setting RCC_OscInitTypeDef
無論是使用External clock source 或是Internal clock source都須參考Reference manual RCC章節內部的HSE&LSE clock設定方式,如下圖


在這裡可以看到如果HSE是使用外部時鐘來源的話,就必須配置HSEBYP & HSEON這兩個暫存器,實際暫存器的位置可能會隨著晶片不同而有所差異,在這裡,將系統配置的狀態HSEState設置為如下,其他分頻系數在依照各自開發版定義設置,因為我的開發版型號是NUCLEO-F767ZI,所以m,n,p,q設置如下。
RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE; RCC_OscInitStructure.HSEState=RCC_HSE_BYPASS | RCC_HSE_ON;
RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;
RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;
RCC_OscInitStructure.PLL.PLLM=pllm;
RCC_OscInitStructure.PLL.PLLN=plln;
RCC_OscInitStructure.PLL.PLLP=pllp;
RCC_OscInitStructure.PLL.PLLQ=pllq;

結論:基本上STM32 UART傳送時會出現亂碼,第一步就是檢察系統時鐘,接下來檢察UART配置,有時候也有可能因為baud rate設定與terminal有所差異而導致亂碼。








留言