本節(jié)目標(biāo):
通過DMA,無需中斷,接收不定時(shí)長的串口數(shù)據(jù)
描述:
當(dāng)在串口多數(shù)據(jù)傳輸下,CPU會產(chǎn)生多次中斷來接收串口數(shù)據(jù),這樣會大大地降低CPU效率,同時(shí)又需要CPU去做其它更重要的事情,我們應(yīng)該如何來優(yōu)化?
比如四軸飛行器,當(dāng)在不停地獲取姿態(tài)控制方向時(shí),又要去接收串口數(shù)據(jù).
答:使用DMA,無需CPU中斷便能實(shí)現(xiàn)接收串口數(shù)據(jù)
1.DMA介紹
DMA,全稱為: Direct Memory Access,即直接存儲器訪問, DMA 傳輸方式無需 CPU 直接
控制傳輸,通過硬件為 RAM 與 I/O 設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,能使 CPU 的效率大為提高。
2在main()中調(diào)用串口配置函數(shù),初始化串口后,然后使能UART1_RX的DMA接收
2.1在main()函數(shù)中,使用以下函數(shù)來調(diào)用配置函數(shù):
uart_init(115200); //串口初始化為115200
2.2 uart_init()函數(shù)如下:
void uart_init(u32 bound){
//GPIO端口設(shè)置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時(shí)鐘
//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; //復(fù)用推挽輸出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//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
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為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); //初始化串口1
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能串口1的DMA接收
}
3.在main()中調(diào)用DMA配置函數(shù),然后初始化DMA1的UART1_RX通道后,便使能串口1和DMA
3.1如下圖所示,UART1_RX位于DMA1通道5:
所以使用庫函數(shù)中變量DMA1_Channel5 來配置UART1_RX.
3.2在main()函數(shù)中,定義一個(gè)接收數(shù)組,使用以下3個(gè)參數(shù)來調(diào)用配置函數(shù):
u8 USART_RX_BUF[35]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).末字節(jié)為換行符
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)USART_RX_BUF,35);//DMA1通道5,外設(shè)為串口1,存儲器為SendBuff,長度35,
3.3 MYDMA_Config()函數(shù)如下,最后會調(diào)用MYDMA_Enable()開始一次DMA傳輸!:
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA傳輸
DMA_DeInit(DMA_CHx); //將DMA的通道1寄存器重設(shè)為缺省值
DMA1_MEM_LEN=cndtr;
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外設(shè)基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA內(nèi)存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //數(shù)據(jù)傳輸方向,從外設(shè)到內(nèi)存
DMA_InitStructure.DMA_BufferSize = cndtr; //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_Normal; //工作在正常模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x擁有中優(yōu)先級
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x沒有設(shè)置為內(nèi)存到內(nèi)存?zhèn)鬏?p>DMA_Init(DMA_CHx, &DMA_InitStructure); //根據(jù)DMA_InitStruct中指定的參數(shù)初始化DMA的通道USART1_Rx_DMA 所標(biāo)識的寄存器
USART_Cmd(USART1, ENABLE); //使能串口1
DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
MYDMA_Enable(DMA1_Channel5);//開始一次DMA傳輸!
}
3.4 MYDMA_Enable()函數(shù)如下:
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_Cmd(DMA_CHx, DISABLE ); //關(guān)閉USART1 TX DMA1 所指示的通道
DMA_SetCurrDataCounter(DMA_CHx,DMA1_MEM_LEN);//從新設(shè)置緩沖大小,指向數(shù)組0
DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 TX DMA1 所指示的通道
}
4.然后當(dāng)USART_RX_BUF[0]是有數(shù)據(jù)了,適當(dāng)?shù)难訒r(shí)10ms,讓UCOS繼續(xù)操作其它進(jìn)程,就能收到不定長的所有數(shù)據(jù)啦
代碼如下(也可以放在無操作系統(tǒng)的while中):
if(USART_RX_BUF[0]) //數(shù)組0有數(shù)據(jù)了,說明DMA開始接收一段數(shù)據(jù)
{
delay_ms(10); //延時(shí)10ms,讓DMA繼續(xù)接收后面數(shù)據(jù)的同時(shí),也能跑跑其它進(jìn)程
printf("1:%srn",USART_RX_BUF); //打印
memset(USART_RX_BUF,0,35); //清空數(shù)組
MYDMA_Enable(DMA1_Channel5);//開始一次DMA傳輸!
}
上面代碼中延時(shí)10ms,又能接受多少數(shù)據(jù)?
在波特率115200下,1S能接受115200位bit,然后一個(gè)字節(jié)為8位bit,再加上一位停止位,所以可以接受12800個(gè)數(shù)據(jù).
那么10ms,可以接受128個(gè)數(shù)據(jù),如果數(shù)據(jù)數(shù)組較大,可以適當(dāng)?shù)奶岣哐訒r(shí)時(shí)間
5.測試效果
如下圖所示,輸入多少就回顯多少,說明已經(jīng)成功,我這里是設(shè)置的接收數(shù)組大小為35,如果需要更長的數(shù)據(jù),就改變數(shù)組大小即可
上一篇:STM32-對芯片啟動(dòng)讀保護(hù),實(shí)現(xiàn)加密(詳解)
下一篇:最后一頁
推薦閱讀
史海拾趣
Actel Corporation 是一家曾經(jīng)在可編程邏輯器件(FPGA)領(lǐng)域有所建樹的公司。以下是該公司發(fā)展的五個(gè)相關(guān)故事:
公司創(chuàng)立與初期發(fā)展: Actel Corporation成立于1985年,總部位于美國加利福尼亞州。公司創(chuàng)始人包括Bernard Vonderschmitt等人,致力于研發(fā)和生產(chǎn)可編程邏輯器件。最初,Actel專注于開發(fā)用于航空航天和國防應(yīng)用的高可靠性FPGA芯片,以滿足對于高度可靠性和耐輻射性的需求。
技術(shù)創(chuàng)新與產(chǎn)品推出: Actel在FPGA技術(shù)領(lǐng)域取得了一系列創(chuàng)新成果。公司引入了基于非揮發(fā)性技術(shù)(NVCM)的可編程邏輯器件,該技術(shù)使得FPGA芯片能夠在斷電后保持配置狀態(tài),具有低功耗、高可靠性等優(yōu)點(diǎn)。Actel的產(chǎn)品涵蓋了不同規(guī)模和功耗要求的市場,廣泛應(yīng)用于航空航天、通信、工業(yè)控制等領(lǐng)域。
市場拓展與國際化發(fā)展: 隨著產(chǎn)品線的不斷完善和市場認(rèn)可度的提升,Actel逐步開拓了國內(nèi)外市場。公司在美國設(shè)立了銷售和技術(shù)支持中心,并與全球各地的合作伙伴建立了合作關(guān)系,進(jìn)一步拓展了國際業(yè)務(wù)。Actel的產(chǎn)品遠(yuǎn)銷至歐洲、亞洲等地區(qū),贏得了廣泛的市場認(rèn)可。
并購與重組: 隨著FPGA市場競爭的加劇和市場需求的變化,Actel在發(fā)展過程中進(jìn)行了一系列并購和重組。其中最重要的一次是2010年,Actel被Microsemi Corporation收購,成為其子公司。這一并購使得Actel能夠借助Microsemi的資源和實(shí)力,進(jìn)一步提升產(chǎn)品競爭力和市場地位。
終止品牌: 盡管Actel曾經(jīng)在FPGA市場取得一定成就,但隨著時(shí)間的推移和市場競爭的加劇,Actel品牌逐漸退出市場。2012年,Microsemi宣布停止使用Actel品牌,并將其產(chǎn)品線整合到Microsemi旗下,標(biāo)志著Actel品牌的終結(jié)。
為了確保產(chǎn)品質(zhì)量和穩(wěn)定性,Bomar Interconnect公司建立了嚴(yán)格的質(zhì)量管理體系。公司引進(jìn)了先進(jìn)的質(zhì)量檢測設(shè)備和方法,對原材料、生產(chǎn)過程、成品進(jìn)行全面檢測和控制。同時(shí),公司還加強(qiáng)了員工培訓(xùn),提高了員工的質(zhì)量意識和操作技能。這些措施有效提升了產(chǎn)品的質(zhì)量水平,降低了不良品率,為客戶提供了更加可靠的產(chǎn)品和服務(wù)。
隨著電子行業(yè)的快速發(fā)展和市場競爭的加劇,Catalyst / ON Semiconductor公司面臨著前所未有的挑戰(zhàn)。為了應(yīng)對這些變革,公司進(jìn)行了一系列的轉(zhuǎn)型和調(diào)整。公司優(yōu)化了組織架構(gòu)和管理流程,提高了運(yùn)營效率;同時(shí),公司還加大了對新興技術(shù)的投入和研發(fā)力度,以適應(yīng)市場的不斷變化。
為了進(jìn)一步提升公司的技術(shù)實(shí)力和品牌影響力,智浦欣公司積極尋求與國際知名企業(yè)的合作機(jī)會。經(jīng)過多次溝通和洽談,公司成功與一家國際知名半導(dǎo)體企業(yè)達(dá)成了戰(zhàn)略合作協(xié)議。雙方將在技術(shù)研發(fā)、產(chǎn)品推廣和市場開拓等方面展開深度合作。通過這一合作,智浦欣公司不僅獲得了寶貴的技術(shù)支持和市場資源,還進(jìn)一步提升了其品牌形象和市場份額。
澤耀科技(Ashining)在創(chuàng)立之初,面臨著資金短缺、市場競爭激烈和技術(shù)難題等挑戰(zhàn)。然而,公司的創(chuàng)始人憑借對電子行業(yè)的深刻理解和堅(jiān)定信念,帶領(lǐng)團(tuán)隊(duì)攻堅(jiān)克難,不斷研發(fā)創(chuàng)新。他們深入市場調(diào)研,準(zhǔn)確把握消費(fèi)者需求,成功推出了一款具有競爭力的電子產(chǎn)品,為公司的發(fā)展打開了局面。
2017年,電子行業(yè)迎來了一場引人矚目的收購案。新思科技(Synaptics),一家在人機(jī)界面交互開發(fā)解決方案領(lǐng)域具有領(lǐng)導(dǎo)地位的公司,宣布以3.95億美元現(xiàn)金和726,666只普通股收購科勝訊系統(tǒng)公司(Conexant Systems)。這一收購行動(dòng)不僅增強(qiáng)了Synaptics在智能家居領(lǐng)域的語音和音頻處理解決方案的能力,也標(biāo)志著Conexant正式成為Synaptics大家庭的一員。通過此次收購,兩家公司實(shí)現(xiàn)了技術(shù)資源和市場優(yōu)勢的互補(bǔ),共同開啟了新的發(fā)展篇章。
現(xiàn)在在市場上買到的攝像機(jī)標(biāo)注的是480線的, 但實(shí)際上的效果卻是420線的, 我們?nèi)绾螀^(qū)分呢? 這是我在網(wǎng)上查的一個(gè)資料,也希望大家說說自己的看法。 3142+405 420TVL 經(jīng)濟(jì)適用 3142+633 420TVL 剛出來的CCD,用的廠家比較少,照度很低,但是偏色 ...… 查看全部問答∨ |
如何將鼠標(biāo)數(shù)據(jù)獨(dú)立讀出來? 各位前輩,我是大菜鳥。有一個(gè)問題一直困擾我:能否將一個(gè)USB鼠標(biāo)獨(dú)立于計(jì)算機(jī)應(yīng)用?也就是將鼠標(biāo)作為一個(gè)微距離傳感器應(yīng)用。因?yàn)槭髽?biāo)在移動(dòng)時(shí)可以敏感微小的位移。關(guān)鍵是如何將鼠標(biāo)的數(shù)據(jù)讀出來?因?yàn)槭髽?biāo)的USB接口只有四條線,兩條電源線, ...… 查看全部問答∨ |
11月10日Linux/WinCE/VxWorks免費(fèi)講座(上海) 活動(dòng)規(guī)模:200人 講座主要分為3個(gè)專題: 專題1、嵌入式Linux開發(fā)應(yīng)用介紹 &n ...… 查看全部問答∨ |
|
在C語言編程中經(jīng)常會遇到全局變量。全局變量的定義一般采用下面的方式 .C文件中定義 unsigned int gVariable; .h文件中聲明 extern unsigned int gVariable; 這樣做的目的是防止變量重復(fù)聲明,提高編譯效率。但是如果這樣的定于如果安排不好就 ...… 查看全部問答∨ |
|
各位請幫我看一下,當(dāng)程序down時(shí)芯片ram啟動(dòng)運(yùn)行后,每次IDE的break或reset后都出現(xiàn)下面提示信息,這是咋回事啊.請熱心人解答,謝謝了Fri Dec 21 20:04:36 2007: The stack \'CSTACK\' is filled&nb ...… 查看全部問答∨ |
VHDL數(shù)據(jù)類型與數(shù)據(jù)類型轉(zhuǎn)換 A. 標(biāo)準(zhǔn)數(shù)據(jù)類型 1) 整數(shù)類型(INTEGER) VARIBLE A: INTEGER RANGE -128 TO 128 范圍  ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 基于單片機(jī)的LED自適應(yīng)調(diào)光系統(tǒng)
- 智能小車主控系統(tǒng)電路設(shè)計(jì)
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- 2025上半年移動(dòng)機(jī)器人行業(yè)融資一覽:共38起,總額超50億元
- 刷新世界紀(jì)錄,國產(chǎn)機(jī)器狗速度突破每秒10米
- 機(jī)構(gòu):2025年1-5月全球動(dòng)力電池裝機(jī)369.8GWh
- 定制還是自研? 汽車芯片戰(zhàn)略背后的邏輯分析
- 電氣化和智能化,會給汽車上的 MEMS 帶來什么變化?
- 狂飆的吉利新能源,與李書福的動(dòng)力電池江湖
- 充電與換電:電動(dòng)汽車補(bǔ)能方式的發(fā)展漫談
- RTL級動(dòng)態(tài)電壓調(diào)節(jié)(DVFS)建模:汽車電子中的多域功耗協(xié)同控制
- 1-5月全球動(dòng)力電池裝車量TOP10:中企僅一家市場份額下降
- 淺談電動(dòng)汽車充電中漏電流的選型及充電方案測試常見問題
- 詳述項(xiàng)目申請,可獲 TI Stellaris開發(fā)板!
- 泰克 MSO6B 探索營:技術(shù)指標(biāo)大挑戰(zhàn),闖關(guān)贏好禮
- 駿龍科技攜手ADI有獎(jiǎng)直播:隔離系統(tǒng)設(shè)計(jì)的隱藏成本
- 幫助他人,成就自己:EEWORLD月度問答榜(第4期)
- 【MPS有獎(jiǎng)活動(dòng)】分享【PCB設(shè)計(jì)、焊接】問題或經(jīng)驗(yàn)
- 免費(fèi)申請|Maxim 高性能模擬工具包(內(nèi)含78個(gè)器件)
- 【干貨視頻】走進(jìn)TE智能制造工廠,追蹤連接器綠色生產(chǎn)全過程
- TI有獎(jiǎng)直播|精密 ADC 在變送器中的應(yīng)用
- 【EEWORLD大學(xué)堂】玩轉(zhuǎn)TI 易電源
- 可穿戴市場毫無水花,問題到底出在哪里?
- 李彥宏掌舵的百度AI有了什么新花樣?
- 地鐵試點(diǎn)刷臉安檢,攝像頭和掃碼口打造乘地鐵“快速通道
- 柔宇柔記等多款產(chǎn)品榮獲五項(xiàng)美國IDA國際設(shè)計(jì)大獎(jiǎng)
- 結(jié)合區(qū)塊鏈技術(shù),XnBay 推動(dòng)臺灣第一個(gè)共享經(jīng)濟(jì)儲存平臺
- IPC電子織物標(biāo)準(zhǔn)委員會發(fā)布可洗性電子織物白皮書
- 終端側(cè)人工智能如何為生物識別帶來廣闊前景
- 一文看懂:"邊緣計(jì)算"究竟是什么?為何潛力無限?
- 除了以次充好,Tripp還爆料了哪些特斯拉電池的黑料?
- 柔性電子技術(shù)加速商業(yè)化?這些產(chǎn)品嘗鮮