2013年3月7日 星期四

[STM32F3 教學] USART with DMA






        在前二篇的文章有教到USART的範例,可是每次當PC送一筆資料給MCU時,就需要產生中斷,而MCU把資料送給PC時,又需要在原地等待。其實我們可以善用ST更好的功能,就是利用DMA幫我們把資料收/送進來,也就是我們只需要把資料buffer位址告訴PCMCU就可以比較不需要被中斷打擾了。只要適時的關心一下DMA是否已經把我們的資料準備好了,或者是已經把資料送完了。





        至於DMA要怎麼操作,要先知道我們需要操作的暫存器,再找出其暫存器所存在的絕對位址,首先,先找到整個模組被定義的位址,再找出offset的數位,這樣,我們就可以知道這個暫存器真正被定義的絕對位址了。我們只要把這個絕對位址告訴DMA模組,那麼他就可以幫我們完成交辦的任務了。記得,每個模組一開始被分配的DMA channel也是固定的,要事先規劃自己的需求。





因為DMA的每組channel可以使用的模組是固定的,所以需要事先規劃一下,例如USART1 Tx所佔用的位置就在DMA1ch4,而USART1 Rx就在DMA 1 ch5









程式上需要先看SPEC 找出相對應的暫存器,筆者習慣是找出模組的所在絕對位址,然後找出offset的位置,例如USART的模組和所需要的暫存器位置。









   DMA_InitStructure.DMA_DIR :









DMA_DIR_PeripheralSRC : 指定的周邊模組當作資料來源,也就是暫存器資料搬到buffer




DMA_DIR_PeripheralDST: 指定的周邊模組當作資料終點, 也就是把資料放到暫存器









   DMA_InitStructure.DMA_BufferSize: 指定buffer大小,而這個大小也會決定全滿或是半滿的中斷。









   DMA_InitStructure.DMA_PeripheralInc : 周邊模組暫存器是否需要自動+1




   DMA_InitStructure.DMA_MemoryInc : 資料buffer是否需要自動+1




   DMA_InitStructure.DMA_PeripheralDataSize : 周邊模組暫存器資料大小




   DMA_InitStructure.DMA_MemoryDataSize : 資料buffer資料大小




   DMA_InitStructure.DMA_Mode :




DMA_Mode_Normal: 1次性




DMA_Mode_Circular: 連續性




   DMA_InitStructure.DMA_Priority : DMA 優先權




   DMA_InitStructure.DMA_M 2M :是否用在非周邊模組的記憶體搬運(複製)









可以看一下程程上主要的DMA設定方式。














範例程式說明:


1、   USART1  Tx利用DMA,送出資料。

範例程式:



因為只有改main.c 請與之前的USART http://tinyurl.com/a7u4qz8」共用。




下一篇,SYSTICK





沒有留言:

張貼留言