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

STM32-HAL-串口的printf重定向

這篇具有很好參考價(jià)值的文章主要介紹了STM32-HAL-串口的printf重定向。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、C語言的格式化輸出

C語言的printf是一個標(biāo)準(zhǔn)庫函數(shù),用于將格式化的數(shù)據(jù)輸出到標(biāo)準(zhǔn)的輸出設(shè)備(通常是終端)

  • 基本語法:
int printf(const char *format, ...);

其中的第一個參數(shù)const char *format表示輸出格式,后面的參數(shù)是可變參數(shù),用于填充格式化字符串中的占位符。

  • 字符輸出原理:
  1. 格式化字符串處理:printf函數(shù)將第一個參數(shù) const char *format 中的格式占位符解析出來,然后根據(jù)占位符的類型和順序依次取可變參數(shù)中的值,將這些值轉(zhuǎn)換為字符串,并將其按照格式化字符串中的順序和樣式組合成最終的輸出字符串。
  2. 輸出字符串存儲:printf函數(shù)將格式化后的輸出字符串存儲在內(nèi)存緩沖區(qū)中。
  3. 輸出字符串顯示:printf函數(shù)將內(nèi)存緩沖區(qū)中的輸出字符串顯示到標(biāo)準(zhǔn)輸出設(shè)備上,通常是終端。

在學(xué)習(xí)C語言的時候,在調(diào)用頭文件#include "stdio.h"的時候,就可以使用printf函數(shù)進(jìn)行格式化打印

#include <stdio.h>

int a = 10;
char str[] = "hello,world!";
int main(void)
{
    printf("%s\n",str);
    printf("a = %d",a);  
    return 0;
}

[result]

hello,world!
a = 10

但是在Keil中,在stm32的使用中是不能直接使用C語言的打印函數(shù)的,需要添加支持設(shè)置,即調(diào)用MDK的微庫(MicroLib) 稱之為printf的重定向。其實(shí)不僅僅可以把打印字符重定向,而且還可以將獲取字符重定向。

二、開發(fā)準(zhǔn)備
  • 基于STM32L431RCT6的小熊派開發(fā)板
    hal_uart_transmit printf,STM32,BearPi,stm32,單片機(jī),嵌入式硬件

  • windows系統(tǒng)并安裝Cubemx和Keil MDK的電腦

三、初始化片上外設(shè)

本次開發(fā)介紹的主要是串口的重定向,因此就是需要初始化串口外設(shè)。

設(shè)置串口通信為異步通信,波特率115200
hal_uart_transmit printf,STM32,BearPi,stm32,單片機(jī),嵌入式硬件

生成代碼,并選擇keil-MDK打開該工程

四、設(shè)置重定向

4.1 點(diǎn)擊魔術(shù)棒,然后勾選使用微庫(Use MicroLIB)
hal_uart_transmit printf,STM32,BearPi,stm32,單片機(jī),嵌入式硬件

針對MicroLIB的介紹:

? MicroLIB是Keil公司提供的一個C標(biāo)準(zhǔn)庫,專為嵌入式系統(tǒng)設(shè)計(jì)而開發(fā)。相對于標(biāo)準(zhǔn)C庫,MicroLIB庫更加輕量級,代碼量更小,適用于嵌入式系統(tǒng)等資源受限的環(huán)境。MicroLIB庫支持ISO/ANSI C標(biāo)準(zhǔn)的大部分函數(shù),并增加了一些嵌入式系統(tǒng)常用的函數(shù),例如串口通信、GPIO控制等。在MDK的工程中,開發(fā)者可以選擇使用MicroLIB庫來進(jìn)行開發(fā),以減小程序的代碼大小和占用內(nèi)存的空間。

? 需要注意的是,MicroLIB庫并不是一個完整的C標(biāo)準(zhǔn)庫,它只實(shí)現(xiàn)了一部分的C標(biāo)準(zhǔn)函數(shù),并且一些函數(shù)的實(shí)現(xiàn)與標(biāo)準(zhǔn)C庫可能存在差異。如果需要使用標(biāo)準(zhǔn)C庫的函數(shù)或者功能更加完整的C標(biāo)準(zhǔn)庫,開發(fā)者需要使用其他的C標(biāo)準(zhǔn)庫,例如GNU C Library(glibc)等。

4.2 添加串口重定向代碼

main.c函數(shù)中添加頭文件:

#include "stdio.h"

main.c函數(shù)的/* USER CODE BEGIN 4 */內(nèi)添加下面代碼即可:

int fputc(int c,FILE *f)
{
    uint8_t ch;  //定義一個無符號8位整型變量ch 并將字符C賦值給它
    ch = c;
    HAL_UART_Transmit(&huart1,&ch,1,1000);
    // 調(diào)用HAL庫的串口發(fā)送函數(shù),將ch發(fā)送到USART1串口,等待時間為1000ms
    return c;
}

4.3 在主循環(huán)中添加代碼進(jìn)行測試

/* USER CODE BEGIN 2 */
	uint8_t str[] = "Hello GearLong!";
	uint8_t num1 = 10;
	float f = 3.1415926;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("%s\r\n",str);
		printf("num = %d\r\n",num1);
		printf("f1 = %f\r\n",f);
		printf("f2 = %.2f\r\n",f);
		printf("f3 = %8.3f\r\n",f);
		HAL_Delay(1000);		
  }

4.4 編譯、下載,然后打開串口調(diào)試助手查看執(zhí)行

記得將AT開關(guān)撥到AT_MCU

hal_uart_transmit printf,STM32,BearPi,stm32,單片機(jī),嵌入式硬件

4.5 不使用微庫打印數(shù)據(jù)

下面的代碼來自正點(diǎn)原子的HAL庫代碼中的串口打印 ,將代碼復(fù)制到usart.c的代碼添加處,并取消勾選微庫,并移除上面已經(jīng)設(shè)置的重定向代碼。

usart.c函數(shù)中添加頭文件:

#include "stdio.h"

usart.c函數(shù)/* USER CODE BEGIN 1 */內(nèi)添加下面代碼即可:

/* 加入以下代碼, 支持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輸出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while ((USART1->SR & 0X40) == 0);               /* 等待上一個字符發(fā)送完成 */
    
    USART1->DR = (uint8_t)ch;                       /* 將要發(fā)送的字符 ch 寫入到DR寄存器 */	
    return ch;
}
#endif

注意在使用Cubmex生成的HAL庫代碼中,USART1的相關(guān)寄存器可能隨著不同型號的MCU會發(fā)生變化,如果編譯不通過及時修改即可。

4.6 打印輸出的結(jié)果是一致的
hal_uart_transmit printf,STM32,BearPi,stm32,單片機(jī),嵌入式硬件文章來源地址http://www.zghlxwxcb.cn/news/detail-676032.html

到了這里,關(guān)于STM32-HAL-串口的printf重定向的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 關(guān)于STM32 hal printf重定向 “FILE“ is undefined

    關(guān)于STM32 hal printf重定向,及報(bào)錯?!癋ILE” is undefined 增加以下內(nèi)容:

    2024年02月13日
    瀏覽(23)
  • STM32-HAL庫-printf函數(shù)重定向(簡單易懂親測有效)

    STM32-HAL庫-printf函數(shù)重定向(簡單易懂親測有效)

    由于STM32cubemx生成的HAL庫代碼沒有printf,為了讓這個函數(shù)能實(shí)現(xiàn)打印功能,我們必須要把這個函數(shù)重定向,讓它重定向到串口中,把要輸出的內(nèi)容打印到串口中。 配置好時鐘后,選擇你的串口,生成代碼。 進(jìn)入到STM32xxxhal.c中,加入如下兩條語句,你的huart是數(shù)字幾,后面就修

    2024年02月05日
    瀏覽(18)
  • STM32+HAL庫調(diào)試printf串口打印

    STM32+HAL庫調(diào)試printf串口打印

    目錄 1 新建cubemx工程? 2 配置系統(tǒng)時鐘 3 配置串口引腳 4 生成keil工程 5 補(bǔ)充代碼 5.1 重定向printf 5.2 main函數(shù) 6 編譯燒錄 7 實(shí)驗(yàn)現(xiàn)象 ? ? ? ? 選擇對應(yīng)芯片 ? ? ? ? 主頻為64MHz ? ? ? ? 對應(yīng)給到usart2的時鐘也為64MHz? ? ? ? ? ? 查閱原理圖,可知usart2引腳連接了USB串口 ? ? ?

    2024年02月09日
    瀏覽(22)
  • STM32 HAL庫串口重映射printf

    STM32 HAL庫串口重映射printf

    添加代碼 keil設(shè)置 microlib 是缺省 C 庫的備選庫。 它旨在與需要裝入到極少量內(nèi)存中的深層嵌入式應(yīng)用程序配合使用。 這些應(yīng)用程序不在操作系統(tǒng)中運(yùn)行。 microlib 進(jìn)行了 高度優(yōu)化以使代碼變得很小 。 它的功能比缺省 C 庫少,并且根本不具備某些 ISO C 特性。 某些庫函數(shù)的運(yùn)

    2024年02月16日
    瀏覽(19)
  • stm32(HAL庫)使用printf函數(shù)打印到串口

    stm32(HAL庫)使用printf函數(shù)打印到串口

    目錄 1、簡介 2.1 基礎(chǔ)配置 2.1.1 SYS配置 ?2.1.2 RCC配置 2.2?串口外設(shè)配置 ?2.3 項(xiàng)目生成 ?3、KEIL端程序整合 ??4、效果測試 在HAL庫中,常用的printf函數(shù)是無法使用的。本文通過重映射實(shí)現(xiàn)在HAL庫中進(jìn)行printf函數(shù)。 2.1.1 SYS配置 ?2.1.2 RCC配置 在usart.c函數(shù)最下方復(fù)制如下代碼 接著在

    2024年02月14日
    瀏覽(25)
  • STM32 HAL庫 STM32CubeMx -- 串口的使用(USART/UART)

    STM32 HAL庫 STM32CubeMx -- 串口的使用(USART/UART)

    在上一篇博客里面寫了串口通信的理論知識,在這一篇中將講述串口通信在STM32CubeMx里面的配置,以及在函數(shù)里面怎么使用。 對于串口發(fā)送信息,分為三種方法: 串口阻塞方式收發(fā) 、 串口中斷方式收發(fā) 、 串口DMA方式收發(fā) 。(DMA方式在之后的DMA章節(jié)講解) 關(guān)于STM32CubeMx的基

    2024年02月06日
    瀏覽(26)
  • 【STM32】HAL庫三步實(shí)現(xiàn)串口重定向(代碼復(fù)制可用)

    【STM32】HAL庫三步實(shí)現(xiàn)串口重定向(代碼復(fù)制可用)

    目錄 第一步:添加標(biāo)準(zhǔn)輸入輸出頭文件 第二步:重寫fputc()函數(shù) 第三步:重寫fgetc()函數(shù) 代碼匯總(直接復(fù)制使用)-需要直接來復(fù)制 在PC上進(jìn)行C語言程序開發(fā)時,我們可以利用C語言的格式化輸出函數(shù) printf()將程序的運(yùn)行結(jié)果發(fā)送到顯示屏上顯示,也可以利用格式化輸人函數(shù)

    2024年02月05日
    瀏覽(24)
  • 【13】STM32·HAL庫-正點(diǎn)原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向

    【13】STM32·HAL庫-正點(diǎn)原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向

    ??下面函數(shù)都是以sys_開頭,定義在sys.c中。正點(diǎn)原子函數(shù)現(xiàn)階段命名規(guī)則如果是在led.c中,則以led_開頭。在F7/H7系列中會存在Cache配置函數(shù),I-Cache中存儲指令,D-Cache中存儲數(shù)據(jù)。 ??SysTick,即系統(tǒng)滴答定時器,包含在M3/4/7內(nèi)核里面,核心是一個24位的遞減計(jì)數(shù)器( 最大計(jì)

    2024年02月15日
    瀏覽(62)
  • stm32中HAL_UART_Transmit_DMA,串口只能發(fā)送一次。

    stm32中HAL_UART_Transmit_DMA,串口只能發(fā)送一次。

    配置串口+DMA不產(chǎn)生DMA中斷方式, 1、HAL_UART_Transmit_DMA中調(diào)用HAL_DMA_Start_IT,在HAL_DMA_Start_IT中雖然開啟了三個中斷:hdma-Instance-CR ?|= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME,但是沒有開DMA總中斷,所以這3個不起作用;同時,鎖住DMA(?__HAL_LOCK(hdma))。如果開啟DMA總中斷,完成DMA后會調(diào)用下

    2024年04月28日
    瀏覽(32)
  • 【STM32】HAL庫UART含校驗(yàn)位的串口通信配置BUG避坑

    【STM32】HAL庫UART含校驗(yàn)位的串口通信配置BUG避坑

    【STM32】HAL庫UART含校驗(yàn)位的串口通信配置BUG避坑 UART通過一條線就能完成數(shù)據(jù)的發(fā)送 另外一條線則完成數(shù)據(jù)的接收 所以一共是兩條線 TX RX UART在空閑時為低電平 時鐘周期由波特率確定 通常是115200bit/s UART協(xié)議由四個部分組成: 起始位: 固定低電平 1個時鐘周期 數(shù)據(jù)域: 通常

    2024年01月20日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包