www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 單片機 > 單片機
[導讀]在做實驗之前,首先必須明白什么是DMA,DMA的作用又體現(xiàn)在哪里。DMA,即直接內(nèi)存存儲,在一些數(shù)據(jù)的傳輸中,采用DMA方式,從而將CPU解放出來。讓CPU有足夠的時間處理其他的事情。stm32使用DMA的相關(guān)操作:1、DMA的配

在做實驗之前,首先必須明白什么是DMA,DMA的作用又體現(xiàn)在哪里。

DMA,即直接內(nèi)存存儲,在一些數(shù)據(jù)的傳輸中,采用DMA方式,從而將CPU解放出來。讓CPU有足夠的時間處理其他的事情。

stm32使用DMA的相關(guān)操作:

1、DMA的配置

要配置的有DMA傳輸通道選擇,傳輸?shù)某蓡T和方向、普通模式還是循環(huán)模式等等。

void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
//DMA設(shè)置:
//設(shè)置DMA源:內(nèi)存地址&串口數(shù)據(jù)寄存器地址
//方向:內(nèi)存-->外設(shè)
//每次傳輸位:8bit
//傳輸大小DMA_BufferSize=SENDBUFF_SIZE
//地址自增模式:外設(shè)地址不增,內(nèi)存地址自增1
//DMA模式:一次傳輸,非循環(huán)
//優(yōu)先級:中
DMA_DeInit(DMA1_Channel4);//串口1的DMA傳輸通道是通道4
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外設(shè)作為DMA的目的端
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//傳輸大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設(shè)地址不增加
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//內(nèi)存地址自增1
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

//DMA_Mode_Normal(只傳送一次),DMA_Mode_Circular (不停地傳送)
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//(DMA傳送優(yōu)先級為中等)
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
}

注:

1、傳輸通道:通過查表,串口1的發(fā)送對應(yīng)的是DMA的通道4,所以此處選擇通道4.

2、DMA傳輸方式:

(1) DMA_Mode_Normal,正常模式,當一次DMA數(shù)據(jù)傳輸完后,停止DMA傳送,對于上例而言,就是DMA_PeripheralDataSize_Byte個字節(jié)的傳送完成后,就停止傳送。

(2)DMA_Mode_Circular

循環(huán)模式,當傳輸完一次后,重新接著傳送,永不停息。

2、外設(shè)的DMA方式設(shè)置

將串口1設(shè)置成DMA模式:

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

3、待傳輸數(shù)據(jù)的定義和初始化

#define SENDBUFF_SIZE10240
vu8 SendBuff[SENDBUFF_SIZE];

for(i=0;i{
SendBuff[i] = i+'0';
}
4、開始DMA傳輸(使能對應(yīng)的DMA通道)
DMA_Cmd(DMA1_Channel4, ENABLE);

5、DMA傳輸?shù)耐瓿?/p>

while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
{
LED_1_REV;//LED翻轉(zhuǎn)
Delay();//浪費時間
}

當傳輸完成后,就會跳出上面的死循環(huán)。

STM32筆記(四)DMA、USART的演示

 該連載作者九九的博客:http://www.eefocus.com/myspace/blog/index_102780.html


原帖由私奔于2009-01-04 14:30發(fā)表:
  這里有個小小的例子,來演示DMA模塊與系統(tǒng)程序并行工作。
  用串口以低波特率發(fā)送一個10K的數(shù)據(jù),花費近10s時間,此時按照以往方法,CPU要不斷等待數(shù)據(jù)發(fā)送、送數(shù)據(jù);或者送數(shù)據(jù)、進中斷、送數(shù)據(jù),處理起來比較消耗時間。
  使用了DMA功能以后,用戶程序中只需配置好DMA,開啟傳輸后,再也不需要操心,10K數(shù)據(jù)完成后會有標志位或中斷產(chǎn)生,期間可以做任何想做的事,非常方便。
  這個是相應(yīng)的代碼例子,基于STM32F103VBT6





#include "stm32f10x_lib.h"
#include "stdio.h"



#define USART1_DR_Base0x40013804



#define SENDBUFF_SIZE10240
vu8 SendBuff[SENDBUFF_SIZE];
vu8 RecvBuff[10];
vu8 recv_ptr;


void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void DMA_Configuration(void);
void USART1_Configuration(void);

int fputc(int ch, FILE *f);
void Delay(void);



int main(void)
{
u16 i;
#ifdef DEBUG
debug();
#endif
recv_ptr = 0;

RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
DMA_Configuration();
USART1_Configuration();

printf("rnSystem Start...rn");
printf("Initialling SendBuff... rn");
for(i=0;i{
SendBuff[i] = i&0xff;
}
printf("Initial success!rnWaiting for transmission...rn");
//發(fā)送去數(shù)據(jù)已經(jīng)準備好,按下按鍵即開始傳輸
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));

printf("Start DMA transmission!rn");

//這里是開始DMA傳輸前的一些準備工作,將USART1模塊設(shè)置成DMA方式工作
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
//開始一次DMA傳輸!
DMA_Cmd(DMA1_Channel4, ENABLE);

//等待DMA傳輸完成,此時我們來做另外一些事,點燈
//實際應(yīng)用中,傳輸數(shù)據(jù)期間,可以執(zhí)行另外的任務(wù)
while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
{
LED_1_REV;//LED翻轉(zhuǎn)
Delay();//浪費時間
}
//DMA傳輸結(jié)束后,自動關(guān)閉了DMA通道,而無需手動關(guān)閉
//下面的語句被注釋
//DMA_Cmd(DMA1_Channel4, DISABLE);

printf("rnDMA transmission successful!rn");



while (1)
{
}
}


int fputc(int ch, FILE *f)
{
//USART_SendData(USART1, (u8) ch);
USART1->DR = (u8) ch;


while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
{
}

return ch;
}


void Delay(void)
{
u32 i;
for(i=0;i<0xF0000;i++);
return;
}


void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;

//使能外部晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部晶振穩(wěn)定
HSEStartUpStatus = RCC_WaitForHSEStartUp();
//如果外部晶振啟動成功,則進行下一步操作
if(HSEStartUpStatus==SUCCESS)
{
//設(shè)置HCLK(AHB時鐘)=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);

//PCLK1(APB1) = HCLK/2
RCC_PCLK1Config(RCC_HCLK_Div2);

//PCLK2(APB2) = HCLK
RCC_PCLK2Config(RCC_HCLK_Div1);

//FLASH時序控制
//推薦值:SYSCLK = 0~24MHzLatency=0
//SYSCLK = 24~48MHzLatency=1
//SYSCLK = 48~72MHzLatency=2
FLASH_SetLatency(FLASH_Latency_2);
//開啟FLASH預(yù)取指功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//PLL設(shè)置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//啟動PLL
RCC_PLLCmd(ENABLE);
//等待PLL穩(wěn)定
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//系統(tǒng)時鐘SYSCLK來自PLL輸出
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//切換時鐘后等待系統(tǒng)時鐘穩(wěn)定
while(RCC_GetSYSCLKSource()!=0x08);



}

//下面是給各模塊開啟時鐘
//啟動GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,
ENABLE);
//啟動AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//啟動USART1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//啟動DMA時鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

}




void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

//PC口4567腳設(shè)置GPIO輸出,推挽 2M
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

//KEY2 KEY3 JOYKEY
//位于PD口的3 4 11-15腳,使能設(shè)置為輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);

//USART1_TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

//USART1_RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

}




void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

#ifdefVECT_TAB_RAM
// Set the Vector Table base location at 0x20000000
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
// Set the Vector Table base location at 0x08000000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

//設(shè)置NVIC優(yōu)先級分組為Group2:0-3搶占式優(yōu)先級,0-3的響應(yīng)式優(yōu)先級
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//串口接收中斷打開
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}



void USART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART1, &USART_InitStructure);

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);
}


void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
//DMA設(shè)置:
//設(shè)置DMA源:內(nèi)存地址&串口數(shù)據(jù)寄存器地址
//方向:內(nèi)存-->外設(shè)
//每次傳輸位:8bit
//傳輸大小DMA_BufferSize=SENDBUFF_SIZE
//地址自增模式:外設(shè)地址不增,內(nèi)存地址自增1
//DMA模式:一次傳輸,非循環(huán)
//優(yōu)先級:中
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉