2013年2月28日 星期四

[STM32F3 教學] DMA





相信寫過8051的人,一定都知道,很多事都要8051「親恭親為」,而在ST STM 32F 系列,其實有一個非常好用的功能:DMA(Direct
memory access controller)
其實這個模組有點像是電腦上的直接存取記憶體,但又有點不太一樣。其實他的想法和原理是差不多的,就是希望有模組可以幫忙分擔MCU的處理,而這些事不需要及時且只是記憶體處理。









STM 32F 3 所支援的DMA2組,每組可以支援的channel 數不同,每個channel 只能支援一個功能,也就是是一個有限的資源,自己在規劃的時候要注意一下。當DMA的資源都被分配完的時候,就只好讓MCU「親恭親為」了。DMA可以存取的資料長度為1BYTE(BYTE)/2BYTE(HALF WORD)/4BYTE(WORD),這裡需要注意的是,只有AHB只能支援4BYTE(WORD),而STDMA在優先權上分成四種。




–Very high
priority




– High
priority




– Medium
priority





Low priority




值得注意的地方是,當優先權一樣的時候,會看channel的數值,舉例來說:優先權一樣時,ch0會比ch4 優先處理。




STDMA支援三種中斷源,包含了,資料傳送完成後,資料傳送一半時和傳送錯誤。這樣可以增加DMA使用的調性,這部分會在未來有機會的時候多加介紹如何善用DMA







下圖為DMA1可以操作的模組。












下圖為DMA2可以操作的模組。










下一篇: USART + DMA



2013年2月27日 星期三

[STM32F3 教學] USART




        雖然ST 出的discovery 都有附上ICE,而且現在的電腦也幾乎都把COM port拿掉了,但事實上UART,還是一個非常好用的介面,不過是拿來做除錯,或是要做電腦端的人機介面,都是一個非常實用的。UART 在此筆者就不多加介紹了,有興趣的話,可以去網路上找找相關的資料,這裡只是介紹要如何使用UART




STUSART其實是一個功能強大的加強型USART模組,他不只可以用來處理UART,也可以處理像是紅外線或是相關類似的周邊,可以從下圖可以得知不同的模組所支援的功能並不相同。









下圖是一個簡單的UART的原理介紹,有興趣的慢慢看,看不懂,原則上也不會影響使用上的結果,但如果需要硬體的debug時,這個就非常的重要。原則上只需要了解(start/data/parity/stop/clock) 大概的原理就行了。









另外STUART 是可以做「類操頻」的功能,一般的UART clock通常都是16個,而ST可以做到只需要8clock就行了,如果需要非常高速的UART,這是一個不錯的選項,不過相對的,就是抗雜訊能力就會變差。









在使用USART時,就需要了解不同模組所處在的匯流排上,這樣才不會讓程式在初始化時,造成錯誤,只要模組選擇錯誤,可是真的會除錯很久的。






至於GPIO選擇,就要看每顆不同的設計,原則上就是選擇自己所需要的功能與相對應的GPIO,這樣就可以了。筆者所提供的範例會同時選擇USART1USART2








GPIO要如何選擇到相對應的功能,就要靠AF來選擇,可以參照下表,這部分和STM 32F 1xx 系列不太相容,使用上需要特別注意一下。









程式部分,在使用時,需要把相對應的clock都打開,才不會造成漏網之魚,記得就是GPIO的設定部分,需要特別處理AF的功能。









如果有使用到的中斷程式,記得要把NVIC所相對應的中斷打開。至於中斷優先權,
PREEMPT / SUB 
你可以想像這是2組中斷優先權,PREEMPT 是主要的,SUB是次要的, 中斷優先權會以主要的為主,次要的為輔,數字愈低,中斷優先權愈高。











筆者所提供的範例就是 Rx收什麼資料,就利用Tx把收到的資料送出去。










如果和筆者一樣是LKK的程度,不太會用GOOGLE 雲端的話,那麼就照著下面的方法,應該就可以載下來了。

點入上面的google drive,應該可以看到這樣的頁面。







「另存新檔」,或是點選「檔案」--> 「下載」






        接著把TX/RX 接到電腦上,開啟了Terminal 可以看到資料已經開始傳送了。從電腦端送出的資料,會送到Discovery的板子上,Discovery 會把資料再送回電腦端。 大家不仿可以試試看。










下一篇:DMA 介紹

2013年2月26日 星期二

[STM32F3 教學] 中斷介紹




其實有些人對於ARM這個名詞,一直覺得是省電的代名詞,不過聽說之前ARM因為在MCU這個市場初期,因為中斷管理不像一般MCU那麼厲害,後來才出了Cortex這個系列來PK MCU這塊嵌入式市場,不過ARM cortex 系列除了省電,到底還有什麼地方厲害呢? 其實就是他的中斷處理打破了以往的做法,讓MCU在處理中斷的程序簡化了許多,其實就是可以快速且有效的管理中斷源。有興趣的人,可以參考這一篇ARM的介紹「http://www.embedded-world.eu/fileadmin/user_upload/pdf/arm_entwicklerkonferenz_2011/Session_1/01%20-%20Cortex-M%20architecture.pdf




不過因為筆者是寫系統的工程師,並不是設計IC的工程師,就只簡單的帶過幾個比較厲害的地方,所以在此就不多加介紹了,筆者只是覺得ARM cortex系列的中斷,真的做得是非常的厲害。















從上圖你看出Cortex 在處理中斷的pushpop的厲害之處了嗎? 其實就是讓pushpop的次數變少,這樣就可以有效的處理中斷了,至於Cortex到底怎麼辦到這件事的,會不會有什麼問題? 這些問題筆者到是不擔心,畢竟人家敢拿東西出來賣,就是有十足的把握,況且,這些還都是硬體行為!!!



我們要開始介紹ST的中斷向量了, 因為STSPEC真的寫得非常得多元,真的讓初學者很難適應,他的中斷的介紹寫在programming
manual
裡。而 reference manual 裡面竟然沒有多加介紹,這地方筆者真的是希望ST可以把這一部分加入,讓找資料比較容易;避免造成找SPEC 時的麻煩,更別說每本都有數百頁之多。




ST的中斷向量分成一般的IRQNMI(non-masked interrupt) NMI就是我們沒有辦法透過程式的方式控制,也就是我們只能操作IRQ,而中斷優先權數值愈低,中斷優先權愈高





程式方式,中斷向量是寫在startup.s裡,而程式中,中斷副程式和一般的程式其實並沒有差別,不像以往要特別和compiler宣告這是「IRQ」或是要操作「#paragma」,所以在寫中斷副程式的時候要多加注意,不然一不小心就被compiler識為一般的副程式。不過interrupt的副程式到底叫什麼名字呢?以STM 32F 3 discovery 所附的範例程式,路徑就會是..\\Libraries\CMSIS\Device\ST\STM 32F 30x\Source\Templates\arm 裡面的「startup_stm 32f 30x.s」, 裡面定義的table 就會是中斷副程式,這樣compiler會自己找出相對應的中斷副程式,另外,ST在命令中斷副程式時,會以IRQHadler 為命令方式,以避免搞混。







下一章預告:USART



2013年2月25日 星期一

[STM32F3 教學] GPIO



開始要進入MCU(Micro-Controller Unit, 單晶片或微處理機)的主題了,我們就從最基礎的GPIO開始介紹吧。STM32GPIO算是MCU裡面比較複雜的,學習上也比較麻煩,不過沒關係,功能多的好處就是代表之後可以調整的彈性比較大。



我們先看reference manual 裡面的GPIO完整的介紹,可以看到用PDF選擇書籤,找出GPIO的位置。這個章節都會介紹GPIO





下圖是一般的GPIO硬體架構示意圖,input時除了可以pull-up pull-down電阻,output也可以選擇Push-pull 或是open drain 的功能,事實上,如果只是純粹學習的話,其實只要管可以on/off就好,但如果需要做到產品的階段,這些功能就會非常有好用,或者還可以幫忙硬體上省點不必要的花費和金錢。但就是和筆者一樣的韌體工程師,在這裡就不得不抱怨一下,台灣的企業總是只看價格,不在於軟韌體的支援,他們覺得這些都是無形的價錢,也就是「無價」()







當我們把GPIO設定成Input時,這時後MCU內部的設定就會變成:


 



ü      關閉output driver



ü      可以允許pull-up pull-down 電阻



ü      加入TTL 史密特電路 (防止在unknow voltage彈跳)







當我們把GPIO設定成Output時,這時後MCU內部的設定就會變成:





ü      可以選擇push-pull 或是open drain 的輸出方式



ü      pull-uppull-down 電阻無法由程式設定,在特殊的腳位上才擁有此功能



ü      可以回讀write registor (寫入的狀態)的資料



ü      可以回讀外部pin腳的狀態,(如果這支腳外部被接到gnd,那麼雖然期待出是1,但此這裡回讀就會是0),這是一個非常好用的功能,可以檢查外部的pin腳實際狀態。






當我們知道GPIO的原理的時候,我們就要來試試看,如何讓GPIO可以照著我們的想法,點亮LED。今天我們選用STM 32F 3
Discovery
上面的PE.14 PE.15來做閃爍的控制。



其實ST原廠提供了一支副程式可以直接呼叫,但在這裡我會用另外一種方式來做操作,在此之前,先介紹一下,這次要用到的3支副程式:





void GPIO_SetBits
(
GPIO_TypeDef * GPIOx,
uint16_t GPIO_Pin) ;



void
GPIO_ResetBits (
GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin) ;



void
GPIO_WriteBit (
GPIO_TypeDef
* GPIOx, uint16_t GPIO_Pin, BitAction BitVal) ;





細節可以參考「UM158 – User
manual :
Description
of STM 32F 30xx/31xx
Standard Peripheral Library
這裡就不再多加介紹了。



那我寫了幾個不一樣的寫法












以上2種就看客倌喜歡那種寫法,不過對筆者來說,其實這樣的寫法對於後續的維護,都不是一件易事,所以筆者習慣再用巨集(macro)重新包裝一次,讓之後的維護或是修改上,擁有較佳的彈性。









以上就是簡單的測試利用GPIO驅動LED 至於input和其他功能嘛,等待之後有機會,再一併做介紹。



下一篇預告: 中斷介紹


2013年2月7日 星期四

[STM32F3 教學] 匯流排



       
常常有些人接觸單晶片或微處理機,可能都會先從8051下手,其實原因無他,就是外面的書籍較多,比較好學習,但有些人會問筆者,為什麼ARM相關的書籍很少,或都是對岸所出的,原因無他,就是因為在台灣寫書所得到的報酬已經非常少了,往往花了半年到1年的時間,只賣出幾百本,或是更慘,這可能就是專業書籍的宿命吧。 沒關係, 筆者旨在「交朋友」 不在乎報酬,只希望多給筆者一點掌聲即可。
但也希望如果內容那裡不清楚的,或是想了解更多的,筆者應該會盡可能的滿足大家的需求。





進入ARM的世界,一定要了解ARM的架構,不過在此就不多加介紹ARM了,因為對於做晶單片和微處理機的人來說,怎麼做IC不是重點,重點是要了解這顆單片和微處理機怎麼使用,所以這裡只有介紹ARM的匯流排架構(AMBA bus),現在在使用的cortex-M系列只有分AHB(Advanced
High-performance Bus)
APB(Advanced
Peripheral Bus)
兩種,你可以想成AHB 就是高速公路,而APH就是一般的快速道路或是平面道路。至於到底這上面怎麼運作的,我想,就留給有興趣製作IC的人慢慢研究了,在此也不多加介紹。不過,我們只需要了解我們需要用的周邊功能,是被掛在那個匯流排上的,這樣就可以了。




以下圖為例:




GPIO à AHB




USART1 à APB2




USART2 à APB1




硬體上APB1APB2的差別就只在於最高的操作頻率不同而已,程式上記得要把相對應的匯流排打開,記得,預設值的匯流排基本上都是沒有打開的,開錯了,就很容易發現周邊不會動了。筆者也常常在這上面除錯,就只因為筆誤造成的錯誤,而找了半天()




        下一篇:GPIO