日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]使用DMA從串口讀數(shù)據(jù)到內(nèi)存和從內(nèi)存搬數(shù)據(jù)到串口一樣,只是要注意所使用的DMA通道不一樣。當(dāng)配置好后,如果串口上有數(shù)據(jù)傳輸,DMA就自動(dòng)把數(shù)據(jù)搬到內(nèi)存中。當(dāng)工作在正常模式,DMA搬運(yùn)了設(shè)定長(zhǎng)度的數(shù)據(jù)后,會(huì)產(chǎn)生中斷

使用DMA從串口讀數(shù)據(jù)到內(nèi)存和從內(nèi)存搬數(shù)據(jù)到串口一樣,只是要注意所使用的DMA通道不一樣。

當(dāng)配置好后,如果串口上有數(shù)據(jù)傳輸,DMA就自動(dòng)把數(shù)據(jù)搬到內(nèi)存中。

當(dāng)工作在正常模式,DMA搬運(yùn)了設(shè)定長(zhǎng)度的數(shù)據(jù)后,會(huì)產(chǎn)生中斷標(biāo)志,然后DMA就停止工作了,如果再有數(shù)據(jù)也不接收了。

當(dāng)工作在循環(huán)模式,DMA搬運(yùn)了設(shè)定長(zhǎng)度的數(shù)據(jù)后,會(huì)產(chǎn)生中斷標(biāo)志,如果再有數(shù)據(jù),DMA會(huì)循環(huán)保存到內(nèi)存中,覆蓋前面的數(shù)據(jù)。

初始化程序:


voiduart_init_DMA_IN(u32bound)

{

//GPIO端口設(shè)置

GPIO_InitTypeDefGPIO_InitStructure;

USART_InitTypeDefUSART_InitStructure;

NVIC_InitTypeDefNVIC_InitStructure;

DMA_InitTypeDefDMA_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//使能USART1,GPIOA時(shí)鐘

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA傳輸

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時(shí)鐘

USART_DeInit(USART1);//復(fù)位串口1

//USART1_TXPA.9

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9

//USART1_RXA.10

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入

GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA10

//Usart1NVIC配置

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級(jí)3

NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//子優(yōu)先級(jí)3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);//根據(jù)指定的參數(shù)初始化VIC寄存器

NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel5_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//搶占優(yōu)先級(jí)3

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//子優(yōu)先級(jí)3

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能

NVIC_Init(&NVIC_InitStructure);//根據(jù)指定的參數(shù)初始化VIC寄存器

//USART初始化設(shè)置

USART_InitStructure.USART_BaudRate=bound;//一般設(shè)置為9600;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式

USART_InitStructure.USART_StopBits=USART_StopBits_1;//一個(gè)停止位

USART_InitStructure.USART_Parity=USART_Parity_No;//無奇偶校驗(yàn)位

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發(fā)模式

USART_Init(USART1,&USART_InitStructure);//初始化串口

//USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//開啟空閑中斷

USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);//使能串口1DMA接收

USART_Cmd(USART1,ENABLE);//使能串口

//相應(yīng)的DMA配置

DMA_DeInit(DMA1_Channel5);//將DMA的通道5寄存器重設(shè)為缺省值串口1對(duì)應(yīng)的是DMA通道5

DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1->DR;//DMA外設(shè)ADC基地址

DMA_InitStructure.DMA_MemoryBaseAddr=(u32)value;//DMA內(nèi)存基地址

DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//數(shù)據(jù)傳輸方向,從外設(shè)讀取發(fā)送到內(nèi)存

DMA_InitStructure.DMA_BufferSize=DMA_Rec_Len;//DMA通道的DMA緩存的大小

DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外設(shè)地址寄存器不變

DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//內(nèi)存地址寄存器遞增

DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//數(shù)據(jù)寬度為8位

DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;//數(shù)據(jù)寬度為8位

DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//工作在正常緩存模式

DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//DMA通道x擁有中優(yōu)先級(jí)

DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA通道x沒有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏?/p>

DMA_Init(DMA1_Channel5,&DMA_InitStructure);//根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道

DMA_Cmd(DMA1_Channel5,ENABLE);//正式驅(qū)動(dòng)DMA傳輸

DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE);

}


中斷服務(wù)程序:


[objc]view plaincopy

voidDMA1_Channel5_IRQHandler(void)

{

intt;

if(DMA_GetFlagStatus(DMA1_FLAG_TC5)==SET)

{

for(t=0;t<6;t++)

{

data[t]=value[t];

}

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

DMA_ClearFlag(DMA1_FLAG_TC5);

}

}



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