天天看點

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼

  • 寫在前面
  • 時鐘樹
    • HSE振蕩器時鐘(高速外部時鐘信号)
      • HSE使用者外部時鐘(旁路模式)
      • HSE外部晶體/陶瓷諧振器
    • HSI振蕩器時鐘
    • PLL時鐘
    • LSE時鐘
    • LSI時鐘
    • 片内時鐘關系
  • CubeMX配置
    • LL庫內建
    • CubeMX關鍵配置
      • Port配置
      • 時鐘樹
      • Debug
      • 其他配置
  • CubeMX的整體感受

寫在前面

由于手裡暫時沒有GD32的闆子,隻有一個同系列的STM32,但是封裝不一樣,不能替換,公司的GD32不好拿來自己玩,鑒于GD32的目标就是完美替換STM32,是以,在我擁有GD32闆子之前,先就用STM32F103VE系列為例吧,如果遇見一些GD32的獨立問題,我會單獨寫出來。

關于STM32目前有四種開發方式,寄存器程式設計,固件庫程式設計,Hal庫程式設計,LL庫程式設計,下面是ST 中文官網上一篇《關于ST庫函數的代碼性能對比》的文章中對比了各種庫的性能的圖示:

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

寄存器程式設計無疑是最快的,但是開發難度較大,耗時較長,固件庫在公司就是玩這個,不想在家也玩這個,有點不思進取,HAL庫為了适配不同型号的移植,内部實作比較耗時,LL庫,開發速度較快,功能完善,還能用CubeMX快速生成初始化代碼,由于我之前一直用的英飛淩和NXP旗下的EB軟體,自己以前在公司裡也做過一款這樣的配置工具,是以對ST的CubeMX一直很感興趣,剛好趁這個機會玩一玩,于是果斷選擇LL庫,官網的資料也很豐富,下面我會先就時鐘樹原理和CubedMX的配置兩部分展開。

時鐘樹

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

時鐘一共有五種類型時鐘:

● HSI振蕩器時鐘

● HSE振蕩器時鐘

● PLL時鐘

● LSE時鐘

● LSI時鐘

其中可以用作系統時鐘源的有三種:HSI振蕩器時鐘,HSE振蕩器時鐘,PLL時鐘(藍色标記)

另外兩種時鐘:LSE時鐘,LSI時鐘隻能 用于特定外設,不能用于系統時鐘源(黑色标記)

HSE振蕩器時鐘(高速外部時鐘信号)

主要産生源為:

● HSE外部晶體/陶瓷諧振器

● HSE使用者外部時鐘

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

下面分别介紹:

HSE使用者外部時鐘(旁路模式)

(OSC_OUT必須為高阻态)
           

等于外部是一個完整的時鐘電路,可以直接輸出可供單片機内部使用的方波信号,也就是說不需要單片機内部整形電路參與,上電該電路便能直接産生需要的時鐘頻率信号,是以,單片機内部的内部整形電路應該被短路(旁路),是以在程式設計時,針對該時鐘電路需要用到CR寄存器中的HSEBYP和HSEON位。大緻軟體流程為:

LL_RCC_DeInit();
	/* Enable HSE oscillator */
	LL_RCC_HSE_EnableBypass();
	LL_RCC_HSE_Enable();
	while(LL_RCC_HSE_IsReady() != 1)
	{
	};
           

HSE外部晶體/陶瓷諧振器

這類時鐘由于諧振器+電容的形式隻能産生正弦波,是以要産生供單片機内部數字電路使用的方波時鐘,還需要使用單片機内部整形電路的參與,然後通過MCU去檢測時鐘是否穩定,待時鐘穩定之後,即在時鐘控制寄存器RCC_CR中的HSERDY位被硬體置’1’。時鐘才被釋放出來。如果在時鐘中斷寄存器RCC_CIR中允許産生中斷,将會産生相應中斷。大緻軟體流程為:

LL_RCC_DeInit();
	LL_RCC_HSE_Enable();
	while(LL_RCC_HSE_IsReady() != 1)
	{
	};
           

HSI振蕩器時鐘

HSI時鐘信号由内部8MHz的RC振蕩器産生,可直接作為系統時鐘或在2分頻後作為PLL輸入。HSI RC振蕩器能夠在不需要任何外部器件的條件下提供系統時鐘。它的啟動時間比HSE晶體振蕩器短。然而,即使在校準之後它的時鐘頻率精度仍較差。如果HSE晶體振蕩器失效,HSI時鐘會被作為備用時鐘源。大緻軟體流程為:

RCC->GCCR |= ((uint32_t)RCC_GCCR_HSIEN);
	
	  /* Wait till HSE is ready and if Time out is reached exit */
	  do
	  {
		HIEStatus = RCC->GCCR & RCC_GCCR_HSISTB;
		StartUpCounter++;  
	  } while((HIEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));
		
		if ((RCC->GCCR & RCC_GCCR_HSISTB) != RESET)
	  {
		HIEStatus = (uint32_t)0x01;
	  }
	  else
	  {
		HIEStatus = (uint32_t)0x00;
	  }  
           

PLL時鐘

根據時鐘樹來看,PLL時鐘的時鐘源有兩個,分别是HSI時鐘二分頻之後傳入或者HSE時鐘經PLLXTPRE不分頻或者二分頻之後傳入,兩種時鐘源的選擇是通過PLLSRC位決定,然後通過倍頻後作為PLL時鐘輸出。大緻軟體流程為:

/* Main PLL configuration and activation */
	  LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_9);
	  LL_RCC_PLL_Enable();
	  while(LL_RCC_PLL_IsReady() != 1)
	  {
	  };
           

LSE時鐘

LSE晶體是一個32.768kHz的低速外部晶體或陶瓷諧振器。它為實時時鐘或者其他定時功能提供一個低功耗且精确的時鐘源。目前沒有用過該時鐘源,是以無相關經驗,資料手冊說明,該模式隻能工作在旁路模式下。

LSI時鐘

該時鐘是一個内部低速時鐘,主要用于獨立看門狗的時鐘參考,以保證在主時鐘失效的情況下,看門狗依舊可以正常工作,在使用看門狗之前,必須将此時鐘使能并等他在穩定狀态。軟體大緻流程為:

/****************IRC40K Enable***************/
	  RCC_LSI_Enable(ENABLE);
	  /* wait till IRC40K is ready */
	  while((RCC->GCSR & RCC_GCSR_LSISTB) != RCC_GCSR_LSISTB)
	  {
		
	  }
           

片内時鐘關系

在主時鐘産生之後,通過各鐘預分頻配置,最終得到各個外設需要的時鐘參考,其中主要的預分頻器有:AHB,APB1,APB2。AHB時鐘主要是多系統時鐘的倍頻操作,以便後面經過APB1或者APB2分頻或者倍頻之後,能産生更多類型的時鐘頻率,是以在外設初始化之前,應該先保證輸出的外設的時鐘穩定且是想要的頻率,畢竟時鐘就是單片機的鐘表,如果世界上的表都不準了,時間系統紊亂了,還談什麼996,007的奉獻呢?

CubeMX配置

LL庫內建

內建大緻沒什麼說的,去官網搜尋對應型号的Cube庫,如

en.stm32cubef1_v1.8.0

,然後下載下傳完就把啟動檔案,LL庫檔案什麼的移植到工程裡去,好像大概就是這些,可能會有一些報錯,具體情況根據報錯資訊解決,在keil裡面可以全局定義幾個宏

STM32F103xE,USE_FULL_ASSERT,USE_FULL_LL_DRIVER

,分别是指明MCU型号,開啟ASSERT功能(檢查實參是否合法,需要實作對應的assert_failed函數),指明使用LL庫,其他的好像就沒什麼了。

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

CubeMX關鍵配置

相關的配置說明文檔可以去官網下載下傳

um1718-stm32cubemx-for-stm32-configuration-and-initialization-c-code-generation-stmicroelectronics.pdf``um2739-how-to-create-a-software-pack-enhanced-for-stm32cubemx-using-stm32-pack-creator-tool-stmicroelectronics.pdf

Port配置

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

找到你想要配置的PortPin,然後單擊選擇PortPin的屬性即可,選擇完之後可以去下圖對每個PortPin的輸出方式,預設狀态,别名等配置。

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

時鐘樹

最開始時鐘樹界面的外部時鐘是不可以修改的,需要先去RCC界面使能外部時鐘之後,才能在時鐘樹界面激活相關的配置,這一點也挺有邏輯的。

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

選擇是旁路模式還是諧振器模式

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

然後在時鐘樹界面就可以對每一個節點去配置時鐘了,圖裡面都是按照最高頻率配置的,如果配錯了,他會用紅色來提醒你

Debug

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

在系統界面還可以對應修改調試器模式,在程式中展現為對調試端口的複用

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

其他配置

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

紅框處可以選擇編譯器類型

GD32系列總結 - 時鐘樹總結及CubeMX生成代碼寫在前面時鐘樹CubeMX配置CubeMX的整體感受

在Advanced Setting可以選擇每個子產品對應的庫,LL庫和HAL庫是可以同時用的

最後右上角Generate Code即可生成代碼

CubeMX的整體感受

整體來說使用起來邏輯上還是很好接受的,可能生成代碼的結構我不太喜歡,比如main.c裡面東西太多了,但是可以自己調整一下,也還能接受,整體的UI什麼感覺比EB做的好,配置起來也挺簡單的,喜歡後面GD32銷量上去了也能推出一款類似CubeMX一樣的軟體,聽說GD32今年銷量已經有3億了,國産晶片走到這一步,真不容易,GD32網上有一個類似軟體,不過隻支援一個型号,好像還不是官方正式版,是在論壇裡傳出來的,後面有可能GD32真的實作了硬體PIN對PIN,軟體完全移植,也就不需要再去開發一個了,直接用CubeMX不香嗎?hhhh

繼續閱讀