STM32中如何使用printf()函數

2020-12-25 電子產品世界
STM32串口通信中使用printf發送數據配置方法(開發環境 Keil RVMDK

在STM32串口通信程序中使用printf發送數據,非常的方便。可在剛開始使用的時候總是遇到問題,常見的是硬體訪真時無法進入main主函數,其實只要簡單的配置一下就可以了。

本文引用地址:http://www.eepw.com.cn/article/201611/321205.htm

下面就說一下使用printf需要做哪些配置。

有兩種配置方法:

一、對工程屬性進行配置,詳細步驟如下

1、首先要在你的main 文件中 包含「stdio.h」 (標準輸入輸出頭文件)。

2、在main文件中重定義函數如下:

// 發送數據

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (unsigned char) ch);// USART1 可以換成 USART2 等

while (!(USART1->SR & USART_FLAG_TXE));

return (ch);

}

// 接收數據

int GetKey (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

這樣在使用printf時就會調用自定義的fputc函數,來發送字符。

3、在工程屬性的 「Target" -> "Code Generation" 選項中勾選 "Use MicroLIB"」

MicroLIB 是預設C的備份庫,關於它可以到網上查找詳細資料。

至此完成配置,在工程中可以隨意使用printf向串口發送數據了。

二、第二種方法是在工程中添加「Regtarge.c」文件

1、在main文件中包含 「stdio.h」 文件

2、在工程中創建一個文件保存為 Regtarge.c ,然後將其添加工程中

在文件中輸入如下內容(直接複製即可)

#include

#include

#pragma import(__use_no_semihosting_swi)

extern int SendChar(int ch); // 聲明外部函數,在main文件中定義

extern int GetKey(void);

struct __FILE {

int handle; // Add whatever you need here

};

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f) {

return (SendChar(ch));

}

int fgetc(FILE *f) {

return (SendChar(GetKey()));

}

void _ttywrch(int ch) {

SendChar (ch);

}

int ferror(FILE *f) { // Your implementation of ferror

return EOF;

}

void _sys_exit(int return_code) {

label: goto label; // endless loop

}

3、在main文件中添加定義以下兩個函數

int SendChar (int ch) {

while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可換成你程序中通信的串口

USART1->DR = (ch & 0x1FF);

return (ch);

}

int GetKey (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

至此完成配置,可以在main文件中隨意使用 printf 。

相關焦點

  • printf()函數重定向到STM32串口輸出
    /html/1573.htmlC語言中使用printf()函數輸出是非常方便功能非常強大的,如果能將printf()函數使用到串口上,能實現非常多的強大輸出功能,極大方便我們使用串口輸出功能。printf()函數是輸出到顯示器,而MCU是沒有顯示器的,要使他輸出到串口,需要重定向該函數printf()函數中調用fputc()函數,只要對該函數進行重定向,即可實現功能//使用printf()函數要添加頭文件「stdio.h"#include "stdio.h"//printf()函數重定向到USART2
  • STM32+Keil 如何使用printf函數?
    那麼只能通過程序向硬體串口發數據了,這樣調用的時候用自定義的函數即可,也很方便,例如:本文引用地址:http://www.eepw.com.cn/article/201611/317105.htmvoid send_char_to_usart(unsigned char c){}但是可否直接使用printf函數呢?
  • STM32程序添加printf函數後無法運行的解決方法(串口實驗)
    (USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;}因printf()之類的函數,使用了半主機模式。
  • 如何在STM32單片機的MDK工程中使用printf
    打開APP 如何在STM32單片機的MDK工程中使用printf 發表於 2018-12-24 14:25:12 首先,要包含頭文件「stdio.h」 第二:printf()函數使用了int fputc(int ch,FILE *f)完成其功能。
  • STM32 keil printf的使用
    這裡教你怎麼樣使用Printf 函數紅色字句為重點!!!!!若使得在程序中使用Printf需做一下幾步1,輸入輸出文件包含#include 2,在程序下添加宏定義代碼/* Private function prototypes -----------------------------------------------*/#ifdef __GNUC__
  • 如何在單片機上使用printf函數
    當我們在調試代碼時,通常需要將程序中的某個變量列印至PC機上,來判斷我們的程序是否按預期的運行,printf函數很好的做到了這一點,它能直接以字符的方式輸出變量名和變量的值,這樣使輸出的信息很直觀;但printf函數在使用時,不僅僅要初始化串口
  • STM32中使用HAL庫重定向printf()函數
    函數添加頭文件#include "stdio.h"添加函數// 重定向函數1int fputc(int ch,FILE *f){    uint8_t temp[1]={ch};    HAL_UART_Transmit
  • IAR STM32 函數和變量的絕對地址定位
    } .icf文件,加入這樣一句:place at address mem:0x08017000 { readonly section .sendstr};方法二)把要更新的函數,單獨放在一個.c文件中,然後再.icf文件裡面,對該文件進行定位:test.cint f1(int a,int b){if(a>0){
  • 【經典】把脈printf中的C進階技巧
    因為printf需要實現可變參數,那麼肯定是需要有約定的傳參數的規則,該約定的規則就決定了函數內部如何獲得對應參數。    對於大部分小夥伴在平時的開發中基本上都是使用固定的參數類型,不過對於類似於printf這種用戶接口使用型函數,實現可變參數就顯得更加具有靈活性。學習過C++的小夥伴應該有種感覺,可變參數有點類似於函數重載,不過C的可變參數必須包含一個參數。
  • 單片機使用printf函數的兩種辦法
    今天就簡單來說說怎麼在51單片機中使用"printf"函數:包括使用自帶的printf函數和自己動手寫一個printf函數,再貼代碼之前先介紹幾個相關的知識,主要用於自己寫printf函數。①C語言函數:vsprintf,本文引用地址:http://www.eepw.com.cn/article/201611/321829.htm其原型為int vsprintf(char *string, char *format, va_list param);,作用為將param按格式format寫入字符串string中,因此他可以用於將任何格式數據轉化為字符串數據,比如把整數
  • 在使用串口列印printf()函數時的配置
    在使用串口列印printf()函數時的配置在STM32串口通信程序中使用printf發送數據,非常的方便。可在剛開始使用的時候總是遇到問題,下面就說一下使用printf需要做哪些配置。printf函數是c語言庫stdio.h中的函數,在使用printf列印時,應包含頭文件,其次還要配置fputc()函數,1、首先要在你的main 文件中 包含「stdio.h」 (標準輸入輸出頭文件)。
  • 單片機使用printf函數進行串口列印輸出
    以前在使用keil編寫51單片機程序的時候,經常使用printf函數列印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試 MSP430G2553 程序的時候,發現了一些小問題,MSP430G2553單片機並沒有按照我的預期輸出數據到電腦。帶著疑惑我查看了keil的幫助文件裡面的printf函數說明,原來printf函數最終是調用putchar函數來實現列印輸出字符的。
  • 學習c語言筆記——C庫函數printf()
    c語言中的printf是什麼來的?」。我答:「它是一個函數,主要用來輸出運算結果。」 ,下面就給大家介紹C庫函數printf()使用方法。下面我們通過一個調用c庫函數的c語言案例來說明printf()函數的使用方法,如c語言1。
  • 關於單片機程序中使用printf的一點建議
    在Keil函數中,用printf函數調試起來很方便。但必須注意以:1.必須先初始化串口,否則可能引起死機的情況,並且在printf之前應該先將TI置位。
  • TrueStudio開發工具:printf函數輸出使用沒方向,怎麼辦?
    在TrueStudio開發工具中使用printf函數如果第一次接觸可能會找不到方向,現將最近剛剛接觸STM32CubeMX配置生成TrueStudio工程串口列印的使用過程進行如下說明。開始編寫及設置讓你的程序支持printf輸出首先我在usart.c中添加如下函數即可讓TrueStudio支持printf輸出  注意:代碼必須添加在USER
  • MSP430G2553單片機使用printf函數進行串口列印輸出
    以前在使用keil編寫51單片機程序的時候,經常使用printf函數列印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試MSP430G2553程序的時候,發現了一些小問題,MSP430G2553單片機並沒有按照我的預期輸出數據到電腦。
  • glibc中的printf如何輸出到串口
    首先看glibc中printf函數的定義(glibc-2.3.6/stdio-common/printf.c):[plain]view plaincopyprint?*/strong_alias(printf,_IO_printf);strong_alias,即取別名。網上有人提及這個strong alias好像是為了防止c庫符號被其他庫符號覆蓋掉而使用的,如果printf被覆蓋了,還有_IO_printf可以用。
  • 51單片機實現scanf和printf函數
    最開始學習C語言時,使用printf和scanf進行格式化輸入輸出十分方便。本文引用地址:http://www.eepw.com.cn/article/201611/318359.htm最近又研究了一下keil中針對printf和scanf的實現機理,做了一些改動,實現了標準格式化輸入輸出,共大家參考。1.
  • C語言中的scanf與printf
    為實現這樣的操作,C語言提供了scanf與printf兩個函數,使用它們之前,一般需要包含stdio.h頭文件。語法是: #include 1. 使用scanf函數的注意事項。也可以使用一條scanf函數語句實現:scanf(「%d%d」,&a,&b); //注意兩個%d是放在一個雙引號內,中間不需要使用任何分隔符,在程序運行輸入數據時,用戶可以用空格或回車將兩個數分隔開。特別提醒注意的是:如果寫成 scanf(「%d,%d」,&a,&b); 那麼用戶在輸入數據時,中間也必須用,將兩個輸入數據分隔開。
  • 關於printf和scanf函數的一些問題(含拓展)
    一、printf函數這是在stdio.h中聲明的一個函數,因此使用前必須加入#include <stdio.h>,使用它可以向標準輸出設備(比如屏幕)輸出數據。,比如使用%d,說明對應的格式符參數必須是整型。