本文以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模擬IIC
下一篇:STM32三線檢測八個按鍵(74HC165)
推薦閱讀
史海拾趣
隨著公司實力的不斷增強,Clever Little Box開始將目光投向國際市場。公司制定了國際化戰(zhàn)略,通過參加國際展覽、建立海外銷售渠道等方式,積極開拓海外市場。這一戰(zhàn)略的實施不僅為公司帶來了更廣闊的市場空間,還提高了公司的國際競爭力。
需要注意的是,以上故事是基于公開信息和一般企業(yè)發(fā)展規(guī)律進行的概括和推測,并非Clever Little Box公司的真實發(fā)展歷程。如需了解該公司更準確、具體的發(fā)展故事,建議查閱相關資料或訪問公司官方網(wǎng)站。
作為L3Harris Technologies的一部分,Harris(原Harris Corporation)在太空和航空領域也取得了重大突破。公司參與了多個太空任務和航空項目,為這些項目提供了先進的航天器和航空電子系統(tǒng)。這些系統(tǒng)不僅支持了復雜的航天任務,還提升了航空器的性能和安全性。L3Harris在太空和航空領域的持續(xù)投入和創(chuàng)新,為其在電子行業(yè)中的發(fā)展注入了新的動力。
為了進一步拓展業(yè)務領域和提升競爭力,DCX-CHOL Enterprises開始積極探索跨界合作的可能性。公司與多家知名企業(yè)和研究機構建立了戰(zhàn)略合作關系,共同開展技術研發(fā)和產(chǎn)品創(chuàng)新。通過跨界合作,DCX-CHOL Enterprises不僅獲得了更多的技術支持和市場資源,還拓寬了視野和思路,為公司未來的發(fā)展注入了新的活力。同時,公司還積極參與行業(yè)協(xié)會和組織的活動,加強與其他企業(yè)的交流與合作,共同推動電子行業(yè)的發(fā)展和進步。
隨著電子行業(yè)的快速發(fā)展,Capar Components Corp意識到只有不斷創(chuàng)新才能在市場中立足。于是,公司加大了對研發(fā)的投入,引進了一批高素質(zhì)的技術人才。經(jīng)過數(shù)年的努力,公司成功研發(fā)出了一種新型的高性能集成電路,這一創(chuàng)新不僅提升了產(chǎn)品的性能,還降低了生產(chǎn)成本,使公司在市場上獲得了更大的競爭優(yōu)勢。
作為一家有社會責任感的企業(yè),Capar Components Corp積極參與公益事業(yè),回饋社會。公司定期組織員工參與社區(qū)服務活動,幫助困難群體解決實際問題。此外,公司還設立了獎學金和助學金,支持教育事業(yè)的發(fā)展。這些舉措不僅彰顯了公司的社會責任感,也為公司樹立了良好的企業(yè)形象。
這些故事是基于一個虛構的電子行業(yè)公司背景編寫的,您可以根據(jù)Capar Components Corp的實際情況進行調(diào)整和修改,以使其更符合該公司的歷史和發(fā)展軌跡。請注意,由于我無法獲取Capar Components Corp的具體信息,這些故事僅為示例性質(zhì),并非真實事件。
在電子行業(yè)的初期,Capar Components Corp由幾位熱衷于電子技術的年輕人創(chuàng)立。他們憑借對技術的熱情和對市場的敏銳洞察,決定投身于電子元器件的研發(fā)與生產(chǎn)。然而,創(chuàng)業(yè)的道路并非一帆風順。資金短缺、技術瓶頸以及市場競爭激烈等問題接踵而至。但他們沒有放棄,通過不斷的技術創(chuàng)新和市場調(diào)研,成功研發(fā)出一款性能優(yōu)異的電容器,迅速打開了市場,奠定了公司的基礎。
這款電子表采用日式設計。表盤有四列從0至9的數(shù)字組成,前兩列表示小時,后兩列表示分鐘。當您按動右側按鈕,表示當前時間的數(shù)字會被藍色LED燈點亮。您也可以通過設置,讓時間定時顯示,比如間隔10分鐘顯示一次等等。 這款手表表盤形狀十分奇特, ...… 查看全部問答∨ |
|
快速傅立葉變換的應用 作者:mxd(fpgamxd@sina.com) 只要是理工科畢業(yè)的朋友,都學過傅立葉級數(shù)與傅立葉變換,但真正要與實際應用聯(lián)系起來,用它來闡述應用中的各類問題,我們總會感覺概念模糊,似懂非懂,不知從何說起。是的,作者和你一 ...… 查看全部問答∨ |
|
關于VirtualStart的問題,差不多看了論壇上關于虛地址的帖子,可是調(diào)試過程中,燈仍然不工作,郁悶,幫我看下吧,謝謝 oalAddressTable如下: ALIGN g_oalAddressTable DCD 0x ...… 查看全部問答∨ |
用的是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 ...… 查看全部問答∨ |
|
設計資源 培訓 開發(fā)板 精華推薦
- 2025中國工博會集成電路展區(qū)陣容揭曉!行業(yè)巨頭齊聚,共繪“芯”藍圖
- 消息稱三星在美“特斯拉專供”2nm 生產(chǎn)線 2026H2 投運,初期產(chǎn)能每月 1~1.5 萬片晶圓
- 黑客如何入侵軟件定義的汽車
- 中國首款國芯腦機智能頭環(huán)正式發(fā)布:非侵入式腦機 全自主國產(chǎn)芯片
- 自動駕駛中Transformer大模型會取代深度學習嗎?
- 這家面板廠在車載OLED領域或再迎新大單
- 激光雷達和攝像頭,誰會是機器人主要的“眼睛”?
- 毫米波雷達技術參數(shù)有哪些?毫米波雷達如何用于機器人導航
- 毫米波雷達技術有哪些優(yōu)勢?如何提高毫米波雷達測距精度
- 工業(yè)邊緣設備的安全啟動,TPM 2.0與可信執(zhí)行環(huán)境(TEE)的硬件級防護
- 今日直播 | 西門子半導體行業(yè)數(shù)字主線串享未來
- 嵌入式工程師AI挑戰(zhàn)營(進階):基于RV1106部署InsightFace算法,實現(xiàn)多人的實時人臉識別
- 你評論,我送禮!《玩轉TI MSP430 Launchpad》TI社區(qū)與EEWORLD聯(lián)合首發(fā)!
- 學C2000精品課程,低價搶購 C2000 LaunchPad!
- 開發(fā)板芯幣競拍,每日一款!今日競拍開發(fā)板:大黃蜂開發(fā)板
- 有獎體驗TouchGFX,開啟你的創(chuàng)意GUI之旅
- 【EEWORLD第三十八屆】2012年05月社區(qū)明星人物揭曉!