工程師STM32單片機學習基礎手記(4):用PWM實現(xiàn)熒火蟲燈(五)
1腳不接時出現(xiàn)的畫面
DMA初步
DMA有什么用?
直接存儲器存取用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。無須CPU的干預,通過DMA數(shù)據(jù)可以快速地移動。這就節(jié)省了CPU的資源來做其他操作。
有多少個DMA資源
有兩個DMA控制器,DMA1有7個通道,DMA2有5個通道。
數(shù)據(jù)從什么地方送到什么地方?
外設到SRAM(I2C/UART等獲取數(shù)據(jù)并送入SRAM);
SRAM的兩個區(qū)域之間;
外設到外設(ADC讀取數(shù)據(jù)后送到TIM1控制其產(chǎn)生不同的PWM占空比);
SRAM到外設(SRAM中預先保存的數(shù)據(jù)送入DAC產(chǎn)生各種波形);
……還有一些目前還搞不清楚的。
DMA可以傳遞多少數(shù)據(jù)?
傳統(tǒng)的DMA的概念是用于大批量數(shù)據(jù)的傳輸,但是我理解,在STM32中,它的概念被擴展了,也許更多的時候快速是其應用的重點。數(shù)據(jù)可以從1~65535個。
通道是如何分配的?
見下面的這個表:
如何來用DMA?
確定數(shù)據(jù)來源,確定數(shù)據(jù)目的地,選擇使用哪個通道,設定傳輸多少個數(shù)據(jù),設定數(shù)據(jù)傳遞模式等等就可以了。且讀一下STM32提供給我們的例子。
//////////////////////////////////////////
……
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR3_Address;
//設定外圍設備的地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;
//設定內(nèi)存地址,SRC_Buffer是前面定義的一個數(shù)組
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //方向控制
DMA_InitStructure.DMA_BufferSize = 3; //緩沖區(qū)大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外圍地址增量控制
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存地址增量控制
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//DMA_PeripheralDataSize_HalfWord的值為0x100,后一個為0x400,在在stm32f10x_dma.h中定義,用于決定存儲器數(shù)據(jù)寬度
*/
pwm相關文章:pwm原理
評論