1. 程式人生 > >STM32M CUBE實現printf列印除錯資訊以及實現單位元組接收

STM32M CUBE實現printf列印除錯資訊以及實現單位元組接收

相關文章

在寫微控制器程式時我們一般喜歡使用printf來通過串列埠列印除錯資訊,但這個函式是不可以直接使用的,必須做點對庫函式的改動。

STM32M CUBE是ST官方提供的庫以及初始化工具,很好很強大,但是在UART方面值提供瞭如下函式:

?
123456HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

分別實現普通收發,中斷收發,DMA收發,問題是所有函式要求傳送和接收的buf必須要事先知道長度,也沒有提供對單位元組的收發,無法直接實現printf以及單位元組接收。

其實要實現這些還是很簡單的,首先是實現printf

在main.c 新增如下資訊

?
1234567891011121314151617181920212223242526#include <stdio.h>#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int__io_putchar(intch)#else#define PUTCHAR_PROTOTYPE intfputc(intch, FILE *f)#endif/* __GNUC__ *//*** @brief  Retargets the C library printf function to the USART.* @param  None* @retval None*/PUTCHAR_PROTOTYPE{/* Place your implementation of fputc here *//* e.g. write a character to the USART */huart1.Instance->DR = (uint8_t) ch;/* Loop until the end of transmission */while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}returnch;}</stdio.h>

在這裡我們實現了單位元組傳送函式,注意實現這種傳送方式的前提是單位元組傳送的相關中斷不能開啟,否則會進入無限等待,做好之後就可以使用printf了。?
12345678910voidLED_Task2(voidconst * argument){while(1){HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_14);printf(LED_Task2);osDelay(2000);}}

然後是中斷單位元組接收,修改中斷接收函式如下:?
123456789101112131415voidUSART1_IRQHandler(void){/* USER CODE BEGIN USART1_IRQn 0 */staticint count=0;/* USER CODE END USART1_IRQn 0 *///  HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) == SET)//有接受到字串{uart_recbuf[count++] = (uint8_t)(huart1.Instance->DR & (uint8_t)0x00FF);//接收huart1.Instance->DR = uart_recbuf[count-1];//傳送接收的資料if(count == 100) count = 0;}/* USER CODE END USART1_IRQn 1 */}

注意使用cube生成的程式碼預設是沒有開啟接收中斷使能的,要在這裡開啟:?
12345678910111213141516171819202122232425262728

相關推薦

STM32M CUBE實現printf列印除錯資訊以及實現位元組接收

相關文章在寫微控制器程式時我們一般喜歡使用printf來通過串列埠列印除錯資訊,但這個函式是不可以直接使用的,必須做點對庫函式的改動。STM32M CUBE是ST官方提供的庫以及初始化工具,很好很強大,但是在UART方面值提供瞭如下函式:?123456HAL_StatusTy

除錯技巧:封裝printf列印除錯資訊和巨集定義開關

/* #define DEBUG */ #ifdef DEBUG #define DEBUG_ERR(format, ...) \ do{ \ printf("\r\n"); \ printf("FILE: "__FILE__", LINE: %

linux C巨集定義實現列印除錯資訊

本文僅實現了三種巨集定義除錯     #define LOG(s)                                   日誌顯示(檔名:行號}+日誌資訊     #define ERROR(s)                            錯誤資訊

stm32實現printf列印log的幾種辦法

在stm32微控制器下,改一些bug的時候,光靠除錯還不行,有時候需要列印log來檢視某些變數在一段時間內的變化趨勢,但是板卡又沒有接串列埠,沒辦法重定向到串列埠列印,上網查資料研究了一下,發現以下幾種辦法可實現微控制器像在pc終端一樣列印log: 方法1:使用串列埠重定向

使用vs2017編寫不帶console視窗程式時,使用printf列印輸出資訊

在使用vs2017編寫不帶console視窗程式時,有時需要列印一些資訊,來方便知道一些比如變數的值等,以往都是笨笨的使用messagebox彈出,但是當需要看多個值得時候,這種方法顯然就很難受了,也想過在vs中列印,也感覺不舒服,最後在網上看到可以用一個使用console視窗列印,在程式中照常使用

Android列印除錯資訊幾種方法===>Log

Android程式設計的孩子就喜歡列印好多好多的除錯資訊,也沒辦法,誰讓咱們菜呢 1傳統java方法 System.out.println("===>start!");(1)看不懂?回家補你的JAVA去吧! (2)能用,但是不推薦,不信你看            

/dev/kmsg在串列埠列印除錯資訊

#include <stdio.h> #include <string.h> #include <stdarg.h> static void mp4api_dbprint_ttxgz(char* format,.

日誌列印的規範以及實現方式

1. WHY 為什麼要做日誌? 原因1:跟蹤應用的警告和錯誤,標識程式執行中的危險操作、錯誤操作,進而便於在出現問題時排查問題 原因2:跟蹤崩潰bug,在開發過程中,日誌可以幫助開發者和軟體測試人員跟蹤程式崩潰的原因 原因3:跟蹤效能下降的問題範圍,產品所反映

Qt 列印除錯資訊

 列印當前目錄程式碼如下,別忘了標頭檔案#include <QDir> #include<QtDebug> QString path = QDir::currentPath(); qDebug()<<"currentPath:"

tf列印除錯資訊方法

參考資料:https://wookayin.github.io/tensorflow-talk-debugging幾種常用方法:1.通過Session.run()獲取變數的值2.利用Tensorboard檢視一些視覺化統計3.使用tf.Print()和tf.Assert()列印變數4.使用Python的deb

列印除錯資訊的總結 pr_dbug pr_err pr_info

在核心中經常見到一些除錯列印資訊。pr_debug,pr_err等。以前的理解是以為只有出錯才會將pr_err中的內容打印出來,現在看來是錯的。pr_err並不等同與perror。 關於pr_err,pr_debug的定義有兩種: 第一種 (tools\perf\util

自定義bean物件實現序列化介面(Writable)以及實現案例

自定義bean物件序列化傳輸必須注意 (1) 實現Writable介面 (2)反序列化時,需要反射呼叫空建構函式,所以必須有空構造 public FlowBean() { super(); } (3)重寫序列化方法 @Override pu

自定義MediaController來實現修改底部佈局作以及實現vedioview半屏與全屏的切換

因為直接使用系統vedioview,底部的MediaController佈局有點不好看,尤其是進度條,不能實現辦半屏與全屏的切換,自己網上看了下別人的資料,整理了下,做以筆記;初學者,勉強才實現這些功能,還有許多地方不明白。 看下效果:                   

實現檔案上傳,以及提交成功的回撥函式

主要將實現一下兩個功能: 1、使用commons-fileupload實現檔案的上傳(包括圖片);2、使用jquery-form.js實現表單提交成功的回撥函式。 <%@ page language="java" contentType="text/html;

iOS使用ZBar實現二維碼掃描以及實現識別相簿中二維碼圖片功能

使用zbar呼叫相機掃碼程式碼: //開啟相機 - (void) init_camera { self.navigationController.navigationBarHidden=YES;     [commonaddNavigationAddToView:

巨集定義實現除錯資訊列印控制

/* * 列印除錯資訊 */ #define DEBUG_SWITCH #ifdef DEBUG_SWITCH #define pr_debug(fmt,args...) printf(fmt, ##args) #else #define pr_debug

VS2010 MFC中實現printf除錯功能,即MFC程式利用控制檯輸出除錯資訊

原文地址: 包含的標頭檔案,原文看不到,這裡我添上了 1、在專案自動生成的stdafx.h檔案中新增下面標頭檔案 #include <io.h> #include <fcntl.h> 2、把下面的函式加到你初始化的地方,然後你就可以使用

VC2010 MFC中實現printf除錯功能,即MFC程式利用控制檯輸出除錯資訊

1. 在專案自動生成的stdafx.h檔案中新增下面標頭檔案#include <io.h>#include <fcntl.h>#include <stdio.h>2、把下面的函式加到你初始化的地方,然後你就可以使用printf函數了void InitConsoleWind

Android ffmpeg除錯資訊列印在logcat裡

移植ffmpeg到android上,由於無法檢視除錯資訊而無法分析錯誤,特此記錄下如何列印ffmpeg的資訊至logcat裡。 1.編寫android_log.h檔案 #include <android/log.h> static int use_log_re

J-LINK RTT的實現 用RTT代替串列埠printf輸出除錯程式

關鍵字 JLINK  RTT  printf J-LINK RTT功能簡介 https://segger.com/jlink-real-time-terminal.html RTT實現程式碼下載地址http://download.segger.com/J-Link/RT