国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Stm32407串口1空閑中斷+DMA收發(fā)(基于標(biāo)準(zhǔn)庫實現(xiàn))

這篇具有很好參考價值的文章主要介紹了Stm32407串口1空閑中斷+DMA收發(fā)(基于標(biāo)準(zhǔn)庫實現(xiàn))。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1 簡介

stm32串口的配置很簡單,這里就不贅述了,使用USART_SendData() 阻塞模式發(fā)送數(shù)據(jù),或是接收中斷配置 “接收緩沖區(qū)非空” USART_IT_RXNE,這種做法效率很低,而且來一個數(shù)據(jù)中斷一次數(shù)據(jù)處理起來也麻煩。
這里基于STM32F407提供一種串口空閑中斷+DMA接收的方式,通過庫函數(shù)編程實現(xiàn)。

1.1 什么是串口空閑中斷

初學(xué)者一開始學(xué)習(xí)配置串口中斷時經(jīng)常將中斷條件配置為USART_IT_RXNE,也就是接收緩沖區(qū)非空,每接收一個U8數(shù)據(jù)便產(chǎn)生一次中斷,非常消耗系統(tǒng)資源。
而空閑中斷USART_IT_IDLE,俗稱幀中斷,即第一幀數(shù)據(jù)接收完畢到第二幀數(shù)據(jù)開始接收期間存在一個空閑狀態(tài)(就是沒數(shù)據(jù)接收的狀態(tài)),檢測到此空閑狀態(tài)后即執(zhí)行中斷程序。進入中斷程序即意味著已經(jīng)接收到一組完整幀數(shù)據(jù),僅需及時對數(shù)據(jù)處理或?qū)?shù)據(jù)轉(zhuǎn)移出緩沖區(qū)即可。

1.2 DMA簡介

DMA–DirectMemoryAccess(存儲器直接訪問)是指一種高速的數(shù)據(jù)傳輸操作,允許在外部設(shè)備和存儲器之間直接讀寫數(shù)據(jù),既不通過CPU,也不需要CPU干預(yù)。整個數(shù)據(jù)傳輸操作在一個稱為“DMA控制器”的控制下進行。CPU除了在數(shù)據(jù)傳輸開始和結(jié)束時做一點處理外,在傳輸過程中還可以進行其他的工作。這樣,在大部分時間里,CPU和輸入輸出都處于并行操作,因此使整個計算機系統(tǒng)的效率大大提高。

1.3 DMA模式

STM32中DMA有3種傳輸模式,如下表所示
stm32f407 串口dma,stm32,單片機,c語言
其中DMA2支持上表3種傳輸模式,而DMA1只支持外設(shè)到存儲器和存儲器到外設(shè)兩種模式。

1.4 DMA請求映射

每一個外設(shè)請求都會占用一個數(shù)據(jù)流通道,同一個外設(shè)請求可以占用不同的數(shù)據(jù)流通道,如下表所示
stm32f407 串口dma,stm32,單片機,c語言
stm32f407 串口dma,stm32,單片機,c語言
例如本次使用的是STM32F407的USART1的,查上表發(fā)現(xiàn)串口1的發(fā)送USART1_TX是通道4數(shù)據(jù)流7,USART1_RX是通道4數(shù)據(jù)流5或通道4數(shù)據(jù)流2

1.4 DMA配置簡述

1.配置DMA結(jié)構(gòu)體 DMA_InitTypeDef ,使用DMA_Init()初始化DMA配置
2.啟用外設(shè)(串口)DMA接口 USART_DMACmd()
3.使能DMA DMA_Cmd()
DMA結(jié)構(gòu)體 DMA_InitTypeDef 具體成員含義自行參考庫函數(shù)源代碼說明。

2 DMA收發(fā)代碼實現(xiàn)

2.1 定義收發(fā)結(jié)構(gòu)體

為了方便管理,定義了收發(fā)緩沖區(qū)的結(jié)構(gòu)體。

#define RECEIVE_BUF_MAX_SIZE 	100   //DMA單次最大搬運數(shù)據(jù)量
#define TRANSMIT_BUF_MAX_SIZE 50   //DMA單次最大搬運數(shù)據(jù)量
///定義數(shù)據(jù)接收結(jié)構(gòu)體
typedef struct _ReceiveBuffer{
	uint8_t Buffer[RECEIVE_BUF_MAX_SIZE];//用于接收DMA搬運的接收數(shù)據(jù)
	uint16_t Lenth;//接收的數(shù)據(jù)長度
}ReceiveBuffer_t;
///定義數(shù)據(jù)發(fā)送結(jié)構(gòu)體
typedef struct _TransmitBuffer{
	uint8_t Buffer[TRANSMIT_BUF_MAX_SIZE];//用于接收DMA搬運的發(fā)送數(shù)據(jù)
	uint16_t Lenth;//發(fā)送的數(shù)據(jù)長度
}TransmitBuffer_t;

static ReceiveBuffer_t ReceiveBuffer;//數(shù)據(jù)接收結(jié)構(gòu)體
static TransmitBuffer_t TransmitBuffer;//數(shù)據(jù)發(fā)送結(jié)構(gòu)體
/*DMA接收配置結(jié)構(gòu)體*/
static DMA_InitTypeDef DMA_TransmitInitStruct;

2.2 DMA配置

1.DMA接收配置
配置根據(jù)上表查詢的數(shù)據(jù)流通道,設(shè)置方向為外設(shè)到存儲器,配置外設(shè)地址及存儲器地址,設(shè)置最大搬運數(shù)量。

static void USART_ReceiveDMA_init(void){
	DMA_InitTypeDef DMA_ReceiveInitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
	DMA_ReceiveInitStruct.DMA_Channel = DMA_Channel_4;	//設(shè)置DMA通道
    DMA_ReceiveInitStruct.DMA_PeripheralBaseAddr = (uint32_t) &USART1->DR;//設(shè)置外設(shè)地址
  	DMA_ReceiveInitStruct.DMA_Memory0BaseAddr = (uint32_t) ReceiveBuffer.Buffer;//設(shè)置內(nèi)存地址
  	DMA_ReceiveInitStruct.DMA_DIR =  DMA_DIR_PeripheralToMemory;//設(shè)置搬運方向:外設(shè)到內(nèi)存
  	DMA_ReceiveInitStruct.DMA_BufferSize = RECEIVE_BUF_MAX_SIZE;//搬運數(shù)據(jù)長度
  	DMA_ReceiveInitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設(shè)地址在搬運過程中是否自增(設(shè)置不自增)
  	DMA_ReceiveInitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//內(nèi)存地址在搬運過程中是否自增(設(shè)置自增)
  	DMA_ReceiveInitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//數(shù)據(jù)大小為一個字節(jié)
  	DMA_ReceiveInitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//數(shù)據(jù)大小為一個字節(jié)
	DMA_ReceiveInitStruct.DMA_Mode = DMA_Mode_Normal;//無需循環(huán)
	DMA_ReceiveInitStruct.DMA_Priority = DMA_Priority_Medium;
 	DMA_ReceiveInitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
  	DMA_ReceiveInitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_ReceiveInitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_ReceiveInitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  	DMA_Init(DMA2_Stream5, &DMA_ReceiveInitStruct);
	USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
	DMA_Cmd(DMA2_Stream5, ENABLE);//默認(rèn)開啟DMA接收
}

2.DMA發(fā)送配置
與DMA接收類似,只是現(xiàn)在是從存儲器到外設(shè)。

static void USART_TransmitDMA_init(void){
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
	DMA_TransmitInitStruct.DMA_Channel = DMA_Channel_4;
  	DMA_TransmitInitStruct.DMA_PeripheralBaseAddr = (uint32_t) &USART1->DR;
  	DMA_TransmitInitStruct.DMA_Memory0BaseAddr = (uint32_t) TransmitBuffer.Buffer;
  	DMA_TransmitInitStruct.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  	DMA_TransmitInitStruct.DMA_BufferSize =TRANSMIT_BUF_MAX_SIZE;
  	DMA_TransmitInitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  	DMA_TransmitInitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  	DMA_TransmitInitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  	DMA_TransmitInitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  	DMA_TransmitInitStruct.DMA_Mode = DMA_Mode_Normal;
  	DMA_TransmitInitStruct.DMA_Priority = DMA_Priority_Medium;
  	DMA_TransmitInitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
  	DMA_TransmitInitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  	DMA_TransmitInitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  	DMA_TransmitInitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  	DMA_Init(DMA2_Stream7, &DMA_TransmitInitStruct);
	USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
	DMA_Cmd(DMA2_Stream7, DISABLE);//默認(rèn)不開啟DMA發(fā)送,需要后續(xù)觸發(fā)
}

2.3 串口配置

串口配置很簡單,這里不贅述。

static void USART_init(void){

  	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//GPIO端口設(shè)置
	//串口1對應(yīng)引腳復(fù)用映射
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIO復(fù)用
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIO復(fù)用
	
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復(fù)用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //開漏
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化管腳
   //USART1 初始化設(shè)置
	USART_InitStructure.USART_BaudRate = 115200;//波特率設(shè)置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	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); //初始化串口
	USART_Cmd(USART1, ENABLE);  //使能串口
//收發(fā)DMA配置	
	BLE_USART_ReceiveDMA_init();//接收DMA配置
	BLE_USART_TransmitDMA_init();//發(fā)送DMA配置
//配置中斷
	BLE_USART_NVIC_Config();
}

2.4 中斷配置

1.中斷配置文章來源地址http://www.zghlxwxcb.cn/news/detail-604186.html

static void USART_NVIC_Config(void){
	//配置中斷
	NVIC_InitTypeDef NVIC_InitStructure;
	//USART 空閑NVIC
	NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;//串口1中斷通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器
	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//開啟串口空閑中斷
	//DMA NVIC
  NVIC_InitStructure.NVIC_IRQChannel =DMA2_Stream5_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_Init(&NVIC_InitStructure);	
	DMA_ITConfig(DMA2_Stream5,DMA_IT_TC,ENABLE);  
}
  1. 串口中斷函數(shù)
    串口中斷配置為空閑中斷,當(dāng)一幀數(shù)據(jù)接收完畢后與下一幀數(shù)據(jù)到達之前有一段空閑,系統(tǒng)會在這段空閑時進入中斷,我們通過DMA搬運計數(shù)可以計算出DMA搬運了多少數(shù)據(jù)(即一幀數(shù)據(jù)的大小),并在該中斷中處理這個數(shù)據(jù)幀。
void USART1_IRQHandler(void)                
{
	//空閑中斷
	if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET){
		uint8_t clear;
		DMA_Cmd(DMA2_Stream5, DISABLE);  //關(guān)閉接收DMA,防止處理其間有數(shù)據(jù)
    	clear = USART1->SR;
   		clear = USART1->DR;  		//清除IDLE標(biāo)志			
		USART_ClearITPendingBit(USART1,USART_IT_IDLE);//清除標(biāo)志位	
		ReceiveBuffer.Lenth=RECEIVE_BUF_MAX_SIZE - DMA_GetCurrDataCounter(DMA2_Stream5);
		/*
		此處添加處理數(shù)據(jù)的代碼
		*/
		DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);//清除DMA2_Steam5傳輸完成標(biāo)志  
    DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_MAX_SIZE);
    DMA_Cmd(DMA2_Stream5, ENABLE);
	}
}
  1. DMA中斷函數(shù)
void DMA2_Stream5_IRQHandler(void)  
{  
    //清除標(biāo)志  
    if(DMA_GetFlagStatus(DMA2_Stream5,DMA_FLAG_TCIF5)!=RESET)//等待DMA2_Steam7傳輸完成  
    {   
        DMA_Cmd(DMA2_Stream5, DISABLE); //關(guān)閉DMA,防止處理期間有數(shù)據(jù)  
  
        ReceiveBuffer.Lenth =RECEIVE_BUF_MAX_SIZE - DMA_GetCurrDataCounter(DMA2_Stream5);  
        if(ReceiveBuffer.Lenth !=0)  
        {  
			/*RC_Process();//處理緩沖區(qū)ReceiveBuffer的數(shù)據(jù)*/
        }            
        DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5 | DMA_FLAG_FEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_HTIF5);//清除DMA2_Steam7傳輸完成標(biāo)志  
        DMA_SetCurrDataCounter(DMA2_Stream5, RECEIVE_BUF_MAX_SIZE);  
        DMA_Cmd(DMA2_Stream5, ENABLE);     //打開DMA 
    }  
}

2.5 DMA發(fā)送

void DMA_Send(char* data){
	uint16_t datalenth=strlen(data);
	memcpy(TransmitBuffer.Buffer,data,datalenth);
	DMA_TransmitInitStruct.DMA_BufferSize=datalenth;
	DMA_DeInit(DMA2_Stream7);//先關(guān)閉DMA
	while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){}//等待DMA可配置 
	DMA_Init(DMA2_Stream7, &DMA_TransmitInitStruct);
	DMA_Cmd(DMA2_Stream7, ENABLE);                      //開啟DMA傳輸 
}

到了這里,關(guān)于Stm32407串口1空閑中斷+DMA收發(fā)(基于標(biāo)準(zhǔn)庫實現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【STM32+HAL庫+CubeMX】UART輪詢收發(fā)、中斷收發(fā)、DMA收發(fā)方法及空閑中斷詳解

    【STM32+HAL庫+CubeMX】UART輪詢收發(fā)、中斷收發(fā)、DMA收發(fā)方法及空閑中斷詳解

    Author: DrinkCat(szt@drinkcat.com) Copyright ? 2023 DrinkCat Original link: DrinkCat’s Blog UART是一種異步串行通信接口,常用于通過串口與外部設(shè)備進行通信。它通過發(fā)送和接收數(shù)據(jù)幀來實現(xiàn)數(shù)據(jù)傳輸,使用起來相對簡單。UART通常包含發(fā)送器(Transmitter)和接收器(Receiver),通過兩根信號線

    2024年02月10日
    瀏覽(22)
  • stm32串口空閑中斷+DMA傳輸接受不定長數(shù)據(jù)+letter?shell?實現(xiàn)命令行

    空閑中斷(IDLE),俗稱幀中斷,即第一幀數(shù)據(jù)接收完畢到第二幀數(shù)據(jù)開始接收期間存在一個空閑狀態(tài)(每接收一幀數(shù)據(jù)后空閑標(biāo)志位置1),檢測到此空閑狀態(tài)后即執(zhí)行中斷程序。 空閑中斷的優(yōu)點在于省去了幀頭幀尾的檢測 ,進入中斷程序即意味著已經(jīng)接收到一組完整數(shù)據(jù),僅需

    2024年02月03日
    瀏覽(26)
  • STM32 cubemx+串口空閑中斷+DMA雙緩沖

    ????????寫這篇文章是為了記錄下之前做過的項目中用到的一部分關(guān)鍵技術(shù),之前做過的項目中涉及到 采用最小開銷來實時接收遙控器數(shù)據(jù)、能夠準(zhǔn)確驗證傳輸過來數(shù)據(jù)的準(zhǔn)確性 ,減小誤差率,要求能穩(wěn)定適用于不同的環(huán)境。 目錄 1、為什么要用到串口空閑中斷? 2、為

    2024年02月09日
    瀏覽(22)
  • STM32使用串口空閑中斷(IDLE)和 DMA接收一串?dāng)?shù)據(jù)流

    STM32使用串口空閑中斷(IDLE)和 DMA接收一串?dāng)?shù)據(jù)流

    方法一、使用宏定義判斷IDLE標(biāo)志位 空閑的定義是總線上在一個字節(jié)的時間內(nèi)沒有再接收到數(shù)據(jù),USART_IT_IDLE空閑中斷是檢測到有數(shù)據(jù)被接收后,總線上在一個字節(jié)的時間內(nèi)沒有再接收到數(shù)據(jù)的時候發(fā)生的。 串口空閑中斷(UART_IT_IDLE):STM32的IDLE的中斷在串口無數(shù)據(jù)接收的情況

    2024年01月23日
    瀏覽(27)
  • STM32-HAL庫串口DMA空閑中斷的正確使用方式+解析SBUS信號

    STM32-HAL庫串口DMA空閑中斷的正確使用方式+解析SBUS信號

    能夠點進這篇文章的小伙伴肯定是對STM32串口DMA空閑中斷接收數(shù)據(jù)感興趣的啦,今天用這一功能實現(xiàn)串口解析航模遙控器sbus信號時,查閱了很多網(wǎng)友發(fā)布的文章(勤勞的搬運工~),包括自己之前寫過一篇博客 STM32_HAL庫_CubeMx串口DMA通信(DMA發(fā)送+DMA空閑接收不定長數(shù)據(jù))。本文

    2024年02月09日
    瀏覽(25)
  • GD32實現(xiàn)串口空閑(IDLE)中斷 + DMA機制接收數(shù)據(jù)

    GD32實現(xiàn)串口空閑(IDLE)中斷 + DMA機制接收數(shù)據(jù)

    前言 串口功能在單片機開發(fā)中,是比較常用的外設(shè),熟練使用串口功能也是驅(qū)動開發(fā)必備的技能之一。 DMA 是一種CPU輔助手段,可以在CPU不參與的情況下,是做一些輔助CPU的事情,如通常的數(shù)據(jù)搬運。 在沒有DMA之前,數(shù)據(jù)讀取時,需要CPU的處理,在多任務(wù)處理時,增加資源緊

    2023年04月13日
    瀏覽(24)
  • STM32基于HAL庫的串口接受中斷和空閑中斷

    在通信方面。UART由于全雙工通信,可以同時接受數(shù)據(jù)和發(fā)送數(shù)據(jù)而被廣泛使用。 而接受數(shù)據(jù)則又有很多種方法 比如: 1根據(jù)結(jié)束符判斷,數(shù)據(jù)是字符串形式,所以一般串口接受的接受符就是 \\\"rn\\\"? 換成16進制ascil碼顯示就是 0X0D? ?0X0A (對應(yīng)rn) ?2定時器中斷,設(shè)計\\\"喂狗信號量

    2023年04月08日
    瀏覽(22)
  • 環(huán)形隊列+DMA空閑中斷+接收串口數(shù)據(jù)

    本次實驗利用環(huán)形隊列+DMA空閑中斷+串口。。通過這個實驗可以非常深入的理解隊列,DMA,串口的知識。如果你能自己實現(xiàn)掌握這個實驗,那么你應(yīng)該基本掌握了隊列,DMA,串口的知識。 本次使用的是用環(huán)形隊列當(dāng)緩沖器區(qū)接收串口數(shù)據(jù)。我們可以先區(qū)了解DMA的空閑中斷。本次

    2024年02月13日
    瀏覽(22)
  • 【STM32】-串口開發(fā)經(jīng)驗分享-基于RTOS+空閑中斷

    【STM32】-串口開發(fā)經(jīng)驗分享-基于RTOS+空閑中斷

    目錄 1. 概述? ?? 2.串口介紹 2.1 原理框圖 2.2 RS-232C 2.3 RS-422 2.4 RS-485 2.5 UART 3. STM32 USART介紹 4. CubeMx生成Uart初始化代碼 4.1 NewProject選擇單片機型號 4.2 設(shè)置rcc時鐘 ?4.3 設(shè)置Usart 4.4 初始化代碼 4.5 注意 5 工程源碼解析 5.1 程序架構(gòu) 5.2 源碼 fml_ring_buffer.c fml_usart.c app_usart_task.c stm3

    2023年04月16日
    瀏覽(25)
  • 銜尾法解決當(dāng)無法使用空閑中斷以及DMA中斷時配置DMA接收串口不定長數(shù)據(jù)

    問題:類似K線與藍(lán)牙接收模塊,要求由原來的接收串口中斷改為DMA接收。據(jù)說要用到空閑中斷與DMA中斷,但是經(jīng)仿真發(fā)現(xiàn)DMA每完成傳輸一個數(shù)據(jù)(比如1BYTE)就會進入空閑中斷(k線發(fā)現(xiàn)這種情況),考慮到這樣進入中斷的頻率和以前串口接收中斷的頻率差不多,所以放棄此方案,

    2024年02月09日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包