1. 程式人生 > >STM32串列埠DMA超時接收方法,可大大節約CPU時間

STM32串列埠DMA超時接收方法,可大大節約CPU時間


  DMA_DeInit(DMA1_Channel5); //將DMA的通道1暫存器重設為預設值
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_USART1_DR; //源頭BUF既是 (&(USART1->DR))
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)uart1_data_temp; //目標BUF 既是要寫在哪個個數組之中 
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外設作源頭//外設是作為資料傳輸的目的地還是來源 
  DMA_InitStructure.DMA_BufferSize = 200; //DMA快取的大小 單位在下邊設定
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址暫存器不遞增
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //記憶體地址遞增
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外設位元組為單位
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; //記憶體位元組為單位
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在迴圈快取模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High; //4優先順序之一的(高優先)VeryHigh/High/Medium/Low
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非記憶體到記憶體 
  DMA_Init(DMA1_Channel5, &DMA_InitStructure); //根據DMA_InitStruct中指定的引數初始化DMA的通道1暫存器 
  DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //DMA5傳輸完成中斷 
  USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能USART1的接收DMA請求

//串列埠初始化,只列出一個通道,其他兩個通道相同        
void USART1_Configuration(void)
{
    //串列埠初始化資料結構定義
        USART_InitTypeDef USART_InitStructure; 

//定時器中斷服務程式
void TIM2_IRQHandler(void)
{
  u16 i;   
  //清定時器中斷
  TIM_ClearITPendingBit(TIM2, TIM_FLAG_Update); 

  if(i!=uart1_Flag_last)  //未完成傳輸
  {
          UART1_Timeout=0;
        uart1_Flag_last=i;
  }
  else
  {
    if(UART1_Timeout>UART1_TimeoutComp)  //產生超時
        {
           if(i<200) //有資料接收到
           {
                  UART1_FlagTemp=200-i;      //得到接收到的位元組數
              
                for(i=0;i<UART1_FlagTemp;i++)  //將資料拷貝到緩衝區
                 uart1_data[i]=uart1_data_temp[i];
                UART1_Flag=UART1_FlagTemp;
                
                DMA_ClearFlag(DMA1_FLAG_TC5);
                DMA_Cmd(DMA1_Channel5, DISABLE); //正式允許DMA                 
                DMA5_Init();                  
           }
           UART1_Timeout=0;
        }
  }
  //------------------------------------------------------------------
  i=DMA_GetCurrDataCounter(DMA1_Channel6);
  DMA_ClearITPendingBit(DMA1_IT_GL6); //清除全部中斷標誌

                for(i=0;i<UART2_FlagTemp;i++)  //將資料拷貝到緩衝區
                 uart2_data[i]=uart2_data_temp[i];
                UART2_Flag=UART2_FlagTemp;
                
                DMA_ClearFlag(DMA1_FLAG_TC6);
                DMA_Cmd(DMA1_Channel6, DISABLE); //正式允許DMA                 
                DMA6_Init();
                                
           }
           UART2_Timeout=0;
        }
  }
  //------------------------------------------------------------------
  i=DMA_GetCurrDataCounter(DMA1_Channel3);
  DMA_ClearITPendingBit(DMA1_IT_GL3); //清除全部中斷標誌

                for(i=0;i<UART3_FlagTemp;i++)  //將資料拷貝到緩衝區
                 uart3_data[i]=uart3_data_temp[i];
                UART3_Flag=UART3_FlagTemp;
                
                DMA_ClearFlag(DMA1_FLAG_TC3);
                DMA_Cmd(DMA1_Channel3, DISABLE); //正式允許DMA                 
                DMA3_Init();  
                
           }
           UART3_Timeout=0;
        }
  }  
}

相關推薦

STM32串列DMA超時接收方法大大節約CPU時間

  DMA_DeInit(DMA1_Channel5); //將DMA的通道1暫存器重設為預設值  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SRC_USART1_DR; //源頭BUF既是 (&(USART1->DR))  DMA_In

STM32 串列DMA方式接收

      STM32 是一款基於ARM Cortex-M3核心的32位MCU,主頻最高可達72M。最近因為要在車機上整合TPMS功能, 便開始著手STM32的開發工作,STM32F10x系列共有5個串列埠(USART1~USART5),支援DMA方式通訊,DMA方式由於不

STM32 串列DMA(一)

今天調USART,資料在晶片內部用DMA傳到串列埠快取,發現DMA真的很好,很快,而且不消耗系統資源。只是在傳輸完的時候中斷的標誌置位。下面解釋一下程式。 void DMA_Configuration(void)  {  DMA_InitTypeDef DMA_Init

STM32串列中斷方式接收

開啟串列埠的時鐘源 void RCC_Configuration(void) {   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |   RCC_APB2Periph_GPIOB |

STM32串列USART1的使用方法和程式

通用同步非同步收發器(USART)提供了一種靈活的方法來與使用工業標準NR 非同步序列資料格式的外部裝置之間進行全雙工資料交換。 USART利用分數波特率發生器提供寬範圍的波特率選擇,支援同步單向通訊和半雙工單線通訊。 1、STM32韌體庫使用外圍裝置的主要思路 在S

STM32基礎知識3-STM32串列USART1的使用方法和程式

通用同步非同步收發器(USART)提供了一種靈活的方法來與使用工業標準NR 非同步序列資料格式的外部裝置之間進行全雙工資料交換。 USART利用分數波特率發生器提供寬範圍的波特率選擇,支援同步單向通訊和半雙工單線通訊。 1、STM32韌體庫使用外圍裝置的主要思路 在S

STM32串列USART1程式(受啟發前進一步)

原理圖: #include "stm32f10x.h" #include "stm32f10x_usart.h" #include "misc.h" #include "stdarg.h" /* Private variables -------------

STM32串列使用心得(一)——DMA+空閒中斷接收

一,因何用之? 之前曾經寫過一篇《關於CubeMX的串列埠全雙工接收發送鎖死的問題》的文章,討論了STM32的串列埠在全雙工模式下會出現鎖死問題的現象。當時的解決辦法是在串列埠接收中斷中加入解鎖機制,貌似臨時解決了這個問題。但這幾天程式不知道怎麼回事,又開

STM32 HAL庫 串列DMA(收發)和STM32串列中斷接收接收時間管理機制)+ESP8266 wifi模組通訊問題

一、HAL庫 串列埠 DMA+ESP8266模組通訊問題 用STM32 HAL庫串列埠的DMA傳送和空閒中斷接收處理資料,單片機發送AT指令給ESP8266 wifi模組問題:微控制器連續幾次給wifi模組傳送AT指令,wifi模組總是少一次的應答,在無線通訊過程中是不方便

STM32 USART串列DMA 接收和傳送流程詳解

https://blog.csdn.net/weibo1230123/article/details/80506484 1.dm

STM32 不斷進入串列中斷問題 解決方法

STM32 有時候會不斷進入中斷,解決方法如下 1.串列埠初始化配置時,需要開啟ORE 溢位中斷,如下紅色程式碼所示 void Usart_Init(void) {     GPIO_InitTypeDef GPIO_InitStructure;

STM32串列通訊中使用printf傳送資料配置方法(開發環境 Keil RVMDK)

出處:STM32串列埠通訊中使用printf傳送資料配置方法(開發環境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47176.html 在STM32串列埠通訊程式中使用printf傳送資料,非常的方便。

關於RS485通訊中使用STM32串列DMA方式傳送資料丟失位元組的問題

1、開發平臺 計算機作業系統:WIN7 64位; 開發環境:Keil MDK 5.14; MCU:STM32F407ZET6; STM32F4xx韌體庫:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0; 串列埠除錯助手; 2、問題描述  &

STM32串列接收字串並控制LED

串列埠相關配置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Peri

STM32串列傳送資料(字元字串數字.......)(重點)

#include "stm32f10x.h" #include <stdio.h>    //下面strlen函式需要此標頭檔案 #include "USART.h" /**********************************************

STM32串列USART用法的進階(標準庫函式版本)空閒中斷+DMA

任務:配置串列埠,完成資料的收發。方法1:普通操作----直接傳送&中斷接收第0步:printf的準備//加入以下程式碼,支援printf函式,而不需要選擇use MicroLIB 百度搜索:半主機模式 #if 1 方法1 #pragma import(__use

STM32串列通訊亂碼詳細處理方法

STM32串列埠通訊以及溫度採集搞定,其中主要遇到STM32系列微控制器時鐘樹的問題,串列埠通訊遇到串列埠除錯助手能夠接收到資料但出現亂碼現象,開始一直以為是串列埠配置和程式程式碼問題,因為是第一次上電線上除錯STM32板子,後面主要查串列埠波特率配置和收發函式程式段,如下

STM32串列中斷接收和中斷髮送

STM32串列埠USART1中斷接收和中斷髮送 先貼出中斷函式: void USART1_IRQHandler(void){ if (USART_GetITStatus(US

STM32串列中斷接收方式詳細比較

本例程通過PC機的串列埠除錯助手將資料傳送至STM32,STM32通過SP3232晶片採用中斷接收方式完成,然後接收資料後將所接收的資料又傳送至PC機。例項一: void USART1_IRQHandler(u8 GetData) { u8 BackData; i

STM32 HAL庫學習系列第10篇---串列空閒中斷接收不定長資料

串列埠重定向配置: 可以直接複製使用 /************************************************* * 函式功能: 重定向c庫函式printf到DEBUG