NUCLEO-F091RC 試驗

前言

在stm32系列單片機中, 最多能提供8個串口。
用STM32CubeMX看看, 8個串口的MCU都有哪些?
在這裏插入圖片描述
可以看到,只有STM32F091和STM32F098能提供8個串口.
有開發板支持的MCU只有STM32F091,那就選有官方工程加持的STM32F091.
STM32F091有2種開發板, 只是做個串口擴展的初步試驗,沒必要整猴貴的評估版,就弄塊NUCLEO板,管腳夠用就行。

前幾天,從x寶上訂的NUCLEO-F091RC到了。正好在家封閉開發,靜靜的繼續試驗。
準備看看STM32F091的細節問題,希望有個初步體會,不影響畫原理圖就好,程序等板子做回來,可以按步就班的寫.

Trace HW not present

用STM32的MCU, 喜歡用ITM調試。

隨便打開一個串口工程 en.stm32cubef0\STM32Cube_FW_F0_V1.11.0\Projects\STM32F091RC-Nucleo\Examples\UART\E2_UART_TwoBoards_ComIT\MDK-ARM\Project.uvprojx

設置好MDK中的ITM選項。
在這裏插入圖片描述
單步運行彈出報錯 Trace HW not present(跟蹤硬件不存在)
“Trace HW not present” 的意思是 “Trace硬件不存在”
在這裏插入圖片描述
官方工程針對具體開發板寫的,都是沒錯的。
我只加了ITM設置,那就是ITM設置引起的問題。
看報錯提示,像是TRACE功能不支持的樣子。
在動過設置的官方工程上,去掉ITM設置,再單步正常了。

驗證F091是否提供SWO管腳

打開STM32CubeMX,新建一個STM32F091的工程。
先看看調試引腳
在這裏插入圖片描述
看到配置中,只有調試引腳,並不提供SWO引腳。
在這裏插入圖片描述
STM MCU的調試引腳都是PA13(SWDIO), PA14(SWCLK)
再看看支持SWO的MCU是引腳是咋定義的。
在這裏插入圖片描述
有TRACE功能的MCU, 會提供帶Trace功能的調試引腳定義。
在這裏插入圖片描述
可以看到,支持Trace功能的MCU, 會在PB3引腳上提供SWO功能。
看看F091的PB3引腳是否可以提供SWO功能。

在這裏插入圖片描述
可以看到F091的PB3沒有SWO功能。
爲啥官方不提供F091的SWO引腳呢,真費解.

NUCLEO-F091RC沒接主晶振

看到NUCLEO-F091RC開發板上沒有主晶振,難道和板載的ST-LINK用的一個主晶振?
結合板子上焊接的實際原件,PCB, 原理圖,看看主晶振是哪來的?
在這裏插入圖片描述
板子上R35, R37都沒焊, pin6是OSC_OUT上了擴展插座, 這個擴展插座上沒接東西。
pin5_PF0是OSC_IN, 網絡上接了2個元件SB55和SB50
SB55(通向擴展插座)沒焊接
在這裏插入圖片描述
SB50焊接了0R電阻,那來源就是MCO這個網絡。
在這裏插入圖片描述
跟着PCB走線從SB50跟到了STLINK板子的SB16
看到開發板上, SB16是焊接的。
在這裏插入圖片描述
那就等於主晶振來源於內建的ST-LINK板子的PA8
ST-LINK板子板子用的F103CB, PA8腳爲可以作爲RCC_MCO
在這裏插入圖片描述
到此,可以知道主晶振來自於內建的STLINK板子的晶振晶振輸出。

看看F091程序中,是使用的外部晶振還是內部晶振。

開始就以爲是用的STLINK板子的主晶振,看程序發現不是這樣的。

int main(void)
{
  /* STM32F0xx 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.
       - Low Level Initialization
     */
  HAL_Init();
  
  /* Configure the system clock to 48 MHz */
  SystemClock_Config(); // 時鐘配置

void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;
  
  /* Select HSI48 Oscillator as PLL source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;
  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; // 用的HSI,並沒有用外部晶振
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI48;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK)
  {
    /* Initialization Error */
    while(1); 
  }

  /* Select PLL as system clock source and configure the HCLK and PCLK1 clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1)!= HAL_OK)
  {
    /* Initialization Error */
    while(1); 
  }
}

看看時鐘配置圖,可以確認時鐘初始化這麼寫,確實用的HSI.
在這裏插入圖片描述
在這裏插入圖片描述
用CubeMX配出48MHZ主時鐘時,用HSI配不出來,最後CubeMX自己的方案是用HSI48.
看着這時鐘配置圖,再和官方程序中時鐘初始化代碼比對,可以知道,程序中用的是HSI48,沒用HSE.
晶振也沒倆錢,實際板子是不內建ST-LINK的。所以實際用的時候,還是用HSE.
官方demo這麼寫,是爲了說明使用HSI48精度也很高麼?

demo的多少問題

看到csdn上傳的一個demo說明中,說F091官方demo不多。
不知道是不是他用的時候不多啊。
ST官方板子的demo還是挺多的,要啥有啥。
在這裏插入圖片描述

總結

追究了上面2個問題後,隨便打開幾個demo工程單步了一下。
因爲demo工程都是HAL庫的,僅從代碼上,根本不知道自己是在用哪種ST的MCU, 也不知道是在用哪種HAL庫(M0,M3, M4, M7)。這就是HAL庫的好處。

用了用NUCLEO-F091RC, 跑了跑工程, 看了看原理圖, 感覺硬件連接上,和其他STMCU沒啥大區別。
就是沒有SWO用,有點遺憾。

剩下主要就是MCU固件的編寫,可以參照ST官方的demo, 需要哪個知識點,現學就趕趟。

F091RC的初體驗就到這吧。

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