2017年6月11日 星期日

STM32 CubeMX 4.21.0 改版

這陣子其實STM32 CubeMX 有改版4.21.0
這次的改版比較有感的就是直接把MCU比較重要的SPEC列出來,還有最重要的價錢都列出來了,不過單位是10K pieces,也就是1萬pieces,不過這對接案來說,是一個非常重要的參考指標

以前如果要知道MCU比較重要的information都要上STM32 的網頁product tree查

這次的改板還有把error handler做修正:
以前的版本就直接while(1)卡死在裡面,這次多了file 和 line的參數,之後就可以寫個debug log 直接吐出file和line方便debug。


雖然這次的改版讓開啟的速度又變慢了,但新增的功能有改善也算是一大福音,如果還有功能有改變的話,也可以和我說^^"

2017年6月2日 星期五

STM32F0 ADC calibration - part 2

還記得上一篇在討論ADC如果需要做準的話,需要面對的問題是什麼,後來有做了一些實驗,但感覺還是怪怪的,後來拿掉calibration 反而是好的,就覺得更怪,印象中的ADC還滿準的,怎麼這次這麼不準,後來才發現這次是用STM32CubeMx generate code base,而不知道為什麼,ADC module 竟然沒有開始ADC calibration的功能,翻了一下ADC的3個範例,發現其中一個範例有加這個功能,如下
註:目前使用的版本為:STM32Cube_FW_F0_V1.7.0
有興趣可以參考一下reference 的說明
也有提供example code,其實就是上面那個框起來的副程式。

ADC + no  auto calibration + internal voltage calibration:

ADC +  auto calibration 

ADC + auto calibration + internal voltage calibration


雖然數劇是只開auto calibration 比較好,但和hardware engineer 討論的結果,還是先保留第3個做法,等之後再完整的驗証。

結論:因為不是第一次踩到STM32CubeMX的Bug了,所以之後的功能如果可以還是對一下example code 比較保險……








2017年6月1日 星期四

STM32F072 & STM32F412 flash organization

因為之前比較常用STM32F072,所以覺得flash 應該彈性很高,一個page 2KB,1個sector=2個page, 所以在換在高階的STM32F412就不疑有它,但是在做firmware update的時後,發現有些不應該被動到的data也被清掉了,所以就來檢查一下STM32F412的定義為何。
這一檢查乖乖不得了,STM32F412的彈性好差,分成SECTOR0~3 16KB,SECTOR 4 64KB,剩下來的128KB,還好有早點發現,不然等到之後要合功能又要來大改一次了。 

結論: 在做memory layout的時後,最好還是看一下每顆MCU的flash organization,以免等到設計好發現有衝突又要大改一次。

STM32F0 DAC output buffer

之前我在看DAC的時後,只會在意輸出能力,準度。
還有DAC的register如何access:像是有分8bit/12bit,對齊左邊或是對齊右邊

不過stm32多出了一個output buffer,其實就是一個電壓隨耦器,目的就是希望MCU的DAC不要受外部電路影響

SPEC有說,如果不開output buffer的話,建議負載的阻抗要 > 1.5MΩ(對地) 如果開啟了output buffer的話,那麼阻抗就只只要>5 kΩ(對地)
看吧! 是不是差很多, 有了這個buffer 就可以比較不擔心被干擾了。

但請注意一下,開啟了output buffer 最低電壓請設在0.2v 最高電壓就是Vdda – 0.2V

結論:SPEC還是有需要認真看一下的。

2017年5月29日 星期一

STM32 CAN bus

CAN bus長得有點像是I2C,也長得有點像是RS485,但我覺得更合是合體的protocol,我覺得CAN bus是一個非常適合傳嚴謹的protocol,如果有興趣看CAN bus的protocol,應該可以找其他的介紹,應該會比我介紹的完整,這篇主要是介紹我在STM32上遇到的一些困難和記錄。

下圖是一個一般常見的CAN bus 使用方法,MCU接了一顆CAN transceiver,這也是normal mode的CAN bus。

CAN bus有三個測試 mode,用來自我測試程式是否有問題,比較常用的會是loop back, 如果使用normal mode 又沒有接CAN transceiver IC 也沒有接對應的CAN 的話,那麼就會無法通訊,通訊會fail。 原因是因為normal mode 需要有對應的CAN 來做ACK的動作,但如果是loop back就沒有這個問題,所以可以自我測試。


在STM32 cubeMX 產生出來的code,最重要的就是要調整CAN 的頻率,而頻率的調整就是要靠Time Quanta  in bit segment 1 / Time Quanta  in bit segment 2 和  ReSynchronization Jump Width這3個參數來決定,以我們的應用是500Khz,就要調出2000ns,這個很重要,如果頻率調錯了,是無法通訊的。

記得把RX的interrupt 打開,STM32的RX有support 2個FIFO,主要要看初始化如何設定,像我只需要1個FIFO,就只開FIFO0就好。
  if (HAL_CAN_Receive_IT(&hcan1, CAN_FIFO0) != HAL_OK)
  {
    /* Reception Error */
    OEM_Error_Handler(HAL_CAN1_ERROR);
  }
 會有2個FIFO的需求是因為CAN bus 可能會有很多interrupt,怕MCU太忙,可以用2個FIFO來分擔一下MCU的負擔,有點像是ping-pong buffer。

因為CAN bus 可以並接很多device,bus 上可能會非常的busy,如果每個ID都去檢查,這樣會造成MCU的負擔,所以我們只要檢查自己的ID就好,那麼就需做filter的動作,也就是說,只有屬於自己有關係的ID 才要去處理,其他的就都一概不理會,下面是STM32設計的filter架構: CAN 能設的組數很多, 也有分很多種模式, ID MASK 和 ID List, ID MASK 是選擇那些BIT 是否需要FILTER , ID LIST 像是白名單, 就是需要完全符合ID才行。
 
程式上,filterNumber 就是那個filter,BankNumber是指CAN 2由那個filter 開始。
這裡要補充一下,STM32 的dual CAN 並非2個獨立的CAN bus,而是CAN 1和 CAN 2 share 相關的register,主要就是filter的部分,因為是share的,所可以透過firmware 來做分配,但有一點一定要注意,CAN 2不能單獨使用,一定要enable CAN 1 才有辦法使用。
如果使用的是STM32F1 系列,請注意下面這個說明,白話文就是,CAN 和 USB 因為共用RAM,所以同個案子可以用USB和CAN,但是絕對不能同時使用!!!

因為我們需要dual CAN,本來選用STM32F105,但因為我們需要USB 也需要CAN bus,所以後來是選用STM32F412,除了功能更強之外,最意外的收獲就是這顆還非常省電的!