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

歷史上的今天

今天是:2025年07月07日(星期一)

2020年07月07日 | STM32-嵌入式學(xué)習(xí)筆記02-中斷應(yīng)用概述

發(fā)布者:紫色小貓 來源: eefocus關(guān)鍵字:STM32  中斷來  DMA接收  串口數(shù)據(jù) 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

本節(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ù)組大小即可

關(guān)鍵字:STM32  中斷來  DMA接收  串口數(shù)據(jù) 引用地址:STM32-嵌入式學(xué)習(xí)筆記02-中斷應(yīng)用概述

上一篇:STM32-對芯片啟動(dòng)讀保護(hù),實(shí)現(xiàn)加密(詳解)
下一篇:最后一頁

推薦閱讀

英格蘭隊(duì)在常規(guī)時(shí)間戰(zhàn)成1-1平后,點(diǎn)球大戰(zhàn)4-3,總比分5-4淘汰哥倫比亞。據(jù)《每日郵報(bào)》消息,因本場比賽中存在幾個(gè)爭議判罰,哥倫比亞球迷發(fā)起請?jiān)富顒?dòng),目前已經(jīng)有19.2萬在請?jiān)笗虾炞?,希望本場比賽重賽??哥倫比亞球迷認(rèn)為英格蘭對陣哥倫比亞的比賽中,來自美國的主裁判馬克-蓋格判罰不公。球迷們認(rèn)為比賽的重大爭議有兩處:一是下半場第57分鐘,禁...
牛津經(jīng)濟(jì)(Oxford Econocs)認(rèn)為,到2030年前,全球大約 2000 萬制造業(yè)工作將消失,這些工作崗位的任務(wù)將由自動(dòng)化系統(tǒng)承擔(dān)。根據(jù)計(jì)算,平均每一個(gè)工業(yè)機(jī)器人可以承擔(dān) 1.6 個(gè)工人的工作,技術(shù)含量最低的領(lǐng)域這個(gè)比率最高。從絕對數(shù)量來說,中國制造業(yè)工人被機(jī)器取代的數(shù)量有望創(chuàng)造又一項(xiàng)世界第一。 但不僅僅是低技術(shù)工種。大致上只要是重復(fù)性的、...
據(jù)歐盟委員會網(wǎng)站近日報(bào)道,歐盟委員會的“創(chuàng)新基金”(Innovation Fund)今天首次開始征集提案。它將投資10億歐元,為可再生能源、能源密集型行業(yè)、能源存儲以及碳捕獲、使用和存儲領(lǐng)域的突破性技術(shù)提供資金,通過創(chuàng)造就業(yè)機(jī)會,推動(dòng)當(dāng)?shù)?ldquo;綠色復(fù)蘇”,為歐洲在2050年實(shí)現(xiàn)氣候中和鋪平道路,并在全球范圍內(nèi)加強(qiáng)歐洲技術(shù)的領(lǐng)先地位。 “創(chuàng)新基金”是歐...
簡介:很多人在win7上安裝 IAR for msp430 后編譯會出現(xiàn)如上的錯(cuò)誤,筆者剛開始也遇到了這個(gè)問題,很是困惑。在網(wǎng)上找解決方法。Fatal Error[Cp001]: Copy protection check, No valid license found for this product 2很多人在win7上安裝 IAR for msp430 后編譯會出現(xiàn)如上的錯(cuò)誤,筆者剛開始也遇到了這個(gè)問題,很是困惑。在網(wǎng)上找解...

史海拾趣

問答坊 | AI 解惑

Multisim專題帖

Multisim專題帖。 很基礎(chǔ),但很實(shí)用!…

查看全部問答∨

AD9283相關(guān)參數(shù)

AD9283的相關(guān)參數(shù)和應(yīng)用…

查看全部問答∨

你也無法區(qū)分420線和480線攝像機(jī)么?

現(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 ...…

查看全部問答∨

談?wù)剈COS中全局變量的使用

在C語言編程中經(jīng)常會遇到全局變量。全局變量的定義一般采用下面的方式 .C文件中定義 unsigned int gVariable; .h文件中聲明 extern unsigned int gVariable; 這樣做的目的是防止變量重復(fù)聲明,提高編譯效率。但是如果這樣的定于如果安排不好就 ...…

查看全部問答∨

IAR+EK_SMT32F調(diào)試警告信

各位請幫我看一下,當(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ī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

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