国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32學(xué)習(xí)5】STM32使用printf函數(shù) 打印到電腦串口助手

這篇具有很好參考價值的文章主要介紹了【STM32學(xué)習(xí)5】STM32使用printf函數(shù) 打印到電腦串口助手。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


本文所使用的方法與代碼參考自正點原子,如果想要詳細(xì)了解這方面的知識,請閱讀正點原子官方提供的文檔。


一、背景

在開發(fā)STM32應(yīng)用時,將一些信息通過串口打印到電腦上是常用的調(diào)試手段。C語言標(biāo)準(zhǔn)庫中的printf函數(shù)是我們常用的打印函數(shù)。但是在STM32應(yīng)用下一般無法直接使用這個函數(shù),正點原子給出的解釋如下,有興趣可以詳細(xì)了解一下。

標(biāo)準(zhǔn)庫下的 printf 為調(diào)試屬性的函數(shù),如果直接使用,會使單片機(jī)進(jìn)入半主機(jī)模式(semihosting),這是一種調(diào)試模式,直接下載代碼后出現(xiàn)程序無法運(yùn)行,但是在連接調(diào)試器進(jìn)行 Debug 時程序反而能正常工作的情況。半主機(jī)是 ARM 目標(biāo)的一種機(jī)制,用于將輸入/輸出請求從應(yīng)用程序代碼通信到運(yùn)行調(diào)試器的主機(jī)。例如,此機(jī)制可用于允許 C 庫中的函數(shù)(如 printf()和 scanf())使用主機(jī)的屏幕和鍵盤,而不是在目標(biāo)系統(tǒng)上設(shè)置屏幕和鍵盤。這很有用,因為開發(fā)硬件通常不具有最終系統(tǒng)的所有輸入和輸出設(shè)備,如屏幕、鍵盤等。半主機(jī)是通過一組定義好的軟件指令(如 SVC)SVC 指令(以前稱為 SWI 指令)來實現(xiàn)的,這些指令通過程序控制生成異常。應(yīng)用程序調(diào)用相應(yīng)的半主機(jī)調(diào)用,然后調(diào)試代理處理該異常。調(diào)試代理(這里的調(diào)試代理是仿真器)提供與主機(jī)之間的必需通信。也就是說使用半主機(jī)模式必須使用仿真器調(diào)試。
如果想在獨(dú)立環(huán)境下運(yùn)行調(diào)試功能的函數(shù),我們這里是 printf,printf 對字符 ch 處理后寫入文件 f,最后使用 fputc 將文件 f 輸出到顯示設(shè)備。對于 PC 端的設(shè)備,fputc 通過復(fù)雜的源碼,最終把字符顯示到屏幕上。那我們需要做的,就是把 printf 調(diào)用的 fputc 函數(shù)重新實現(xiàn),重定向fputc 的輸出,同時避免進(jìn)入半主模式。

目前想要在SMT32上使用printf有兩種方法:

  1. 通過代碼取消ARM的半主機(jī)工作模式,并重定向printf函數(shù)
  2. 使用微庫MicroLib,并重定向printf函數(shù)。

由于微庫裁剪了許多標(biāo)準(zhǔn)庫的功能,如果注重功能完整性建議使用第一種方法。

二、取消ARM的半主機(jī)工作模式

添加stdio.h頭文件,并在程序中加入以下代碼段即可(代碼引自正點原子)

/******************************************************************************************/

/* 在合適的位置引用下面頭文件 */
#include <stdio.h>

/* 加入以下代碼, 支持printf函數(shù), 而不需要選擇use MicroLIB */

#if 1
#if (__ARMCC_VERSION >= 6010050)                    /* 使用AC6編譯器時 */
__asm(".global __use_no_semihosting\n\t");          /* 聲明不使用半主機(jī)模式 */
__asm(".global __ARM_use_no_argv \n\t");            /* AC6下需要聲明main函數(shù)為無參數(shù)格式,否則部分例程可能出現(xiàn)半主機(jī)模式 */

#else
/* 使用AC5編譯器時, 要在這里定義__FILE 和 不使用半主機(jī)模式 */
#pragma import(__use_no_semihosting)

struct __FILE
{
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
};

#endif

/* 不使用半主機(jī)模式,至少需要重定義_ttywrch\_sys_exit\_sys_command_string函數(shù),以同時兼容AC6和AC5模式 */
int _ttywrch(int ch)
{
    ch = ch;
    return ch;
}

/* 定義_sys_exit()以避免使用半主機(jī)模式 */
void _sys_exit(int x)
{
    x = x;
}

char *_sys_command_string(char *cmd, int len)
{
    return NULL;
}

/* FILE 在 stdio.h里面定義. */
FILE __stdout;

/* 重定義fputc函數(shù), printf函數(shù)最終會通過調(diào)用fputc輸出字符串到串口 
其中串口可根據(jù)實際使用情況調(diào)整 */
int fputc(int ch, FILE *f)
{
    while ((USART1->SR & 0X40) == 0);             /* 等待上一個字符發(fā)送完成 */

    USART1->DR = (uint8_t)ch;                     /* 將要發(fā)送的字符 ch 寫入到DR寄存器 */
    return ch;
}
#endif
/***********************************************END*******************************************/

上面代碼段使用的是串口1(USART1),可根據(jù)實際使用情況調(diào)整。

三、使用微庫MicroLib

直接在Keil中的如下界面勾選使用微庫
stm32 printf,STM32,嵌入式硬件,c語言,單片機(jī),學(xué)習(xí)
并添加如下代碼段重定向fputc

/* 在合適的位置引用下面頭文件 */
#include <stdio.h>

/* 重定義 fputc 函數(shù), printf 函數(shù)最終會通過調(diào)用 fputc 輸出字符串到串口 */
/* 串口可根據(jù)實際使用情況調(diào)整 */
int fputc(int ch, FILE *f)
{
 while ((USART1->ISR & 0X40) == 0); /* 等待上一個字符發(fā)送完成 */
 USART1->TDR = (uint8_t)ch; /* 將要發(fā)送的字符 ch 寫入到 DR 寄存器 */
 return ch;
}

微庫由于裁剪掉了一些功能,有著如下特點:

  • 微庫會優(yōu)化代碼空間,但會降低某些程序的執(zhí)行效率(比如: memcpy()),效率換空間
  • 微庫不支持浮點運(yùn)算,所以在有FPU單元的MCU上,使用MicroLIB并開啟FPU會讓程序死機(jī)或跑飛
  • 微庫不支持C++,在使用C++開發(fā)MCU時不能使用MicroLib
  • 微庫不支持操作系統(tǒng)函數(shù)

更詳細(xì)的講解可參見博文STM32程序不運(yùn)行與MicroLIB講解

四、應(yīng)用

采用了上面任意一種方法設(shè)置后,我們便可在程序中使用printf,并通過串口打印在電腦端的串口助手上。

		printf("123\r\n");
		
		HAL_Delay(500);

stm32 printf,STM32,嵌入式硬件,c語言,單片機(jī),學(xué)習(xí)文章來源地址http://www.zghlxwxcb.cn/news/detail-782748.html

到了這里,關(guān)于【STM32學(xué)習(xí)5】STM32使用printf函數(shù) 打印到電腦串口助手的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • stm32 ->HAL庫重定向printf,實現(xiàn)串口打印

    stm32 ->HAL庫重定向printf,實現(xiàn)串口打印

    在CubeMX中初始化uart引腳 包含printf函數(shù)的頭文件 stdio.h 重定義printf函數(shù) 勾選 Use MicroLIB 編譯燒錄

    2024年02月16日
    瀏覽(27)
  • stm32---在keil 5中使用printf函數(shù)輸出到串口USART(printf函數(shù)的移植方法)以及補(bǔ)充窗口printf函數(shù)輸出漢字

    stm32---在keil 5中使用printf函數(shù)輸出到串口USART(printf函數(shù)的移植方法)以及補(bǔ)充窗口printf函數(shù)輸出漢字

    在串口函數(shù)初始化的c文件中加上#include stdio.h 重寫fputc函數(shù)?(fputc是printf函數(shù)的底層,printf就是不斷調(diào)用fputc函數(shù)一個個打印,把fputc函數(shù)重定向到串口,這樣子printf自然就輸出到串口) 在主函數(shù)main.c編寫如下代碼后直接運(yùn)行. 引入#include stdarg.h ?對sprintf進(jìn)行可變參數(shù)的函數(shù)封裝 在主

    2024年02月05日
    瀏覽(39)
  • STM32 F103C8T6學(xué)習(xí)筆記3:串口配置—串口收發(fā)—自定義Printf函數(shù)

    STM32 F103C8T6學(xué)習(xí)筆記3:串口配置—串口收發(fā)—自定義Printf函數(shù)

    今日學(xué)習(xí)使用STM32 C8T6的串口,我們在經(jīng)過學(xué)習(xí)筆記2的總結(jié)歸納可知,STM32 C8T6最小系統(tǒng)板上有三路串口,如下圖: ?今日我們就著手學(xué)習(xí)如何配置開通這些串口進(jìn)行收發(fā),這里不講串口通信概念與基礎(chǔ),可以自行網(wǎng)上查找,本文直接開始介紹庫函數(shù)與編程實現(xiàn): ? ? ? ? ?

    2024年02月10日
    瀏覽(30)
  • STM32CubeIDE串口printf函數(shù)輸出中文亂碼(配置教程+解決方法)

    STM32CubeIDE串口printf函數(shù)輸出中文亂碼(配置教程+解決方法)

    目錄 前言 平臺環(huán)境 軟件:STM32CubeIDE 硬件:STM32H7A3ZIT6Q 一、串口配置 二、printf重定向 三、中文亂碼解決方案 步驟 效果 四、總結(jié) 本文主要講述在使用CubeIDE配置串口通信的過程中,如何 重定向printf() 函數(shù),以及如何解決在 串口打印中文時輸出亂碼 的情況。 ????????

    2024年02月07日
    瀏覽(28)
  • stm32之12.如何使用printf打印輸出

    stm32之12.如何使用printf打印輸出

    ? 主函數(shù)增加這些代碼即可實現(xiàn)printf打印輸出 ?需要添加頭文件 #include \\\"stdio.h\\\" --------------- 源碼 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int c, FILE *f)? { ?? ?/* 發(fā)送一個字節(jié) */ ?? ?USART_SendData(USART1,c); ?? ?/* 等待發(fā)送完畢 */ ?? ?while(

    2024年02月11日
    瀏覽(18)
  • STM32使用串口printf亂碼問題解決方法

    STM32使用串口printf亂碼問題解決方法

    使用stm32系列單片機(jī)串口打印問題,在使用HAL庫重新定義printf為串口輸出后,輸出的內(nèi)容全都是亂碼,試了網(wǎng)上的方法后還是亂碼。 ?像這樣的 ? ?最后發(fā)現(xiàn)是串口調(diào)試助手和keil的文字編碼方式不同, keil中是GB 2312,串口調(diào)試助手是UFT_8,所以打印出來才會亂碼 ?將串口調(diào)試助

    2024年02月11日
    瀏覽(34)
  • STM32使用printf函數(shù)

    STM32使用printf函數(shù)

    正點原子學(xué)習(xí)筆記 1,printf函數(shù)輸出流程 2,printf的使用 3,printf函數(shù)支持 1)用戶調(diào)用 printf() 2)編譯器從 stdio.h 里解析 3)最終由 fputc() 實現(xiàn)輸出 由此用戶需要根據(jù)最終輸出的硬件重新定義該函數(shù),此過程稱為: printf重定向 1,printf(\\\"Hello World!rn\\\"); 2,printf(\\\"%drn\\\",121); ? ? ? ? ?

    2024年02月07日
    瀏覽(19)
  • 在STM32中使用printf函數(shù)

    在STM32中使用printf函數(shù)

    ????利用printf函數(shù)使得輸出打印到串口中。 ????我們在C語言中為什么能夠調(diào)用printf函數(shù)打印數(shù)據(jù)到控制臺中,那是因為printf函數(shù)又調(diào)用了fputc()函數(shù)。那么我們我們可不可以說printf函數(shù)之所以能夠打印數(shù)據(jù)到控制臺中幾乎都是fput()函數(shù)的功勞呢?答案是顯而易見的。

    2024年02月16日
    瀏覽(13)
  • 【基礎(chǔ)】STM32中如何使用printf()函數(shù)

    在STM32串口通信程序中使用printf發(fā)送數(shù)據(jù),非常的方便??稍趧傞_始使用的時候總是遇到問題,常見的是硬件訪真時無法進(jìn)入main主函數(shù),其實只要簡單的配置一下就可以了。 下面就說一下使用printf需要做哪些配置。 有兩種配置方法: 一、對工程屬性進(jìn)行配置,詳細(xì)步驟如下

    2024年04月24日
    瀏覽(18)
  • STM32使用printf函數(shù)的步驟和注意事項

    STM32使用printf函數(shù)的步驟和注意事項

    1,在KEIL中勾選 Use MicroLIB . 即使用微庫. 2, 在代碼中添加 如下代碼 (目的是為了調(diào)用stdio庫中的print 函數(shù)) 3,在uart.c 填加如下代碼 (目的是為了重定向 stdio庫中的print 函數(shù) ) 1, 在代碼中添加 如下代碼 (目的是為了調(diào)用stdio庫中的print 函數(shù)) 2, 關(guān)閉半主機(jī)模式,并重定向printf 想要明白

    2023年04月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包