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

歷史上的今天

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

正在發生

2019年01月07日 | STM32F103實現DMA接收串口不定長度數據

發布者:NanoScribe 來源: eefocus關鍵字:STM32F103  DMA接收  串口  不定長度數據 手機看文章 掃描二維碼
隨時隨地手機看文章

這兩天調試STM32F103開發板,需要實現接收一定長度連續的數據。當數據流接收結束的時候,觸發串口接收中斷。計算數據流長度,并將數據傳到內存中。


main.c


 

// DMA 存儲器到外設(串口)數據傳輸實驗

 

#include "stm32f10x.h"

#include "bsp_usart_dma.h"

#include "bsp_led.h"

 

extern uint8_t ReceiveBuff[RECEIVEBUFF_SIZE];

static void Delay(__IO u32 nCount); 

 

/**

  * @brief  主函數

  * @param  無

  * @retval 無

  */

int main(void)

{

  uint16_t i;

  /* 初始化USART */

  USART_Config(); 

 

  /* 配置使用DMA模式 */

  USARTx_DMA_Config();

 

  USARTx_NVIC_Config();

  

  /* 配置RGB彩色燈 */

  LED_GPIO_Config();

 

  //printf("\r\n USART1 DMA TX 測試 \r\n");

  

/*填充將要發送的數據*/

for(i=0;i

{

ReceiveBuff[i] = 'P';

}

  /*為演示DMA持續運行而CPU還能處理其它事情,持續使用DMA發送數據,量非常大,

  *長時間運行可能會導致電腦端串口調試助手會卡死,鼠標亂飛的情況,

  *或把DMA配置中的循環模式改為單次模式*/

 

  /* 此時CPU是空閑的,可以干其他的事情 */  

  //例如同時控制LED

  while(1)

  {

    LED1_TOGGLE

 

    Delay(0xFFFFF);

  }

}

 

static void Delay(__IO uint32_t nCount) //簡單的延時函數

{

for(; nCount != 0; nCount--);

}

/*********************************************END OF FILE**********************/

bsp_usart_dma.c


 

#include "bsp_usart_dma.h"

 

uint8_t ReceiveBuff[RECEIVEBUFF_SIZE];

 

/**

  * @brief  USART GPIO 配置,工作參數配置

  * @param  無

  * @retval 無

  */

void USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

 

// 打開串口GPIO的時鐘

DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);


// 打開串口外設的時鐘

DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

 

// 將USART Tx的GPIO配置為推挽復用模式

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

 

  // 將USART Rx的GPIO配置為浮空輸入模式

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);


// 配置串口的工作參數

// 配置波特率

USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

// 配置 針數據字長

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

// 配置停止位

USART_InitStructure.USART_StopBits = USART_StopBits_1;

// 配置校驗位

USART_InitStructure.USART_Parity = USART_Parity_No ;

// 配置硬件流控制

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

// 配置工作模式,收發一起

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

// 完成串口的初始化配置

USART_Init(DEBUG_USARTx, &USART_InitStructure);

//開啟空閑中斷

USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);

 

/* 使能USART1 DMA接收 */

USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Rx, ENABLE);

// 使能串口

USART_Cmd(DEBUG_USARTx, ENABLE);     

}

 

 

/*****************  發送一個字節 **********************/

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)

{

/* 發送一個字節數據到USART */

USART_SendData(pUSARTx,ch);


/* 等待發送數據寄存器為空 */

while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

}

 

/****************** 發送8位的數組 ************************/

void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)

{

  uint8_t i;


for(i=0; i

  {

    /* 發送一個字節數據到USART */

    Usart_SendByte(pUSARTx,array[i]);

  

  }

/* 等待發送完成 */

while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);

}

 

/*****************  發送字符串 **********************/

void Usart_SendString( USART_TypeDef * pUSARTx, char *str)

{

unsigned int k=0;

  do 

  {

      Usart_SendByte( pUSARTx, *(str + k) );

      k++;

  } while(*(str + k)!='\0');

  

  /* 等待發送完成 */

  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)

  {}

}

 

/*****************  發送一個16位數 **********************/

void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)

{

uint8_t temp_h, temp_l;


/* 取出高八位 */

temp_h = (ch&0XFF00)>>8;

/* 取出低八位 */

temp_l = ch&0XFF;


/* 發送高八位 */

USART_SendData(pUSARTx,temp_h);

while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);


/* 發送低八位 */

USART_SendData(pUSARTx,temp_l);

while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

}

 

///重定向c庫函數printf到串口,重定向后可使用printf函數

int fputc(int ch, FILE *f)

{

/* 發送一個字節數據到串口 */

USART_SendData(DEBUG_USARTx, (uint8_t) ch);


/* 等待發送完畢 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);


return (ch);

}

 

///重定向c庫函數scanf到串口,重寫向后可使用scanf、getchar等函數

int fgetc(FILE *f)

{

/* 等待串口輸入數據 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

 

return (int)USART_ReceiveData(DEBUG_USARTx);

}

 

/**

  * @brief  USARTx RX NVIC 配置,外設到內存(DR->USART1)

  * @param  無

  * @retval 無

  */

void USARTx_DMA_Config(void)

{

DMA_InitTypeDef DMA_InitStructure;


// 開啟DMA時鐘

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

// 設置DMA源地址:串口數據寄存器地址*/

DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;

// 內存地址(要傳輸的變量的指針)

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ReceiveBuff;

// 方向:從外設到內存

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;

// 傳輸大小

DMA_InitStructure.DMA_BufferSize = RECEIVEBUFF_SIZE;

// 外設地址不增     

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_MemoryDataSize_Byte;  

// DMA模式,一次或者循環模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;

//DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

// 優先級:中

DMA_InitStructure.DMA_Priority = DMA_Priority_High;

// 禁止內存到內存的傳輸

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

// 配置DMA通道    

DMA_Init(USART_RX_DMA_CHANNEL, &DMA_InitStructure);

// 使能DMA

DMA_Cmd (USART_RX_DMA_CHANNEL,ENABLE);

}

 

//重新恢復DMA指針

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

{

    DMA_Cmd(DMA_CHx, DISABLE );  //關閉USART1 TX DMA1所指示的通道

    DMA_SetCurrDataCounter(DMA_CHx, RECEIVEBUFF_SIZE);//DMA通道的DMA緩存的大小

    DMA_Cmd(DMA_CHx, ENABLE);  //打開USART1 TX DMA1所指示的通道

}

 

/**

  * @brief  USARTx RX NVIC 配置,外設到內存(DR->USART1)

  * @param  無

  * @retval 無

  */

void USARTx_NVIC_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

    /* Configure the NVIC Preemption Priority Bits */

 

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);

 

    /* Enable the USART Interrupt */

 

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

 

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

 

    NVIC_Init(&NVIC_InitStructure);

 

}

 

//串口中斷函數

void USART1_IRQHandler(void)                //串口1中斷服務程序

{

 

uint8_t Usart1_Rec_Cnt;

 

     if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾)

      {

          USART_ReceiveData(USART1);//讀取數據注意:這句必須要,否則不能夠清除中斷標志位。

          Usart1_Rec_Cnt = RECEIVEBUFF_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5); //算出接本幀數據長度

 

         //***********幀數據處理函數************//

          printf ("Thelenght:%d\r\n",Usart1_Rec_Cnt);

          printf ("The data:\r\n");

 

          Usart_SendArray(DEBUG_USARTx, ReceiveBuff, RECEIVEBUFF_SIZE);

 

          printf ("\r\nOver! \r\n");

        //*************************************//

         USART_ClearITPendingBit(USART1,USART_IT_IDLE);         //清除中斷標志

         MYDMA_Enable(DMA1_Channel5);                  //恢復DMA指針,等待下一次的接收

     }

 

}

 

bsp_usart_dma.h 


#ifndef __USARTDMA_H

#define __USARTDMA_H

 

 

#include "stm32f10x.h"

#include

 

 

// 串口工作參數宏定義

#define  DEBUG_USARTx                   USART1

#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1

#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd

#define  DEBUG_USART_BAUDRATE           115200

 

// USART GPIO 引腳宏定義

#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)

#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

    

#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   

#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9

#define  DEBUG_USART_RX_GPIO_PORT       GPIOA

#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10

 

// 串口對應的DMA請求通道

#define  USART_TX_DMA_CHANNEL     DMA1_Channel4

#define  USART_RX_DMA_CHANNEL     DMA1_Channel5

 

// 外設寄存器地址

#define  USART_DR_ADDRESS        (USART1_BASE+0x04)

// 一次發送的數據量

#define  RECEIVEBUFF_SIZE            50

 

 

void USART_Config(void);

void USARTx_DMA_Config(void);

 

#endif /* __USARTDMA_H */

編譯后成功運行,運行結果:

https://mp.csdn.net/postedit

關鍵字:STM32F103  DMA接收  串口  不定長度數據 引用地址:STM32F103實現DMA接收串口不定長度數據

上一篇:STM32之串口DMA接收不定長數據
下一篇:STM32F103之DMA實驗,內存通過DMA向串口1發送數據

推薦閱讀

計數測試數碼管顯示程序#include <AT89X51.H>//6.000MHz #define uchar unsigned char #define uint unsigned int #define L 0 #define R 1uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};/*0~9的數碼管段碼*/ #define reset() {WDT=0x1e;WDT=0xe1;} uchar act[2]={0xf3,0xfc};//數碼管位碼 /********************...
先描述下這幾天碰到的一個奇怪的問題:一個基于stm32的工程中使用到了IAP編程,其中boot空間預留長度為0x6100,實際boot的bin文件大小為21.1KB,具體為21633Byte.我在最開始調試時對于IAP編程的app程序直接下載到單片機中,程序工作一切正常,但是在通過boot將app更新到單片機中后程序可以進入到app中,但是程序工作不正常。最后經過查找原因,最后在代碼注...
  2019 年對中國大多數動力電池企業而言,都是一個寒冬。隨著新能源汽車銷量五連跌,早已進入兩極分化洗牌階段的動力電池企業雪上加霜,拉開死亡競賽序幕?! 姓{機構 SNE Research 統計,去年 11 月,中國大陸市場登記的電動車電池能源總量為 6.3GWh,比前一年同期少 33.1%。以單月表現來看,自去年 8 月開始,電動車電池能源總量連續下...
91% 的受調研者表示,2030 年時汽車將采用全電或混合動力自動駕駛技術將主要關注司機和乘客安全高速 WiFi、無線充電和車輛間通信成為最主要的功能特點軟件定義車輛作為汽車廠商最重要的議題美國伊利諾伊州萊爾 – 2021 年 1 月 7 日 – 全球領先的連接與電子解決方案提供商Molex莫仕發布面向汽車行業決策者的全球性調研成果,對將會影響到“未...

史海拾趣

問答坊 | AI 解惑

電子工程師總結

認為總結的不錯…

查看全部問答∨

閑聊哈希表 (上)

經典數據結構教科書中,“表”是數據結構的一個大家族。其中,有順序表(數組)、單向鏈表、雙向鏈表、循環鏈表等等。我們今天聊的不是這些,而是“表”中的異類——哈希表(Hash Table)。 為什么會有哈希表這種數據結構呢?讓我們用一個通俗的 ...…

查看全部問答∨

測試系統中的復位等待

在verilog中模塊都是全局的,所以可以直接在模塊外使用內部的寄存器,下面的task中實現測試系統中的復位等待   // purpose: procedure to wait until the root port is done being reset   task req_intf_wait_reset_end;  ...…

查看全部問答∨

請教:WINCE5.0上已經可以使用3G上網卡,原來WinMobile基于GPRS的程序如何移植過來?

怎樣才能讓原來基于GPRS的程序運行于3G上網卡上? 我正在WINCE 5.0上做一個3G無線上網卡的項目,已經可以用IE上網了; 但是以前的程序是基于GPRS的,調用的網絡接口不一樣,原來調用的網絡接口有這些: ConnMgrApiReadyEvent、ConnMgrConnection ...…

查看全部問答∨

【請教】高手幫解釋下STM32中的Progress和Thread

                                 PC軟件編程也有Progress和Thread的概念,ARM中這個概念是如何的?…

查看全部問答∨

STM32上使用UC/gui的一些資料

  STM32上使用UC/gui的一些資料 詳情可以聯系 QQ 940436962…

查看全部問答∨

幫忙看看I2C模塊有啥問題,新手求指教!

//所需頭文件 #include  "includes.h"                        // 封裝的頭文件、宏定義、變量、函數聲明 /*************************全局變量 ...…

查看全部問答∨

關于DSP數字鎖相放大器的設計

有木有大神幫忙,我的畢設是關于DSP數字鎖相放大器的設計,我現在編程編不好,達不到效果,很是愁人,望大神解決啊。。。。QQ 870612404…

查看全部問答∨

關于運放最全資料,設計,電路,分析

競賽專用關于運放最全資料,設計,電路,分析…

查看全部問答∨

STM32 Nucleo與其藍牙擴展板X-Nucleo-IDB04A1進程

其實前幾天便收到了電子工程世界郵寄過來的板卡,只是當是項止催得急便沒有進行開發,今天把漂亮的藍牙擴展板與Nucleo板組合在了一起開始研究。根據板卡包裝上的網址,我到ST網站上下載了很多資料,包括板卡簡介,原理圖,BOM表,生產加工文件,還 ...…

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

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 桐柏县| 舞阳县| 米脂县| 安仁县| 介休市| 夏河县| 玛曲县| 渭源县| 宜兰县| 甘孜| 尚义县| 梨树县| 龙江县| 河间市| 深泽县| 搜索| 沙湾县| 顺义区| 泸水县| 阳朔县| 临武县| 康平县| 崇文区| 大埔县| 汶上县| 乌拉特后旗| 崇左市| 莱阳市| 扎鲁特旗| 新疆| 大兴区| 荣昌县| 鄱阳县| 宁蒗| 武城县| 扎鲁特旗| 当雄县| 黎川县| 元氏县| 永安市| 尖扎县|