STM32 keil printf的使用

2020-12-25 電子產品世界
請在MDK(keil)工程屬性的「Target「-》」Code Generation「中勾

選」Use MicroLIB

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

前提是你有一個完整keil的工程 比如ADC的調試的時候很多時候用到串口 這裡教你怎麼樣使

用Printf 函數

紅色字句為重點!!!!!

若使得在程序中使用Printf需做一下幾步
1,輸入輸出文件包含#include
2,在程序下添加宏定義代碼

/* Private function prototypes -----------------------------------------------*/

#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to Yes) calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/* Private functions ---------------------------------------------------------*/

3,添加如下2個函數 usart配置 和 重定向 C庫的printf函數

/* System Clocks Configuration */

void RCC_Configuration(void)
{
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(USARTy_GPIO_CLK | USARTz_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE);

#ifndef USE_STM3210C_EVAL
/* Enable USARTy Clock */
RCC_APB2PeriphClockCmd(USARTy_CLK, ENABLE);
#else
/* Enable USARTy Clock */
RCC_APB1PeriphClockCmd(USARTy_CLK, ENABLE);
#endif
/* Enable USARTz Clock */
RCC_APB1PeriphClockCmd(USARTz_CLK, ENABLE);
}

/* System Clocks Configuration */

/* Configure the GPIO ports */

void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

#ifdef USE_STM3210C_EVAL
/* Enable the USART3 Pins Software Remapping */
GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);

/* Enable the USART2 Pins Software Remapping */
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
#elif defined(USE_STM3210B_EVAL) || defined(USE_STM32100B_EVAL)
/* Enable the USART2 Pins Software Remapping */
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
#endif

/* Configure USARTy Rx as input floating */
GPIO_InitStructure.GPIO_Pin = USARTy_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

/* Configure USARTz Rx as input floating */
GPIO_InitStructure.GPIO_Pin = USARTz_RxPin;
GPIO_Init(USARTz_GPIO, &GPIO_InitStructure);

/* Configure USARTy Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = USARTy_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

/* Configure USARTz Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = USARTz_TxPin;
GPIO_Init(USARTz_GPIO, &GPIO_InitStructure);
}

/* Configure the GPIO ports */

/* USARTy configuration ------------------------------------------------------*/

void USART_Configuration()
{

USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 230400;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_Even;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

/* Configure USARTy */
USART_Init(USARTy, &USART_InitStructure);
/* Configure USARTz */
USART_Init(USARTz, &USART_InitStructure);

}

/* USARTy configuration ------------------------------------------------------*/

/*Retargets the C library printf function to the USART. */
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1, (uint8_t) ch);


while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{}

return ch;
}

/*Retargets the C library printf function to the USART. */

3,然後就可以在main()調用

printf("The is a example!" );

printf("%s%c%c%c%c%c%s",
"#**",
Value/256,Value%6,
&,
Value_2/256,Value_2%6,
"**%");

之類的輸出函數

相關焦點

  • printf()函數重定向到STM32串口輸出
    printf()函數輸出是非常方便功能非常強大的,如果能將printf()函數使用到串口上,能實現非常多的強大輸出功能,極大方便我們使用串口輸出功能。()函數使用標準庫,標準庫中包括printf()等函數使用了半主機模式,導致無法運行(見參考)解決辦法:1,使用微庫,在工程屬性的Target->Code Generation中勾選Use MicroLIB2, 重新實現庫中某些函數,避免使用標準庫(見參考)參考:http://blog.csdn.net/wdscq1234/article
  • STM32+Keil 如何使用printf函數?
    那麼只能通過程序向硬體串口發數據了,這樣調用的時候用自定義的函數即可,也很方便,例如:本文引用地址:http://www.eepw.com.cn/article/201611/317105.htmvoid send_char_to_usart(unsigned char c){}但是可否直接使用printf函數呢?
  • 號稱目前網上嵌入式最好的printf,用起來!
    網上最好的printf?今天分享的例程有stm32f4ZG和cc2530f256,這個兩款晶片的移植例程和移植教程!相信你看完後也可以移植到別的晶片去!IAR for 8051 version 為 10.10.1可能會因為有些版本不同配置就略有所不同!
  • 單片機使用printf函數進行串口列印輸出
    以前在使用keil編寫51單片機程序的時候,經常使用printf函數列印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試 MSP430G2553 程序的時候,發現了一些小問題,MSP430G2553單片機並沒有按照我的預期輸出數據到電腦。帶著疑惑我查看了keil的幫助文件裡面的printf函數說明,原來printf函數最終是調用putchar函數來實現列印輸出字符的。
  • 單片機使用printf函數的兩種辦法
    今天就簡單來說說怎麼在51單片機中使用"printf"函數:包括使用自帶的printf函數和自己動手寫一個printf函數,再貼代碼之前先介紹幾個相關的知識,主要用於自己寫printf函數。97轉化為ASCII碼的97的程序就像下面這樣vsprintf(string,"%d",97),當然還有一點需要注意:在keil裡面使用sprintf需要包含stdio.h這個頭文件(當然這裡也可以使用sprintf,作用完全差不多,只需要稍加修改即可,不多介紹)。
  • MSP430G2553單片機使用printf函數進行串口列印輸出
    以前在使用keil編寫51單片機程序的時候,經常使用printf函數列印輸出一些關鍵的過程數據到電腦,方便監控程序的運行狀況。最近使用IAR for MSP430 調試MSP430G2553程序的時候,發現了一些小問題,MSP430G2553單片機並沒有按照我的預期輸出數據到電腦。
  • STM32中使用HAL庫重定向printf()函數
    //UartHandle是串口的句柄} //重定向函數2PUTCHAR_PROTOTYPE{  HAL_UART_Transmit(&UARTHandle, (uint8_t *)&ch, 1, 0xFFFF);   return ch;}在keil
  • STM32程序添加printf函數後無法運行的解決方法(串口實驗)
    (USART1, (uint8_t) ch);while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);return ch;}因printf()之類的函數,使用了半主機模式。
  • STM32中如何使用printf()函數
    STM32串口通信中使用printf發送數據配置方法(開發環境 Keil RVMDK在STM32串口通信程序中使用printf發送數據,非常的方便。可在剛開始使用的時候總是遇到問題,常見的是硬體訪真時無法進入main主函數,其實只要簡單的配置一下就可以了。
  • keil5.24創建uCOSIII工程實現stm32實時作業系統(環境配置)
    自從ARM keil升級到keil5系列版本後,Keil工具對作業系統,以及各種庫文件的移植大大簡化了只需要動動手指,勾選一些庫文件就能實現移植工作了。1:假設你安裝了keil 5.24(稍早點版本支持的os偏少),並且下載了你需要的支持包。
  • 開發STM32相關資料下載
    STM32CubeMX STM32CubeM軟體:http://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/
  • 如何在STM32單片機的MDK工程中使用printf
    打開APP 如何在STM32單片機的MDK工程中使用printf 發表於 2018-12-24 14:25:12 首先,要包含頭文件「stdio.h」 第二:printf()函數使用了int fputc(int ch,FILE *f)完成其功能。
  • STM32 使用 Keil MDK 中的軟體邏輯分析儀參與硬體調試(上)
    這個版本的 MDK 會包含程序運行所需要的所有文件,不使用 MDK 5 的 Software Pack。這篇文檔的 MDK 4 版本可以在這個連結找到:http://www.keil.com/appnotes/docs/apnt_261.asp。
  • Keil創建新的STM32工程以及CortexM3的位帶操作
    上周實驗課照例很水,首先是準備工作沒做好,J-Link的驅動沒裝好,而且由於機房電腦本身的問題好多機子無法正確裝驅動,或者在進入keil後會彈出莫名錯誤、閃退等情況,方老師說得好,當我們浪費時間再做這些事情的時候(浪費時間很大程度上是因為機房電腦造成的),好一點的學校早就在寫程序了。
  • 51,AVR,PIC,MSP430,STM32單片機比較
    IDE環境推薦 keil。編程器自己自製ISP下載線就行,好做,成本5元左右。STC12系列宏晶沒給出keil驅動。工具支持沒有自己的,要用keil的,在深層應用上會出現隱患。IDE:keil頭文件:宏晶網站上有,或者用at89x52.h,新的寄存器自己定義一下就行或者自己寫一個頭文件(推薦)。
  • 51單片機實現scanf和printf函數
    最開始學習C語言時,使用printf和scanf進行格式化輸入輸出十分方便。本文引用地址:http://www.eepw.com.cn/article/201611/318359.htm最近又研究了一下keil中針對printf和scanf的實現機理,做了一些改動,實現了標準格式化輸入輸出,共大家參考。1.
  • 【經典】把脈printf中的C進階技巧
    因為printf需要實現可變參數,那麼肯定是需要有約定的傳參數的規則,該約定的規則就決定了函數內部如何獲得對應參數。    對於大部分小夥伴在平時的開發中基本上都是使用固定的參數類型,不過對於類似於printf這種用戶接口使用型函數,實現可變參數就顯得更加具有靈活性。學習過C++的小夥伴應該有種感覺,可變參數有點類似於函數重載,不過C的可變參數必須包含一個參數。
  • IAR STM32 函數和變量的絕對地址定位
    那麼被這些調用的函數內,可以隨意調用其他函數,如printf ,strcpy等庫函數了。絕對定位的函數,如果要使用常量,那麼被使用的常量也必須是絕對定位的。否則跨工程更新固件,會導致失敗。絕對定位的函數,如果要使用全局變量,那麼被使用的常量也必須是絕對定位的。否則跨工程更新固件,會導致失敗。而局部變量則不受此限制。
  • Keil環境下STM32工程加入cJSON
    include "usart.h"#include "string.h" #include <stdio.h>#include "cJSON.h"void ParseStrDemo(void){ char strArr[] = "{\"name\":\"Andy\",\"age\":20}"; cJSON *str_json, *str_name, *str_age; prin