日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年08月10日(星期日)

正在發(fā)生

2019年08月10日 | STM32串口DMA發(fā)送中斷配置

發(fā)布者:Xiaoxue666 來源: eefocus關鍵字:STM32  串口  DMA發(fā)送  中斷配置 手機看文章 掃描二維碼
隨時隨地手機看文章

本文以STM32F1xx的串口1為例,簡單呈現(xiàn)下使用DMA中斷連續(xù)發(fā)送的代碼

串口DMA配置通??梢苑譃?個部分:

1.串口配置

2.DMA配置


串口配置

void UART1_Init(u32 bound){

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

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

  

//USART1_TX   GPIOA.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; //復用推挽輸出

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


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

  //USART1_RX   GPIOA.10初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

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

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


NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

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

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

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

//USART 初始化設置

USART_InitStructure.USART_BaudRate = bound;//串口波特率

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

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位

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); //初始化串口1

USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);  //使能空閑中斷

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

}


2.DMA配置

本代碼封裝了下DMA配置


void DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u32 dma_dir,u32 priority,u16 bufsize)

{

DMA_InitTypeDef DMA_InitStructure;

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

  DMA_DeInit(DMA_CHx);   //將DMA的通道1寄存器重設為缺省值

DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外設ADC基地址

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

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

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

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

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_Normal;  //工作在正常緩存模式

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

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


void UART_DMA_Config{

NVIC_InitTypeDef NVIC_InitStructure;


 //配置串口1發(fā)送DMA

DMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)USART1_TX_BUF,DMA_DIR_PeripheralDST,DMA_Priority_Medium,0);//DMA1通道4,外設為串口1Tx,存儲器為USART_TX_BUF 

//配置串口1接收DMA

DMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)USART1_RX_BUF,DMA_DIR_PeripheralSRC,DMA_Priority_Medium,0);//DMA1通道5,外設為串口1Rx,存儲器為USART_RX_BUF


NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;

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

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

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

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


DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE); //開USART1 Tx DMA中斷

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  //使能串口3的DMA接收

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

}


最后是中斷函數(shù)


void USART1_IRQHandler(void)            //串口1中斷服務程序

{

if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  

{  

USART1_RX_CNT = USART1->SR;  

USART1_RX_CNT = USART1->DR; //清USART_IT_IDLE標志

DMA_Cmd(DMA1_Channel5,DISABLE);  

USART_ITConfig(USART1, USART_IT_IDLE, DISABLE); //靜止中斷,防覆蓋

USART1_RX_CNT = USART1_REC_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);  

DMA_SetCurrDataCounter(DMA1_Channel5,USART1_REC_LEN);  

DMA_Cmd(DMA1_Channel5,ENABLE);  

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); 

}   

}


 //串口1 TX DMA終端

void DMA1_Channel4_IRQHandler(void)   

{

if(DMA_GetITStatus(DMA1_FLAG_TC4))

{

DMA_ClearFlag(DMA1_FLAG_TC4);

if(Txed_Num > Max_Tx_Cnt)

{

Txed_Num = 0;

return;

}

TX_DATA(DATA_Len);

Txed_Num = Txed_Num + 1;

}

}


//DMA發(fā)送代碼

void TX_DATA(u8 len)

{

while(DMA_GetCurrDataCounter(DMA1_Channel4)!=0); //等待通道7傳輸完成   

DMA_Cmd(DMA1_Channel4, DISABLE );  //關閉 指示的通道        

DMA_SetCurrDataCounter(DMA1_Channel4,len);//DMA通道的DMA緩存的大小

DMA_Cmd(DMA1_Channel4, ENABLE);           //開啟DMA傳輸

}


總結

串口DMA發(fā)送中斷配置時,易遺漏


DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);


本例是DMA發(fā)送中斷在 連續(xù)、分次發(fā)送 場景下的應用。



關鍵字:STM32  串口  DMA發(fā)送  中斷配置 引用地址:STM32串口DMA發(fā)送中斷配置

上一篇:正點原子stm32模擬IIC
下一篇:STM32三線檢測八個按鍵(74HC165)

推薦閱讀

機器人一詞的起源可以追溯到1920年,捷克斯洛伐克作家卡雷爾·恰佩克在他的小說里用Robot來命名人制的奴仆,表示人們制造的類人機器人。不過,說到機器人產(chǎn)業(yè),近幾年才真正開始盛行,大量的工業(yè)機器人被應用到生產(chǎn)線上,把工人從惡劣的工作崗位解放出來,同時提升了工廠的效率。根據(jù)國際機器人聯(lián)盟IFR的統(tǒng)計,去年中國機器人需求增長速度達到58%之高,全...
作為自動駕駛行業(yè)的一員老將,Bibhrajit Halder 在多家知名公司留下過自己的印記。初出茅廬時,Halder效力于卡特彼勒(Caterpillar);后加入福特;接著是法拉第未來和蘋果;如今走上創(chuàng)業(yè)之路,Bibhrajit Halder 任新創(chuàng)公司 SafeAI 的聯(lián)合創(chuàng)始人兼 CEO。 Halder 的職業(yè)軌跡即是自動駕駛坎坷歷史的縮影。而現(xiàn)在的他,依然走在行業(yè)前沿。 2004 年,...
“基于現(xiàn)有兩款車型(π1和π3)的升級版型將于8月底上市,我們還將基于‘π’平臺推出一系列精品小車”。在提出“重新踏上二次創(chuàng)業(yè)之路”三個月后,新造車企云度新能源汽車股份有限公司(下稱“云度新能源”)終于正式對外發(fā)聲,想要重回新能源汽車主流舞臺。從2015年成立至今,五年時間云度新能源完成了“從0到1”的積累過程,并曾一度被認為會是攪動新...
#include <STC89C5xRC.H>//之前用輪詢方式實現(xiàn)了串口的通訊,這里使用前后臺系統(tǒng)結架構實現(xiàn)功能int s;void UART_INT() interrupt 4//UART中斷處理程序{ if(RI == 1)//如果收到數(shù)據(jù) { RI = 0; s = SBUF;//將收到的數(shù)據(jù)讀取出來 SBUF = s;//將讀取到的數(shù)據(jù)發(fā)送回PC端 } else if(TI ==...

史海拾趣

問答坊 | AI 解惑

讓大家看看幾款奇特的手表,

這款電子表采用日式設計。表盤有四列從0至9的數(shù)字組成,前兩列表示小時,后兩列表示分鐘。當您按動右側按鈕,表示當前時間的數(shù)字會被藍色LED燈點亮。您也可以通過設置,讓時間定時顯示,比如間隔10分鐘顯示一次等等。 這款手表表盤形狀十分奇特, ...…

查看全部問答∨

快速傅立葉變換的應用

快速傅立葉變換的應用 作者:mxd(fpgamxd@sina.com) 只要是理工科畢業(yè)的朋友,都學過傅立葉級數(shù)與傅立葉變換,但真正要與實際應用聯(lián)系起來,用它來闡述應用中的各類問題,我們總會感覺概念模糊,似懂非懂,不知從何說起。是的,作者和你一 ...…

查看全部問答∨

從51到ARM

一本書,RT [ 本帖最后由 huchuan987 于 2010-7-15 01:30 編輯 ]…

查看全部問答∨

VirtualStart 問題

關于VirtualStart的問題,差不多看了論壇上關于虛地址的帖子,可是調(diào)試過程中,燈仍然不工作,郁悶,幫我看下吧,謝謝 oalAddressTable如下: ALIGN g_oalAddressTable         DCD     0x ...…

查看全部問答∨

問一個insert into 變量的問題!

用的是sqlite數(shù)據(jù)庫?,F(xiàn)在有一個語句,想插入記錄 result = sqlite3_exec( db, \"insert into List(NUMBER)  values (此處為變量名)\", 0, 0, &zErrMsg); 變量為m_no 請問 括號內(nèi)應該如何寫?我編譯的時候總是有錯誤,請大家指點下!謝 ...…

查看全部問答∨

關于關于多時鐘模塊中復位同步器的問題

在異步復位中,典型的復位形式如下面代碼所示:always @ (posedge clk or negedge rst)     begin ....  end在這種復位模式下,一般而言是要加入一個synchronizer,代碼如下所示:reg syn_rst, rff1;always @ (posedge CLK or ...…

查看全部問答∨

周立功LMLINK漲價了,賣300塊。我準備做個PCB,有人響應嗎?

周立功LMLINK漲價了,賣300塊。我準備做個PCB,有人響應嗎?…

查看全部問答∨

a8什么時候出來啊

                                 kandaoyoushouquan…

查看全部問答∨

I/O口

我剛學STM32,用IO口時把PA8-PA15設置成帶上拉輸入,8、9、10、12、13、15是正常的,空腳時電平在3.2左右,但11和14的電平很低,為什么?是因為這兩個管腳有什么特殊功能嗎?望路過的大俠教我,不勝感激…

查看全部問答∨
小廣播
設計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved