娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月10日(星期二)

正在發(fā)生

2018年12月10日 | stm32 USART接收總線空閑中斷--USART_IT_IDLE

發(fā)布者:Chunjie2022 來源: eefocus關鍵字:stm32  USART接收  總線空閑中斷 手機看文章 掃描二維碼
隨時隨地手機看文章

串口DMA接收:


接收數據的流程: 


串口接收DMA在初始化的時候就處于開啟狀態(tài),一直等待數據的到來,在軟件上無需做任何事情,只要在初始化配置的時候設置好配置就可以了。 


判斷數據數據接收完成: 


這里判斷接收完成是通過串口空閑中斷的方式實現,即當串口數據流停止后,就會產生IDLE中斷。這個中斷里面做如下幾件事: 


1. 關閉串口接收DMA通道,2點原因:a.防止后面又有數據接收到,產生干擾。b.便于DMA的重新配置賦值,下面第4點。 


2. 置位接收完成標志位 


3. 處理接收buffer中數據 


4. 重新設置DMA下次要接收的數據字節(jié)數,注意,這里是給DMA寄存器重新設置接收的計數值,這個數量只能大于或者等于可能接收的字節(jié)數,否則當DMA接收計數器遞減到0的時候,又會重載這個計數值,重新循環(huán)遞減計數,所以接收緩沖區(qū)的數據則會被覆蓋丟失。 


5. 開啟DMA通道,等待下一次的數據接收,注意,對DMA的相關寄存器配置寫入,如第4條的寫入計數值,必須要在關閉DMA的條件進行,否則操作無效。 


說明一下,STM32的IDLE的中斷在串口無數據接收的情況下,是不會一直產生的,產生的條件是這樣的,當清除IDLE標志位后,必須有接收到第一個數據后,才開始觸發(fā),一斷接收的數據斷流,沒有接收到數據,即產生IDLE中斷。IDLE位不會再次被置高直到RXNE位被置起(即又檢測到一次空閑總線)。RXNE接收中斷可以不用開啟,減少進中斷的次數。 


這里寫圖片描述


void My_UART_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStruct;

    USART_InitTypeDef USART_InitStruct;

    NVIC_InitTypeDef NVIC_InitStruct;

    DMA_InitTypeDef DMA_InitStruct;


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

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   // 使能GPIOA

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);   // 使能時鐘 復用USART


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);  //初始化 USART_TX 即 GPIOA.9 


    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_Init(GPIOA,&GPIO_InitStruct);          //初始化 USART_RX 即 GPIOA.10


    USART_InitStruct.USART_BaudRate = 115200;

    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_InitStruct.USART_Parity = USART_Parity_No;

    USART_InitStruct.USART_StopBits = USART_StopBits_1;

    USART_InitStruct.USART_WordLength = USART_WordLength_8b;

    USART_Init(USART1,&USART_InitStruct);   //初始化 USART


//  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  // 開啟 USART 接收緩沖區(qū)非空中斷

//  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);   // 開啟 USART 發(fā)送緩沖區(qū)空中斷


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

    USART_Cmd(USART1, ENABLE);//使能USART中斷


    DMA_DeInit(DMA1_Channel5);

    DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);    //外設--->內存

    DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)RxBuffer;

    DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

    DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

    DMA_InitStruct.DMA_BufferSize = BufferSize;

    DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;

    DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;

    DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

    DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

    DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;

    DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;

    DMA_Init(DMA1_Channel5, &DMA_InitStruct);


    DMA_Cmd(DMA1_Channel5, ENABLE);

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


    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;   //搶占優(yōu)先級 2位 00 01 10 11

    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;          //響應優(yōu)先級 2位 00 01 10 11

    NVIC_Init(&NVIC_InitStruct);                                //初始化中斷

}


以上代碼如下圖 

 

這里寫圖片描述 

當MCU通過USART接收外部發(fā)來的數據時,在進行第①②③步的時候,主程序可以不用管,DMA直接將接收到的數據寫入緩存RxBuffer,程序此時也不會進入接收中斷,當數據接收完成之后產生接收空閑中斷,在中斷服務函數中將接收完成標志位置1,計算出接收緩存中的數據長度,清除中斷位,失能DMA防止在處理數據時候接收數據。主程序中檢測到接收完成標志被置1,進入數據處理程序,現將接收完成標志位置0,重新設置DMA下次要接收的數據字節(jié)數,使能DMA進入接收數據狀態(tài)。


void USART1_IRQHandler(void)

{

    uint8_t clear = clear;  // 用來消除編譯器的“沒有用到”的提醒

    uint8_t data = 0;


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

    {

        clear = USART1->SR;

        clear = USART1->DR;


//      RxCounter = BufferSize - DMA1_Channel5->CNDTR;//緩存中的字節(jié)數

        RxCounter = BufferSize - DMA_GetCurrDataCounter(DMA1_Channel5);//緩存中的字節(jié)數


//      USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);


        RxStatus = 1;   //標記接收到一幀

        USART_ClearITPendingBit(USART1, USART_IT_IDLE); // 清除空閑中斷


        DMA_Cmd(DMA1_Channel5, DISABLE);                // 停止DMA,清除DMA緩存

    }

}


int main(void)

{

    uint8_t i = 0;


    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);             // 初始化中斷優(yōu)先級分組


    My_UART_Init();


    while(1)

    {

        if(RxStatus == 1)

        {

            RxStatus = 0;

            i = 0;


            while(RxCounter--)

            {

                USART_SendData(USART1, RxBuffer[i++]);

                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);

            }


            memset(RxBuffer, 0, i); // 清除緩存

            RxCounter = 0;


//          DMA1_Channel5->CNDTR = BufferSize;

            DMA_SetCurrDataCounter(DMA1_Channel5, BufferSize);

            DMA_Cmd(DMA1_Channel5, ENABLE);     

        }

    }

}


此程序可以進行接收不定長的數據幀,不需像RXNE每次接收到一個字節(jié)就進一次中斷。


關鍵字:stm32  USART接收  總線空閑中斷 引用地址:stm32 USART接收總線空閑中斷--USART_IT_IDLE

上一篇:stm32 USART_IT_IDLE中斷 一幀數據
下一篇:stm32F030C8單片機串口利用USART_IT_IDLE接收完整的一幀

推薦閱讀

在去年高通亮出驍龍835平臺揮師進入PC市場、直擊英特爾老巢以來,高通在近日的“驍龍技術峰會”上,不僅重磅發(fā)布全新一代的5G手機處理器驍龍855,最后一天還帶來了全球首款7nm的PC級芯片驍龍8cx。據悉,首批搭載驍龍8cx的筆記本將在2019年第三季度上市。高通對PC市場重兵壓陣,而英特爾借力5G再次鏖戰(zhàn)智能手機市場,這一次勝利的天平會傾向誰?不斷進階始...
初始化STM8L芯片的GPIOC的GPIO_PIN_7為輸入模式,用GPIO_ReadInputPin庫函數讀取該腳位的電壓值為高時進入if語句,但是實際上是錯的。因為使用GPIO_ReadInputPin這個庫函數讀出來的值是一個大于0的值,不一定是1,if(GPIO_ReadInputPin(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7) == 1){........................}所以最好的寫法是if(GPIO_ReadInputPin(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7) != 0){........................}
東芝電子元件及存儲裝置株式會社(“東芝”)今日宣布,推出兩種應用于電子節(jié)氣門等車載應用的直流有刷電機驅動 IC——“TB9054FTG”和“TB9053FTG”。其中“TB9054FTG”采用可潤濕側翼 VQFN 封裝,“TB9053FTG”采用功率型 QFN 封裝。TB9054FTG 現已提供樣品,預計在 2022 年 3 月開始量產;TB9053FTG 將從 2021 年 2 月開始提供樣品,預...
12月8日,天風國際分析師郭明錤發(fā)布最新研報,曝光了數款蘋果即將發(fā)布的新品,包括想新款iPhone SE、新一代Apple Watch等等。  郭明錤在研報中指出,蘋果將于2022年上半年發(fā)布新款iPhone SE,采用4.7英寸屏幕,配備3GB內存。  2022年下半年,新一代Apple Watch將于大家見面,包括Apple Watch 8、新款Apple Watch SE與極限運動版本。...

史海拾趣

問答坊 | AI 解惑

共享一下我的論文-uClinux 在EasyARM2200開發(fā)板上的運行

摘 要:EasyARM2200開發(fā)板僅有512KB RAM和2MB FLASH存儲器資源,能否運行uClinux以及如何運行 uClinux,是喜愛這款開發(fā)板的技術人員一個共同的心聲。本文通過分析uClinux的內存管理和內核引導機制,介紹了uClinux2.4針對EasyARM2200開發(fā)板的移植和 ...…

查看全部問答∨

請教BiCMOS反相器的理解問題

請教BiCMOS反相器的理解問題,以前貌似有人問過,但還是沒弄明白 如下圖,當輸入Vi為H,前級反相器的輸出(即T1管的基極)為L,此時T1管就截止了,相當于斷開 同時N3管的柵極也為L,N3也是截止的,N2的柵極是原始輸入信號為H,N2可以導通,但是T2 ...…

查看全部問答∨

電子元件模特秀第三場

愛因迪生:咦,又上來一位和色環(huán)電阻長得很像的元件。是誰呢?不過她長得很碩壯。為了再次出錯,我還是先驗證一下是不是電阻再說。 愛因迪生拿了個萬用表在手上,來到舞臺上。 愛因迪生:千萬別告訴我你是什么元件。我要自己猜猜。來來來,讓我量 ...…

查看全部問答∨

三菱 西門子 歐姆龍 3種PLC的使用心得征集

為了使大家對使用中或者使用過的PLC能有個總結,特征集討論三菱、西門子、歐姆龍最常用的3種PLC的使用心得。我本人用過最多的是三菱的FX、FX1N、FX2N系列PLC,感覺編寫程序容易,初學上手快,組網簡單,故障率低。希望大家也說說自己的工程和維修心 ...…

查看全部問答∨

autocorrelation(自相關)function 應該怎么用呢?

各位前輩,我是才剛剛開始接觸DSP(digital sound processing)的學生,現在要用autocorrelation funtion 找出一個periodic signal 的周期,但是實在是不知道autocorrelation function 應該怎么用~~~比方說我得到一個sinusoidal signal(有噪音) ...…

查看全部問答∨

AT89C51

#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit LED = P0^0; void mian() {         LED = 1;         EA =1;         EX0 = 1; &nb ...…

查看全部問答∨

出一個FPGA的開發(fā)板板和USB下載線,350包郵

出一個FPGA的核心板和USB下載線,幾乎全新,到手玩了一個月,就沒有動過了,1月份的時候550從淘寶上買的,現在350包郵,出掉~南京的支持面交, 有興趣的話直接聯(lián)系我 手機:13770305251 手上還有這兩個東西的保修單,是康草科技的 http://auction1.tao ...…

查看全部問答∨

不會做啊!

一條C程序實現以下3種功能: 1、按一下LED全亮,再按一下半亮,按第三下LED滅; 2、按住3秒,LED閃爍(500ms關,100ms開),再按LED滅; 3、快速按3下,不斷循環(huán):LED顯示方波為:開80ms,關500ms,(開50ms,關100ms,做5次),關500ms。   ...…

查看全部問答∨

ti mcu樣品好難買--MSP430G2333尋樣記

       經過了前期的反復討論,決定使用MSP430G2333這個MCU去做一個新的產品,主要是應用到觸摸,10位AD,另外因需要的IO口也比較多的原因,決定用32個腳的QFN,于是一大早,就興沖沖的跑到華強/賽格去找樣。在來之 ...…

查看全部問答∨

AT89C2051單片機設計開發(fā)的ML99V4型傳呼機發(fā)碼電路的功能、原理、編程及應用

AT89C2051單片機設計開發(fā)的ML99V4型傳呼機發(fā)碼電路的功能、原理、編程及應用…

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

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 灌阳县| 郴州市| 恩施市| 丰镇市| 团风县| 梨树县| 建昌县| 永福县| 金昌市| 宣城市| 大田县| 噶尔县| 铁力市| 绵竹市| 临澧县| 丰镇市| 石台县| 宜阳县| 玉树县| 延寿县| 达州市| 科尔| 荣成市| 图木舒克市| 远安县| 温泉县| 古田县| 日喀则市| 辽源市| 灵石县| 平度市| 曲靖市| 定西市| 涞源县| 舒兰市| 临猗县| 杂多县| 毕节市| 鹿邑县| 洞头县| 开化县|