国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

stm32之不定長接收

發(fā)布者:HeavenlyWonder最新更新時(shí)間:2025-02-17 來源: cnblogs關(guān)鍵字:stm32  不定長接收  配置工程 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

正文

使用STM32CUBE_MAX配置工程,可以簡化編程工作量,但是這樣我們會遇到一些麻煩,比如利用串口接收不知道長度的數(shù)據(jù)的時(shí)候,我們可能會無從下手,前段時(shí)間看到他人程序中的串口不定長接收,此次特意總結(jié),包括3類芯片串口不定長配置。


STM32F103ZET6

配置工程:

  • 選擇USART1,配置波特率為115200,并開啟串口中斷,DMA中斷

配置程序

在配置工程后,我們需要在工程中printf重定向函數(shù)fputc()和重寫串口接收函數(shù) UsartReceive_IDLE()代碼如下:


// 在頭文件中定義結(jié)構(gòu)體

#define RX_LEN        1024


typedef struct  

{  

uint8_t  RX_flag:1;        //IDLE receive flag

uint16_t RX_Size;          //receive length

uint8_t  RX_pData[RX_LEN]; //DMA receive buffer

}USART_RECEIVETYPE;  


void UsartReceive_IDLE(UART_HandleTypeDef *huart);

extern    USART_RECEIVETYPE     UsartType1;


//定義結(jié)構(gòu)體

USART_RECEIVETYPE     UsartType1;


// printf重定向

int fputc(int ch,FILE *f)

{

    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}


// USART不定長接收

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  

{  

    uint32_t temp;  

  

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  // Checks whether the specified UART idle flag is set or not.

    {   

        __HAL_UART_CLEAR_IDLEFLAG(huart);                     // Clears the UART IDLE pending flag.

        HAL_UART_DMAStop(huart);                              // Stops the DMA Transfer.

        temp = huart->hdmarx->Instance->CNDTR;                // Read DMA stream x number of data register 

        huart->hdmarx->Instance->CNDTR = 0;                   // Clear DMA stream x number of data register

        if(huart == &huart1)                                  // Checks whitch USART 

        {

            UsartType1.RX_Size =  RX_LEN - temp;   

            UsartType1.RX_flag=1;                             // Set RX_flag

            HAL_UART_Receive_DMA(&huart1,UsartType1.RX_pData,RX_LEN);  // start DMA interrupt and receives an amount of data in non blocking mode. 

        }

    }  


配置完成后,需要在xxx_it.c中斷函數(shù)中添加相應(yīng)串口的UsartReceive_IDLE( ) 函數(shù)


/**

* @brief This function handles USART1 global interrupt.

*/

void USART1_IRQHandler(void)

{

  /* USER CODE BEGIN USART1_IRQn 0 */

  UsartReceive_IDLE(&huart1);  

  /* USER CODE END USART1_IRQn 0 */

  HAL_UART_IRQHandler(&huart1);

  /* USER CODE BEGIN USART1_IRQn 1 */


  /* USER CODE END USART1_IRQn 1 */

}


在主函數(shù)中需要開啟DMA接收中斷,和串口空閑中斷,程序如下:


  MX_GPIO_Init();

  MX_DMA_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

    

    HAL_UART_Receive_DMA(&huart1, UsartType1.RX_pData, RX_LEN);    // Receives an amount of data in non blocking mode. 

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);                  // Enable the specified UART interrupt.                  

    

    printf('**************C print 重定向*************rn');

    printf('**********USART_IDLE 不定長接收**********rn');

    

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

        if(UsartType1.RX_flag )

        {

            UsartType1.RX_flag = 0;

            HAL_UART_Transmit(&huart1, UsartType1.RX_pData, UsartType1.RX_Size, 0xffff);

        }

  }    


運(yùn)行結(jié)果

STM32F429IGT6 & STM32F767IGT6

配置工程:

  • 工程配置與 STM32F103ZET6 相同。


配置程序:

printf重定向函數(shù)fputc()和重寫串口接收函數(shù) UsartReceive_IDLE()代碼如下:


// 在頭文件中定義結(jié)構(gòu)體

#define RX_LEN        1024


typedef struct  

{  

uint8_t  RX_flag:1;        //IDLE receive flag

  uint16_t RX_Size;          //receive length

uint8_t  RX_pData[RX_LEN]; //DMA receive buffer

}USART_RECEIVETYPE;  


void UsartReceive_IDLE(UART_HandleTypeDef *huart);

extern    USART_RECEIVETYPE     UsartTy// printf重定向


// printf重定向

int fputc(int ch,FILE *f)

{

    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}


// USART不定長接收

void UsartReceive_IDLE(UART_HandleTypeDef *huart)  

{  

    uint32_t temp;  

  

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))  // Checks whether the specified UART idle flag is set or not.

    {   

        __HAL_UART_CLEAR_IDLEFLAG(huart);                                          // Clears the UART IDLE pending flag.

                HAL_UART_DMAStop(huart);                                                          // Stops the DMA Transfer.

        temp = huart->hdmarx->Instance->NDTR;                                  // Read DMA stream x number of data register 

        huart->hdmarx->Instance->NDTR = 0;                                        // Clear DMA stream x number of data register

        if(huart == &huart1)                                                                    // Checks whitch USART 

        {

            UsartType1.RX_Size =  RX_LEN - temp;   

            UsartType1.RX_flag=1;                                                          // Set RX_flag

            HAL_UART_Receive_DMA(&huart1, UsartType1.RX_pData, RX_LEN);  // start DMA interrupt and receives an amount of data in non blocking mode. 

        }

    }  


在xxx_it.c中斷函數(shù)中添加相應(yīng)串口的UsartReceive_IDLE( ) 函數(shù)


/**

* @brief This function handles USART1 global interrupt.

*/

void USART1_IRQHandler(void)

{

  /* USER CODE BEGIN USART1_IRQn 0 */

  UsartReceive_IDLE(&huart1);

  /* USER CODE END USART1_IRQn 0 */

  HAL_UART_IRQHandler(&huart1);

  /* USER CODE BEGIN USART1_IRQn 1 */


  /* USER CODE END USART1_IRQn 1 */

}


在主函數(shù)中需要開啟DMA接收中斷,和串口空閑中斷,程序如下:


  MX_GPIO_Init();

  MX_DMA_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_DMA(&huart1, UsartType1.RX_pData, RX_LEN);

  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);

    

  printf('**************C print 重定向*************rn');

  printf('**********USART_IDLE 不定長接收**********rn');

  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

        if(UsartType1.RX_flag)

        {

            HAL_UART_Transmit(&huart1, UsartType1.RX_pData, UsartType1.RX_Size, 0xff);

            UsartType1.RX_flag =  0;

        }

        

  /* USER CODE END WHILE */


  /* USER CODE BEGIN 3 */


  }


關(guān)鍵字:stm32  不定長接收  配置工程 引用地址:stm32之不定長接收

上一篇:STM32407+LAN8720A+LWIP 實(shí)現(xiàn)TCP Client
下一篇:STM32——ST-LINK通過BIN文件燒錄STM32芯片

推薦閱讀最新更新時(shí)間:2025-05-27 17:34

STM32(1):點(diǎn)亮LED(上)
概述 今天我們的開啟了STM32開發(fā)的第一站:點(diǎn)亮LED,今天的內(nèi)容包含了很多基礎(chǔ)的知識,也有一些勸退的意味,不過,如果你能夠扛得住這波攻勢的,我覺得你高嵌入式方面真的是“風(fēng)骨清奇,可造之材”。 程序總覽 typedef unsigned short int uint16_t; typedef unsigned int uint32_t; #define __IO volatile #define PERIPH_BASE ((uint32_t)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define
[單片機(jī)]
<font color='red'>STM32</font>(1):點(diǎn)亮LED(上)
《嵌入式-STM32開發(fā)指南》第一部分 入門篇 - 第7章 STM32固件庫與STM32Cube產(chǎn)品介紹
自STM32標(biāo)準(zhǔn)庫出道以來,備受廣大工程師和公司的喜愛,但是,從2013年開始,ST逐漸停止了對標(biāo)準(zhǔn)外設(shè)庫的更新和維護(hù)。目前,ST全力推崇HAL庫,STM32Cube就是與HAL庫配合使用圖形化編程官方IDE。 7.1 STM32庫簡介 到目前為止,ST有標(biāo)準(zhǔn)外設(shè)庫(SPL 庫)、HAL 庫、LL 庫 三種。前兩者都是常用的庫,后面的 LL 庫是 ST 最近才添加,隨 HAL 源碼包一起提供,目前支持的芯片也偏少。各庫如下所示: 圖1 標(biāo)準(zhǔn)庫、HAL 庫、LL 庫對比.png 其中,SPL 庫 和 HAL 庫兩者相互獨(dú)立,互不兼容。幾種庫的比較如下: 圖2各個(gè)庫對比.png 目前幾種庫對不同芯片的支持情況如下: 圖
[單片機(jī)]
STM32入門-時(shí)鐘篇
STM32中使用任何一個(gè)外設(shè)都必須打開相應(yīng)的時(shí)鐘。在STM32中有5個(gè)時(shí)鐘源可供用戶選擇: 1.HSI高速內(nèi)部時(shí)鐘,RC震蕩器,頻率為8MHz。 2.HSE高速外部時(shí)鐘,右英/陶瓷諧振器,或著外部時(shí)鐘源,4MHz-16MHz. 3.LSI內(nèi)部低速時(shí)鐘,RC震蕩器頻率為40Hz。 4.LSE外部低速時(shí)鐘,接頻率為32.768KHz的石英晶體。 5.PLL鎖相環(huán)頻輸出,時(shí)鐘源可選為HIS/2、HSE或HSE/2。倍頻可選2-16倍,但其輸出頻率最大不能超過72MHz。 系統(tǒng)時(shí)鐘SYSCLK,它是供STM32中絕大部分器件工作的時(shí)鐘源,系統(tǒng)時(shí)鐘可選擇為PLL輸出、HSI或者HSE。系統(tǒng)時(shí)鐘的做大頻率為72MHz,它通過AHB分頻器分頻后
[單片機(jī)]
要用STM32實(shí)現(xiàn)什么?為什么使用STM32而不是8051?
單片機(jī)用處這么廣,尤其是STM32生態(tài)這么火!如何快速上手學(xué)習(xí)呢? 你要考慮的是,要用STM32實(shí)現(xiàn)什么 為什么使用STM32而不是8051? 是因?yàn)?1的頻率太低,無法滿足計(jì)算需求?是51的管腳太少,無法滿足眾多外設(shè)的IO? 是51的功耗太大,電池挺不???是51的功能太弱,而你要使用SPI、I2C、ADC、DMA? 是51的內(nèi)存太小而你要存儲的東西太多? 當(dāng)你需要使用STM32某些功能,而51實(shí)現(xiàn)不了的時(shí)候,那STM32自然不需要學(xué)習(xí),你會直接去尋找STM32某方面的使用方法。比如要用spi協(xié)議的網(wǎng)卡、要使用串口通信、要使用rtos等等。寄存器vs庫函數(shù) 我的觀點(diǎn)是:當(dāng)你debug的時(shí)候寄存器很重要,當(dāng)你需要理解芯片工作細(xì)節(jié)
[單片機(jī)]
stm32怎么讀取io口輸入電平
要讀取STM32的IO口輸入電平,你可以使用GPIO外設(shè)來完成。GPIO是通用輸入輸出端口,它可以配置成輸入模式,用于讀取外部信號的電平。 首先,你需要定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體變量,用于配置GPIO的相關(guān)參數(shù)。這個(gè)結(jié)構(gòu)體包含了GPIO端口號、模式、速度、上拉下拉等參數(shù)。 接下來,你需要使用HAL庫中的HAL_GPIO_Init()函數(shù)來初始化GPIO端口。這個(gè)函數(shù)會使用結(jié)構(gòu)體中定義的參數(shù)來配置相應(yīng)的GPIO端口。 GPIO_InitTypeDef GPIO_InitStruct; // 配置GPIO端口 GPIO_InitStruct.Pin = GPIO_PIN_0; // 設(shè)置GPI
[單片機(jī)]
STM32 GPIO 寄存器的配置
配置每組IO口的寄存器:(每一組一套寄存器) 1、兩個(gè)32位的配置寄存器;GPIOx_CRL,GPIOx_CRH 2、兩個(gè)32位的數(shù)據(jù)寄存器:GPIOx_IDR,GPIOx_ODR 3、一個(gè)32位置位/復(fù)位寄存器:GPIOx_BSRR 4、一個(gè)16位的復(fù)位寄存器GPIOx_BRR 5、一個(gè)32位的鎖定寄存器GPIOx_LCKR 詳解 : CRL和CRH控制IO口,是四個(gè)位控制一個(gè)口,所以要兩個(gè)32位的來控制16個(gè)口 1、GPIOx_CRL:端口配置低寄存器: 每個(gè)口由四位控制,為MODE+CNF聯(lián)合配置,具體模式在下圖中。(輸入要與輸入對應(yīng),輸出也要與輸出對應(yīng)) 具體對應(yīng)輸入輸出配置表(對上圖的詳解): 2、GPIOx_
[單片機(jī)]
<font color='red'>STM32</font> GPIO 寄存器的<font color='red'>配置</font>
stm32單片機(jī)的基本工作原理
我們使用的大部分電器都使用了單片機(jī),那么stm32單片機(jī)的基本工作原理是什么呢?下面小編就帶大家了解一下stm32單片機(jī)的基本工作原理。 stm32的可控制的引腳是GPIO,GPIO能夠?qū)崿F(xiàn)與外部通訊和控制外部硬件的功能。 GPIO的八種工作模式 GPIO一共支持4種輸入模式以及4種輸出模式,并且GPIO還能夠支持3中最大翻轉(zhuǎn)速度。 4種輸入模式 浮空輸入、上拉輸入、下拉輸入、模擬輸入 4種輸出模式 開漏輸出、開漏復(fù)用輸出、推挽輸出、推挽復(fù)用輸出 3種最大翻轉(zhuǎn)速度 2MHz、10MHz、50MHz 浮空輸入_IN_FLOATING 帶上拉輸入_IPU 帶下拉輸入_IPD 模擬輸入_AIN 開漏輸出
[單片機(jī)]
STM32 系列MCU 不同型號的移植步驟解析
STM32 系列MCU 不同型號的移植! 第一步 更換啟動文件: 第二步 修改宏定義: 圖 1 或者修改stm32f10x.h 具體修改如下: 圖2 第三步 修改系統(tǒng)主頻率: 文件:system_stm32f10x.c 具體修改如下: 圖 3 第四步 修改外部晶振源: 文件:stm32f10x.h 具體修改如下: 圖 4 第五步 定時(shí)器需要根據(jù)以上修改的系統(tǒng)主頻率進(jìn)行對應(yīng)的修改。 其他: 修改 Flash 地址 文件:misc.h 具體修改如下: 圖 5 與以下配置一致: IAP 設(shè)置步驟 一、 IAP 工程設(shè)置 1、修改main 中的按鍵觸發(fā)鍵 2、修改下載串口 二、 下載工程設(shè)置 1、修改程序入
[單片機(jī)]
<font color='red'>STM32</font> 系列MCU 不同型號的移植步驟解析
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved