2016年11月5日 星期六

技術筆記STM32F4

第一塊版子無法Touch,第二塊才行

製做熱感應紙相機玩具途中,大量使用STM32F4,因為是新手有許多不熟悉的地方,將些學習記錄筆記於此。(熱感應紙相機其他連結,例如演算法、機殼、電路設計在這邊,連結)

硬體Embedded System選擇

Embedded System是很籠統的概念,過去工作上接觸過公司自行設計專為數位相機量身訂做的ARC解決方案,也有醫療血糖機AVR ARM系統,不過我的玩具不複雜,不需要這些高端方案。市場上常見的RASPBERRY PI 或STM32 或ARDUINO即可應付。又ARDUINO過於單純,RASPBERRY PI整體系統過於龐大,選擇有下列優點的STM32F429。

  1. 內建浮點運算功能,方便圖型處理程式
  2. DCMI Camera interface,簡化影像擷取
  3. 眾多軟體、電路設計範例

開發環境( IDE和開發板 )

  1. KEIL:有最多範例,初期使用uVision 5.11(HAPPY版)。遇困難後使用新版( 5.21.1.0 )。安裝檔名應該是硬碟下的KeilMDK_68532.rar SIZE約300M
  2. IAR:手邊有"正版"軟體,不過範例太少,且IAR + I-JET + SWD組合下始終只能供電,無法RESET,放棄。
  3. CooCox:STM公司贊助的開源計畫,少使用者,暫時忽略。

開發板
第一種是:STM32開發板 F429 DISCOVERY:詳細規格如連結。以開發板來說,F4有兩種不同版子,STM32F4DISCOVERY32F429IDISCOVERY,前者是使用STM32F407G,沒有螢幕和外接SD RAM,後者才是TM使用開發板。
  • USB直接燒錄、供電和偵錯,接上行動電源就可使用,type A to mini-B。版子上還有個micro USB插孔可以做更多實驗。
  • 硬體: 靠近螢幕有兩組LED, 再旁邊有個按鈕, 靠近邊緣的LED是綠色 內部是紅色。
  • PIN腳圖放在這,方便連結。正面時 LCD在下方,左邊LED綠色 右邊LED紅色。
正面LCD在下由左至右
第二種是STM32半成品:F407 (SWD), F429 (SDRAM SWD) : KitSprout
上(STM32F429) 下(STM32F407)

第三種是OpenMV開發板,詳細資料參考此連結。

KEIL連結STM32F4

新版本KEIL + STM32 開始改採 STM新版HAL, 優點是可套用自動建立模版功能,但我IDE總是無法編譯。目前仍沿用舊版本。

舊版本KEIL + STM32 是使用時 STD_Periph_Drivers,這是以往大多數看到範例。

舊模式,不是自動產生檔案,而是拷貝TEMPLATE修改,又可以分為兩種:
一、改KitSprout範例
二、改TM範例,先拷貝至新目錄,用KEIL開啟,編譯。範例D:\stm\tm\touchscreen

目錄對應方式

Menu-Project-Mange-Project Items..

TM目錄結構內都有全部檔案,有需要時才include。操作方法:點選目錄右鍵,找到對應目錄,選EXIST的C檔案,編譯時H檔案會自動匯入。更換新的TM實驗項目時,除了CODE會改變,include 的TM的檔案也會改變,要使用點兩下IMPORT進入的方式。

另外,因為TM是通用型LIB,編譯前必須在MENU下拉選單中選擇適合CPU的版本,目前開發板選擇STM32F429I。配合自己的狀況,可以刪除很多用不到的裝置設定檔。

除此之外,也可以增刪TM LIB中不恰當檔案,變成非TM版本。例如兩個範例,LED間歇閃爍和按鈕。( TM是作者自行搭設的架構,方便學習,但成品專案大多還是會使用STM)



前面提到的方式,帶了太多檔案,進階是將LIB抽出,如此一來,就可以在不變動TM LIB狀況下,只要複製這個SRC和INCLUDE就可以產生新專案。如01-STM32F4xx_Keil_CMSIS_Default_Project。

如果要加入新目錄,執行下面兩個動作。
1. 選擇project - option - c/c++ - include
    加入目錄TMLIB
2. 在PROJECT目錄下,右鍵add group
    把New Group換一個名子(容易看就好 例如TMLIB)
    點兩下 就會跳出增加檔案的視窗 選擇相對應的.c .h,檔案就會自動帶入

基本流程

include內容反映檔案架構

1. ARM
#include 不在STM32中,屬於ARM範圍
     讓程式可以使用bool

2. STM
#include "stm32f4xx.h"  必備
#include "stm32f4xx_rcc.h"  依照不同需要加入
#include "stm32f4xx_tim.h"
#include "stm32f4xx_gpio.h"
    #define LED_GREEN GPIO_Pin_13  宣告GPIO等等對應名稱

3. USER
#include "system_control.h" INIT等固定宣告方式
stm32f4xx_conf.h   是STM提供,include不同組h,其他似乎assert

STM32F4 核心SKILL

學習範例連結,作者設計LIB層簡化使用者設定,廣泛流傳,有許多人參考此LIB將其精簡。
  • 基本架構 main() 基礎GPIO設定 loop迴圈
  • TIMER
    不用sleep,固定時間ms 範例
    DELAY的方法 範例
    clock speed 範例
  • DMA 範例
  • Interrupt
    Interrupts are important in microcontrollers. WIth them you are able to stop executing main program and jump to some predefined area if there is something important.這讓我想到我們做胰島素注射器時,interrrupt總是搞不定啊啊啊啊
    STM32F4使用的機制稱為
    NVIC or Nested Vector Interrupt Controller is used to dinamically tell which interrupt is more important and for enabling or disabling interrupts. It supports up to 256 different interrupt vectors. 範例  進階討論 進階討論
    外部中斷 範例 範例
  • RTC
    很大的主題 目前用不到 範例
    output clock 範例
  • WatchDog 範例
  • 亂數產生 範例  CRC範例
  • 波型產生DAC 範例
  • power consumption 範例 原ST的文件PDF
     
  • 超頻 範例
  • 浮點運算
    開啟F429浮點運算方法 FFT 範例1  範例2
  • USB->UART 似乎是避開燒錄機制開機?? 範例
  • printf 範例  stdio 範例

STM32F4 操作外部設備

  • GPIO 最基本
    範例 (先提不使用TM LIB , 再引入TM LIB) 進階討論
  • USART (TXRX)
    STM32F4有八組channel 先設定GPIO 設定UART 設定中斷項目 英文說明範例 中文範例
    硬體 : PC安裝TERMINAL, (手邊有 沒測) , 印表機 , GSM modules, GPRS, bluetooth
  • SPI(Serial peripheral interface)是一種主從式架構的同步資料協定,可以讓多個裝置在短距離互相通訊。在使用SPI最基本會有四個腳位:
    MISO:Master In, Slave Out
    MOSI:Master Out, Slave In
    SCK(SCLK or Clock):Serial 時脈
    SS/CS(Slave Select/Chip Select):LOW表示裝置可以與Master通訊;HIGH表示不與Master通訊
    範例
    SPI硬體,SD CARD MODULE
    SPI硬體,三軸感應範例 這是開發板內建裝置
    SPI硬體,加速器範例
  • ADC 範例
    實際ADC範例,麥克風類比取樣,轉成數位,做錄音存檔或音效處理
    自然界只存在類比信號,人類利用各種感知器(Sensor),將其數位化、量化,方便儲存, 資料處理, 運算比較, 如溫度sensor,紅外線測距, 流明度量測....。
  • ADC範例
    麥克風類比取樣,轉成數位,在遠端交談, 經網路數位傳輸,在近端經電腦DAC還原類比聲。電腦上通常有一顆或數顆IC,負責低速週邊控制,如 Super IO, Hardware Monitor, BMC, 通常此IC有 AD converter,以方便偵測電壓、溫度。電腦上有時會用影像頡取卡,就是把類比鏡頭的類比信號,轉成數位壓縮,方便儲存在硬碟。常見就是數位音響,將CD/DVD 光碟數位信號,轉成類比聲音信號,在從喇叭播出。電腦顯卡有VGA輸出的,也是由數位資料,轉成傳統電腦CRT螢幕的類比信號。(目前DVI/HDMI 都是數位調變輸出,再也不是類比信號)
  • I2C 範例
    Inter-Integrated Circuit is a multimaster serial single ended bus. This protocol is commonly used with RTC modules, temperature sensors, EEPROMs, IO expanders and more.
    硬體應用
    1. 觸碰螢幕( 是電阻式, 基本範例 , 兩塊開發板中一個功能故障 , 顯示觸碰點 ) 觸碰螢幕不重要,只是會阻礙不過,KEYPAD可以考慮 I2C
    2. 觸碰螢幕進階範例 ( 得去GIT上補足部份檔案 , 有BUTTON LIB)
    3. RTC 範例 DS1307
    4. 壓力偵測 範例
  • PWM 範例 沒有直接實驗 Pulse Width Modulation, or PWM, is a technique for getting analog results with digital means. Digital control is used to create a square wave, a signal switched between on and off. This on-off pattern can simulate voltages in between full on (5 Volts) and off (0 Volts) by changing the portion of the time the signal spends on versus the time that the signal spends off.
    進階範例
  • OneWire 範例 進階範例
  • VCP virtual com port USB模擬COM PORT 範例
  • USB
    MSC HOST可以讀取FAT範例
    HID HOST (Human Input Device) 可插入滑鼠和鍵盤 範例
    HID DEVICE 範例 自己變成滑鼠和鍵盤
較大型範例 範例一貪吃蛇
 螢幕
聲音學習和分辯範例連結

編譯原理



1.編譯,MDK軟件使用的編譯器是armcc和armasm,它們根據每個c/c++和彙編源文件編譯成對應的以".o"為尾碼名的對象文件(Object Code,也稱目標文件),其內容主要是從源文件編譯得到的機器碼,包含了代碼、數據以及調試使用的信息;

2.連結,連結器armlink把各個.o文件及庫文件連結成一個映像文件".axf"或".elf";

3.格式轉換,一般來說Windows或Linux系統使用連結器直接生成可執行映像文件elf後,內核根據該文件的信息加載後,就可以運行程序了,但在單片機平台上,需要把該文件的內容加載到晶片上,所以還需要對連結器生成的elf映像文件利用格式轉換器fromelf轉換成".bin"或".hex"文件,交給下載器下載到晶片的FLASH或ROM中。

參考連結

編譯(KEIL)

ARM買下了KEIL,所以內部KEIL MDK附屬的ARMCC對ARM的支援應該很好的。如果需要更新編譯時的參數。點選專案,按右鍵,選options for xxx,選C/C++這個TAB,最下面compiler control string是目前編譯參數。不太能改變,可以選中間Code Generation有不同的參數。

但如果遇到很多人使用的GCC,如果要把GCC的東西移植到ARMCC下,首先會遇到編譯imlib.h時發生錯誤     User\imlib.h(211): error:  #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions原因是 enum 的看待方式不同。

union在ARMCC下是不支援的。需要在.h中增加一行#pragma anon_unions  。但數量太多手工修改不切實際。


只要在Misc Controls增加--gnu 就可以使用GNU的GCC來編譯。延伸要注意的是,對startup_xxx.s也得在ASM選項中使用--gnu。因為ARMCC的格式和GCC完全不一樣。

編譯(TOOLCHAIN)

這篇中文翻譯非常好

連結一 英文
連結二 英文
連結三 windows 中文
連結四 linux 中文

armcc
armasm
armlink
armar
fromelf

燒錄


假定編譯成功了,得到一個 HEX 文件,也就是要燒寫的二進位代碼。

狀況一:一般使用ST-LINK或SWD

狀況一之一 使用KEIL

  1. I-JET:J-LINK手邊有"正版"工具,但KEIL + J-LINK + SWD組合下,外部供電問題無法解決,暫時放棄。
  2. STM32 Discovery開發板:內建ST燒錄器,無痛銜接。
  3. KitSprout處取得簡易燒錄器:SWD和供電一次解決,一個不到一百元,CP值超高。

狀況一之二:使用TOOLCHAIN

b.GCC命令行工具的,就需要再找下載程序用的軟體了

     如果是使用ST-Link,可以使用ST自己的STVP (Visual Programmer),這個東東在ST網站上可以下載到,不過是包含在九十兆左右的一個大包"ST Toolset"裡面。(下載URL  )這個軟體的介面是這個樣子的:


主菜單上面 Erase, Program, Verify, Read 功能很明了了,File-->Open可以加載HEX文件。第一次運行STVP的時候,要選擇ST-LINK調試器,和 SWD接口。


狀況二:還可以從串口下載程序,只需要把BOOT0跳線接上即可,因為STM32內帶了Bootloader.

需要"Flash Loader Demostrator"軟體,這個也可以從ST網站直接下載(URL )。下載前要把BOOT0跳線接上,使STM32進入Bootloader模式,USART1連接到PC的串口(我用的是FT232RL USB轉串口),把MCU加電。運行軟體,介面是這樣的:


選擇串口,然後點"Next",如果成功連上了,則介面變成下面這樣


點"Next"繼續


這時已顯示出識別出的STM32型號,點"Next"到下一步進行具體的操作。


OK, 下載HEX,擦除,上載(讀Flash內容) 功能都一看就明白了吧。


狀況三:從USB直接下載

需要ST的"DFUSe Demo"軟體,也是從ST網站下載的(URL )。也需要把BOOT0跳線接上,還必須連接USB口,然後PC提示找到了新硬體。安裝好驅動以後,再啟動軟體,介面如下:


不過現在不能把HEX文件直接寫入,而需要先生成dfu文件,使用一起安裝得到的"DFU File Manager"程序,從HEX生成dfu.


至於 VID, PID 我還是保留和原來的一致,不然得重新安裝驅動(為什麼要使用DFU文件我還沒理解清楚)。得到dfu文件就可以用上面的軟體燒寫了。

記憶體使用


無論是在規畫或是編譯(FLASH RAM)或是程式運作(HEAP)時,都和記憶體息息相關,因為數量多,特別拉出個筆記。連結

Debug方法

有SWO DEBUG 範例
Debug會隨著編譯方式有所不同,因為目前IDE是KEIL,就以KEIL為對象。雖然分成軟體模擬和硬體偵錯兩種,大多數人應該都是使用硬體偵錯。並且設定LINK
ToolBar上面有Start/Stop Debug Session(CTRL F5),啟動後,畫面如下。可以參考的教學




KEIL DEBUG畫面

各種螢幕

移到更詳細的連結

LIBC使用


大型程式,尤其是open source程式都使用許多standard library C的function,例如strdup等等,這些function放進STM32程式時,偶爾會有些問題,如 types.h、strdup。網路上有不少PORT的專案可參考,自己在編譯optrec時也有些處理。

CAMERA元件


移到更詳細的連結

熱感應印表機


移到更詳細的連結

專案筆記


main.c中控全部流程
  SystemInit();  設定<---- nbsp="" p="" style="font-family: "times new roman";" system_stm43f4xx.c="">  NVIC <--------- p="">  QMV_GPIO_Config 
<---- nbsp="" p="" system_stm43f4xx.c="">  打開 LCD
  打開 OV
  Camera_Start
  while(1){
     從CAMERA拿到影像
     決定送到印表機 print( (uint16_t*)frame_buffer);
     或是將影像放到螢幕上,就會造成liveview的錯覺
  }
}

print()
{
camera拿到的是image1
計算Dither
    準備送到印表機的資料是 bmpBlock
將影像放上螢幕
    LCD_ILI9341_DisplayImage((uint16_t*) image1);
}

有三個設定,討論呼叫源
void TIM3_IRQHandler(void)
system_control.c
TIM_Cmd(TIM3, ENABLE);
void TIM4_IRQHandler(void)
system_control.c
TIM_Cmd(TIM4, DISABLE);
void DMA2_Stream1_IRQHandler(void) DCMI溝通時會送出

---------------

system_stm32f4xx.c 有CLOCK和INIT設定
  void SystemInit(void)
  {
    都是一堆設定
  }
  SystemCoreClockUpdate(void)
  static void SetSysClock(void)
  void SystemInit_ExtMemCtl(void)

system_control.c
這是特別寫的,都是為了這台裝置按鈕和LED使用
  void STM_LedInit(void){
  void STM_ButtonInit(void){
  void STM_LedOn(uint16_t led){
  void STM_LedOff(uint16_t led){
  uint8_t STM_ButtonPressed(void){
  void STM_TimerInit(void){

stm32f4xx_it
系統和APP溝通,設定
如INTERRUPT的處理

stm32f4xx_conf
預設的include還有assert等

---------------

lcd_fonts.c  就是各種不同大小字型的resource檔案
lcd_ili9341.c
lcd_spi.c

---------------

OV7670_control.c 初始化 和DMA設定

SD Card


各項I/O中,SD CARD最是基本。無論是OPTREC或手邊玩具計劃,都可以利用它來寫LOG或儲存相片。方式上,可選擇SDIO或SPI,範例網站上都有提供,連結位置。電路板連線。

背面是SPI(PIN腳向右),由上而下依序是 3.3V GND MISO(DO)  MOSI(DI) SCLK CS
正面是SDIO(PIN腳向左),由上而下依序是 3.3V(VDD/3.3V)   GND(VSS1/GND)   D0(DAT0/PC8)   CMD(CMD/PD2)   CLK(CLK/PC12)   D3(CD/DAT3/PC11)   D2(DAT2/PC10)   D1(DAT1/PC9)   CO(VSS2/GND) 後面是對應開發板的腳位
SDIO還區分成 4bit 和1bit兩種模式

  1. 下載範例 編譯 ( 許多錯誤,後來直接GIT專案,編譯成功 )
  2. 系統預設是 SDIO(比較快) 的 4bit模式 ( 比較快) 如果沒改變就維持
  3. 連結SD CARD和開發板
  4. 放入SD卡 啟動 會看到SD模組燈亮 f_mount成功  f_open 失敗,查詢結果是FR_NOT_ENOUGH_CORE 是 (17) LFN working buffer could not be allocated
  5. 修改heap 成功寫入檔案。修改heap的方式,參考記憶體的段落。

無線通訊RF

RF Nordic範例
RFID 範例
GPS 範例

STM32家族


F1  72MHz  2UART

F3  72MHz  3UART
   相比F1 採用浮點計算單元(floating point unit —FPV),其浮點計算速度更快。相比F1 增加了一個UART,並且設有精細的USB埠,當通過USB連接至電腦時,UART1並不占用,比起F1這也就意味著F3中的UART1的功能更強,因為在使用F1時人們通常會避免使用UART1。

F4  168MHz  3UART

F429
STM32F429ZIT6 microcontroller featuring 2 Mbytes of Flash memory, 256 Kbytes of RAM in an LQFP144 package
On-board ST-LINK/V2 on STM32F429I-DISCO (old order code) or ST-LINK/V2-B on STM32F429I-DISC1 (new order code)
mbed™ -enabled (see http://mbed.org) with the new order code only
USB functions:
Debug port
Virtual COM port (with new order code only)
Mass storage (with new order code only)
Board power supply: through the USB bus or from an external 3 V or 5 V supply voltage
2.4" QVGA TFT LCD
64-Mbit SDRAM
L3GD20, ST-MEMS motion sensor 3-axis digital output gyroscope
Six LEDs:
LD1 (red/green) for USB communication
LD2 (red) for 3.3 V power-on
Two user LEDs: LD3 (green), LD4 (red)
Two USB OTG LEDs: LD5 (green) VBUS and LD6 (red) OC (over-current)
Two push-buttons (user and reset)
USB OTG with micro-AB connector
Extension header for LQFP144 I/Os for a quick connection to the prototyping board and an easy probing
Comprehensive free software including a variety of examples, part of STM32CubeF4 package or STSW-STM32138, for using legacy standard libraries

F7  216MHz  8UART 詳細STM32F7在2015問市 最新版OpenMV已進階到STM32F7。F7應用範例可以參考這裡。專業資料在這裡
  • 216MHz ARM Cortex-M7 STM32F746 in 216 BGA
  • 480×272 touch screen (capacitive) LCD connected to LTDC port of MCU
  • 2 digital microphones
  • Ethernet with LAN8720A connected via RMII
  • USB FS and USB HS with external PHY to get real HS speed of 480Mbps
  • Micro SD card connector
  • Camera connector
  • Audio input and output
  • External 64Mbit SDRAM connected via FMC
  • External 128Mbit FLASH connected via QSPI
  • STLink v2.1 for programming

MicroPython


除了C語言和KEIL外,另有一個分支蓬勃發展中,如連結 MicroPython

6 則留言:

  1. 您好,目前正使用STM32F407系列的開發板想做影像辨識,有一些問題想請教您...
    1.目前買了OV7670是從TAOBAO買的,不帶FIFO的。我想用i2c讀取id時一直卡住,不然就是讀到0x00(null),XCLK 由F4 提供。不太清楚是出了什麼問題,在做這個測試時只有接XCLK SDA SCL VCC GND 這五條而已
    2.目前在考慮在taiwainiot再買一顆,考慮FIFO+晶體,可是價錢貴了一倍,不知道這樣差在哪裡?

    回覆刪除
    回覆
    1. 抱歉 拖了些時間才回覆 晶振可有可無,若沒有,從STM裡面挪一個幫鏡頭做CLK就可以動。但看你描述已經嘗試過。我住新竹,有需要可以拿我鏡頭去測試。

      刪除
  2. 您好~~
    請問方便提供OptRec移植成功的範例嗎?
    我的STM32f429 discovery 一直無法移植QQ

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除