精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32工程上printf()函數的方法實現

lcdz66 ? 來源:雨飛工作室 ? 2023-11-06 16:22 ? 次閱讀

針對STM32的串口編程,可以通過USART1向計算機的串口調試助手打印數據,或者接收計算機串口調試助手的數據。

下面,我們可以實現STM32工程上的printf()函數了,方便用于程序開發中調試信息的打印。

方法1:使用MicroLIB庫

1.1 KEIL-MDK中的Use MicroLIB選項

在MDK開發環境中,

fc5fb8de-7c7c-11ee-939d-92fbcf53809c.jpg

MicroLib是缺省c庫的備選庫,它可裝入少量內存中,與嵌入式應用程序配合使用,且這些應用程序不在操作系統中運行。MicroLib進行了高度優化以使代碼變得很小,功能比缺省c庫少,不具備某些ISO C特性,部分庫函數的運行速度也比較慢,如內存拷貝函數memcpy()。 MicroLib與缺省C庫之間的主要差異如下:

(1) MicroLib不符合 ISO C庫標準。不支持某些ISO特性,并且其他特性具有的功能也較少。

(2) MicroLib不符合IEEE 754二進制浮點算法標準。

(3) MicroLib進行了高度優化以使代碼變得很小。

(4) 無法對區域設置進行配置。缺省C區域設置是唯一可用的區域設置。

(5) 不能將main() 聲明為使用參數,并且不能返回內容。

(6) 不支持stdio,但未緩沖的stdin、stdout和stderr除外。

(7) MicroLib對C99函數提供有限的支持。 (8) MicroLib不支持操作系統函數。 (9) MicroLib不支持與位置無關的代碼。

(10) MicroLib不提供互斥鎖來防止非線程安全的代碼。 (11) MicroLib不支持寬字符或多字節字符串。

(12) 與stdlib不同,MicroLib不支持可選擇的單或雙區內存模型。MicroLib只提供雙區內存模型,即單獨的堆棧和堆區。

MicroLib提供了一個有限的stdio子系統,它僅支持未緩沖的stdin、stdout和stderr,那么也就是說勾選了Use MicroLib選項后,在代碼工程中就可以使用printf()函數咯?然而事實并非如此,這樣直接使用printf()函數,其打印的字符串最終不知道打印到何處。我們要做的是將調試信息打印到USART1中,所以需要對printf()函數所依賴的打印輸出函數fputc()重定向(MicroLib中的printf()函數打印操作依賴fputc() )。

1.2 重定向fputc函數

在MicroLib的stdio.h中,fputc()函數的原型為:

int fputc(int ch, FILE* stream)

此函數原本是將字符ch打印到文件指針stream所指向的文件流去的,現在我們不需要打印到文件流,而是打印到串口1。基于前面的代碼:



#include 
int fputc(int ch, FILE* stream)
{
//USART_SendData(USART1, (unsigned char) ch);
//while (!(USART1->SR & USART_FLAG_TXE));
USART_SendChar(USART1, (uint8_t)ch);
return ch;
}
注意:需要包含頭文件stdio.h,否則FILE類型未定義。

勾選了Use MicroLib選項,重定向fputc()函數后,我們就可以在工程代碼中使用printf()函數了:


int main(void)
{
USART_Configuration();
printf("
stm32f103rct6
");
printf("
Cortex-M3
");
while (1);
return 0;
}
printf()函數的使用方法跟之前一樣,運行結果:

fc8bc5c8-7c7c-11ee-939d-92fbcf53809c.jpg

方法2:不使用MicroLIB庫

2.1 半主機模式

半主機模式是ARM的一種機制,實現將來ARM應用程序代碼的輸入/輸出請求傳送至運行著調試器的主機。例如,設置使用半主機模式下的ARM應用程序,可以使用printf()和scanf()來使用主機的顯示器和鍵盤,而不需要在ARM系統上搭配顯示器和鍵盤。

半主機通過一組定義好的軟件指令(如SVC)來實現的,這些指令在程序控制下產生異常,ARM應用程序調用半主機對應的異常處理函數,然后調試代理處理該異常。

第二段話感覺理解起來有點模糊,但是第一段還是懂它在講什么的。一般的ARM應用程序中并不需要半主機操作,在這里為確保ARM應用程序中沒有鏈接MicroLib的半主機相關函數,我們要取消ARM的半主機工作模式。

2.2 實現代碼

在工程中加上如下代碼:



#pragma import(__use_no_semihosting)


struct __FILE {
int handle;
};


FILE __stdout;


_sys_exit(int x)
{
x = x;
}


int fputc(int ch, FILE *f){
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch;
}
上面的代碼摘自正點原子的范例程序,具體每一行的意義目前也不大清楚。這樣操作后,在不使用MicroLib的前提下,仍能使用printf()函數將調試信息打印到USART1上了。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2266

    文章

    10876

    瀏覽量

    354928
  • 串口調試
    +關注

    關注

    2

    文章

    267

    瀏覽量

    24694
  • printf函數
    +關注

    關注

    0

    文章

    31

    瀏覽量

    5880
  • USART1
    +關注

    關注

    0

    文章

    9

    瀏覽量

    3670

原文標題:使用KEIL-MDK開發STM32時,兩種printf()函數重定向的方法

文章出處:【微信號:雨飛工作室,微信公眾號:雨飛工作室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    實現STM32工程printf()函數

    在前面學習了STM32的串口編程,通過USART1向計算機的串口調試助手打印數據,或者接收計算機串口調試助手的數據,接下來我們可以實現STM32工程
    發表于 08-24 06:53

    如何實現STM32工程printf()函數

    如何實現STM32工程printf()函數
    發表于 12-01 06:55

    printfstm32實現方法是什么?

    printfstm32實現方法是什么?
    發表于 12-01 07:52

    STM32 Printf函數利用標準庫實現方法是什么?

    STM32 Printf函數利用標準庫實現方法是什么?
    發表于 12-02 06:13

    基于STM32printf串口數據輸出

    方法適用于 STM32實現了使用printf等標準C流函數輸出數據的辦法,極大的減少了輸出 串口數據 時所需要做的數據處理。
    發表于 06-21 07:51 ?2w次閱讀
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>printf</b>串口數據輸出

    實現重定向printf()和scanf() 函數案例分析

    名字的函數時,優先采用用戶編寫的函數,這樣用戶就可以實現對庫的修改了。為了實現重定向printf()和scanf()
    發表于 06-23 08:26 ?9146次閱讀
    <b class='flag-5'>實現</b>重定向<b class='flag-5'>printf</b>()和scanf() <b class='flag-5'>函數</b>案例分析

    STM32中使用printf打印串口數據的實現原理及方法

    的寄存器中,便可以實現使用printf()函數STM32串口上輸出數據的功能。 盤點一下實現print
    的頭像 發表于 07-22 11:12 ?1.5w次閱讀

    STM32單片機IAR環境下重定向printf函數

    STM32單片機IAR環境下重定向printf函數一、引言在項目開發中,使用printf函數通過串口打印調試信息,需要對
    發表于 12-03 10:36 ?15次下載
    <b class='flag-5'>STM32</b>單片機IAR環境下重定向<b class='flag-5'>printf</b><b class='flag-5'>函數</b>

    stm32 printf重定向

    stm32調試時,有時不太適合打斷點的地方,還需要狀態,那printf就很符合我們的要求了。不多說,直接上修改方法:首先:添加printf的頭文件 :#include “std
    發表于 12-03 14:36 ?3次下載
    <b class='flag-5'>stm32</b> <b class='flag-5'>printf</b>重定向

    STM32使用串口重定向系統printf函數輸出時出現一初始化或使用printf函數系統卡死的原因及解決辦法

    STM32使用串口重定向系統printf函數輸出時出現一初始化或使用printf函數系統卡死的原因及解決辦法在
    發表于 12-09 10:06 ?13次下載
    <b class='flag-5'>STM32</b>使用串口重定向系統<b class='flag-5'>printf</b><b class='flag-5'>函數</b>輸出時出現一初始化或使用<b class='flag-5'>printf</b><b class='flag-5'>函數</b>系統卡死的原因及解決辦法

    STM32單片機基礎09——重定向printf函數到串口輸出的多種方法

    對于 printf 函數相信大家都不陌生,第一個C語言程序就是使用 printf 函數在屏幕的控制臺打印出Hello World,之后使用
    發表于 12-27 19:22 ?9次下載
    <b class='flag-5'>STM32</b>單片機基礎09——重定向<b class='flag-5'>printf</b><b class='flag-5'>函數</b>到串口輸出的多種<b class='flag-5'>方法</b>

    stm32printf函數的串口輸出代碼

    stm32f103串口一與串口二printf函數輸出、本人是萌新,因項目需要特意配置了該段代碼,不喜勿噴,純屬個人筆記。對于串口的代碼網上也是很多,無非是配置問題,該代碼
    發表于 12-28 19:10 ?13次下載
    <b class='flag-5'>stm32printf</b><b class='flag-5'>函數</b>的串口輸出代碼

    STM32中串行通訊中printf函數的使用

    由于最近使用到了串口屏,而它與STM32之間的連接是通過單片機之間的串行通訊實現的,具體而言我利用printf函數給串口屏發送數據,而printf
    發表于 12-29 19:31 ?6次下載
    <b class='flag-5'>STM32</b>中串行通訊中<b class='flag-5'>printf</b><b class='flag-5'>函數</b>的使用

    stm32使用printf實現串口打印原理

    ??標準庫函數的默認輸出設備是顯示器, 要實現在串口或 LCD 輸出,必須重定義標準庫函數里調用的與輸出設備相關的函數 .例如 :printf
    發表于 01-13 14:55 ?5次下載
    <b class='flag-5'>stm32</b>使用<b class='flag-5'>printf</b><b class='flag-5'>實現</b>串口打印原理

    STM32printf函數重定向方法

    MicroLib提供了一個有限的stdio子系統,它僅支持未緩沖的stdin、stdout和stderr,那么也就是說勾選了Use MicroLib選項后,在代碼工程中就可以使用printf()函數咯?
    的頭像 發表于 07-10 16:22 ?1651次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>printf</b><b class='flag-5'>函數</b>重定向<b class='flag-5'>方法</b>