1. 程式人生 > >STM32cube HAL庫 UART串列埠中斷方式收發任意長度 除錯筆記

STM32cube HAL庫 UART串列埠中斷方式收發任意長度 除錯筆記

STM32Cube對於新專案的開發能節省不少時間,從繁瑣晶片初始化中解脫出來

1.STM32 UART初始化部分,配置好工程,採用STM32cube生成程式碼,初始化即已經完成。

2.串列埠中斷方式的發動作:HAL_UART_Transmit_IT

沒做任何處理的情況下,我們在程式中使用printf會把資訊列印到顯示屏中去,這時我們需要將printf重定向就能將printf的訊息列印到串列埠中 去。在主函式中新增如下函式:

int fputc(int ch, FILE *f) 
{
    HAL_UART_Transmit_IT(&huart1, (uint8_t *)&ch, 1);
    osDelay(1);
    return 0;
}

//即完成重定向,執行printf即能將任意長度的字元傳送到串列埠中

3.串列埠中斷的收動作:HAL_UART_Receive_IT

HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);//程式不會在這個語句停留,直接會按照中斷方式把接收資料存放在value中,但是這個語句只能使能一次串列埠中斷。所以要在中斷服務函式或者回調函式中重新使能
程式碼:
//接收快取初始化
#define MAX_RECV_LEN 1024 
uint8_t msg_buff[MAX_RECV_LEN] = {0};
uint8_t * msg = msg_buff;
static int flag = false;
//接收中斷回撥函式
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)  
{  
    uint8_t ret = HAL_OK;
    msg++;
    if( msg == msg_buff + MAX_RECV_LEN)
    {
        msg = msg_buff;
    }
    do  
    {  
        ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);            
    }while(ret != HAL_OK);
    
    if(*(msg-1) == '\n')   //接收以\n為結尾字元,則表示接收完成
    {
        flag  = true;
    } } 
void uart_main(void)
{
    extern UART_HandleTypeDef huart1;
    HAL_UART_Receive_IT(&huart1, (uint8_t *)msg, 1); //開啟第一次中斷

    while(1)
    {
        if (flag == true)
        {
            printf("msg_buff = %s\r\n",msg_buff);
            memset(msg_buff, 0, sizeof(msg_buff));   //清空快取區
            // 指向接收快取的頭部
            msg = msg_buff;
            (&huart1)->pRxBuffPtr = msg;
            flag = false;
        }
        osDelay(10);
    }
}

相關推薦

STM32cube HAL UART串列中斷方式收發任意長度 除錯筆記

STM32Cube對於新專案的開發能節省不少時間,從繁瑣晶片初始化中解脫出來1.STM32 UART初始化部分,配置好工程,採用STM32cube生成程式碼,初始化即已經完成。2.串列埠中斷方式的發動作:HAL_UART_Transmit_IT沒做任何處理的情況下,我們在程式

STM32F072從零配置工程-基於HAL串列UART中斷配置

先上一個採用串列埠直接傳輸的Demo; 此處的思路是完全採用HAL庫來實現的,核心是運用HAL_UART_Transmit_IT和HAL_UART_Receive_IT兩個函式來實現的,可以作為一個Demo來測試使用; 直接上程式碼,其串列埠的配置和上一章完全一致,因此忽略不計:   

HAL關於串列接收中斷接收不定長字元實現

1、IO口基本配置:     GPIO_InitStruct.Pin = CTR_UART4_TX;   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; //  GPIO_InitStruct.Pull = GPIO_NOPULL;   GP

STM32串列中斷方式接收

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

51 微控制器UART 串列通訊[ 方式1 ]實現

1  51序列口結構 51微控制器的UART序列通訊是基於其序列口的可程式設計硬體結構,只要用正確的程式程式碼通過初始化序列口對應暫存器的形式將其序列硬體結構初始化,再編寫符合此序列口通訊的程式程式碼

STM32 HAL串列詳細篇

一、基礎認識 (一) 並行通訊 原理:資料的各個位同時傳輸 優點:速度快 缺點:佔用引腳資源多,通常工作時有多條資料線進行資料傳輸 8bit資料傳輸典型連線圖: 傳輸的資料是二進位制:11101010,則通訊使用8條線同時進行資料傳輸,傳送端一次性發送8位資料,接收端一次性接收8位資料。 (二) 序列通訊

HAL串列中斷接收

1.利用CubeMX配置串列埠1 (1)配置串列埠1波特率為9600,波特率設定的太高有時會收不到訊息,我碰到過。然後開啟串列埠中斷,在中斷中接收資料。但是不要在中斷中處理資料,中斷中儘量少做一些事情 2.程式設計中用到的函式 (1)HAL庫中提供了很多串列埠操作的函式,有輪詢模式收發,

HAL的基礎上修改串列中斷函式,使串列中斷接收不定長資料,且不發生丟失現象。

        之前一直用STM32CUBE配置工程,但是一用到USART1的DMA接收中斷,或者USART1的接收中斷,就會出現問題,在之前的除錯中發現USART1的DMA與ADC1的DMA有衝突(原因我也不造啊),後來將USART1的DMA接收中斷改成USART1的接收中

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

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

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

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

STM32HAL中斷模式串列初始化收發資料

hal庫裡面路徑:STM32Cube_FW_L0_V1.10.0\Projects\STM32L053C8-Discovery\Examples \UART\UART_TwoBoards_ComIT 工程是串列埠1中斷收發模式配置 UART_HandleTypeDef

STM32 HAL 串列中斷接收模式出錯的原因

用STM32 HAL庫,串列埠使用中斷模式,發現程式有時候會進去死鎖狀態,原因應該是串列埠在傳送過程中,這時候資料又被髮送過去了,然後就很容易會死鎖了。上網找了相關的資料,見連結:https://blog.csdn.net/mickey35/article/details/7

串列中斷

設定中斷是對核心操作,故應該在核心系統檔案中進行配置。 1.D:\KEIL軟體\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc 2.還是上面的路徑,複製以下程式碼: #define

UART串列通訊淺談之(三)--字元與資料的轉換

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/solar_Lan/article/details/78093692 學串列埠通訊的應用主要是實現微控制器和電腦之間的資訊互發,可以用電腦控制微控制器的一些資訊,可以把微控制器的一些資訊狀況發給電腦

UART串列通訊淺談之(二)--暫存器設定

1.1 通訊的三種基本型別 常用的通訊通常可以分為單工、半雙工、全雙工通訊。 單工就是指只允許一方向另外一方傳送資訊,而另一方不能回傳資訊。比如我們的電視遙控器,我們的收音機廣播等,都是單工通訊技術。 半雙工是指資料可以在雙方之間相互傳播,但是同一時刻只能其中一方發給另外一方,

UART串列通訊淺談之(一)--基礎概述

通訊按照傳統的理解就是資訊的傳輸與交換。UART(Universal Asynchronous Receiver/Transmitter,即通用非同步收發器)序列通訊是微控制器最常用的一種通訊技術,通常用於微控制器和電腦之間以及微控制器和微控制器之間的通訊。 以下我們以STC98C52微控制器為

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

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

STM32 UART串列驅動程式

文章原始地址: http://feotech.com/?p=56 示例1.通過UART1進行資料傳送 UART 1 的初始化 /** * @brief UART1 Initialise. * @param None. * @retval None. */ void UART

STM32的CubeMX關於串列中斷接收

C語言 作為剛工作不久的小白,剛接觸STM32的HAL庫,工作中使用到了,就記錄下自己遇到的問題,希望看到的大佬多多指教。 1、關於串列埠的初始化函式:     MX_USART2_UART_Init()---波特率、奇偶校驗等配置  &nb

日常生活小技巧 -- UART (串列)迴環測試

轉自https://blog.csdn.net/qq_29350001/article/details/77335721   新買的USB轉串列埠線。需要測試一下是否是OK的。該如何測試? 其實很簡單,就是講 Tx  和 Rx 短接,即DB9 的 2、3 兩針接在一起