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