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

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

這篇具有很好參考價值的文章主要介紹了stm32---在keil 5中使用printf函數(shù)輸出到串口USART(printf函數(shù)的移植方法)以及補充窗口printf函數(shù)輸出漢字。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Keil5 設(shè)置

1.打開工程選項

keil printf,stm32,嵌入式硬件,單片機

2.勾選上Use MicroLIB(MicroLIB時Keil為嵌入式平臺優(yōu)化的一個精簡庫)

keil printf,stm32,嵌入式硬件,單片機

1.方法一(printf針對指定的串口,如USART1):

主要代碼展示:

#include "stm32f10x.h"                  // Device header
#include <stdio.h>

/*對應(yīng)的引腳號*/
#define USART1_TX GPIO_Pin_9 


/*模塊需要使用到的端口:GPIOA或GPIOB*/
#define BUS GPIOA         

/**
  * @brief  Serial_Init---對串口通信的初始化配置(針對發(fā)送數(shù)據(jù)即USART1外設(shè)的TX引腳)
  * @param  無
  * @retval 無
  */
void Serial_Init(void)
{
	//1.開啟APB2外設(shè)的時鐘---USART1是APB2的外設(shè)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//2.初始化GPIO的引腳配置(即USART1外設(shè)的TX引腳)
	GPIO_InitTypeDef GPIO_InitStructure;
	/* TX引腳是USART1外設(shè)控制的輸出腳,需要選復(fù)用推挽輸出模式 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Pin = USART1_TX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);
	
	//3.初始化USART的各項配置
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600; //波特率---9600
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件數(shù)據(jù)流控選擇---不需要流控
	USART_InitStructure.USART_Mode = USART_Mode_Tx;//串口模式---發(fā)送模式
	USART_InitStructure.USART_Parity = USART_Parity_No;//數(shù)據(jù)幀的校驗位---不需要校驗
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//數(shù)據(jù)幀的停止位---選擇1位的停止位
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//數(shù)據(jù)幀字長---選擇8位
	USART_Init(USART1, &USART_InitStructure);
	
	//4.開啟USART
	USART_Cmd(USART1, ENABLE);
}	

/**
  * @brief  Serial_SendByte---發(fā)送1位字節(jié)數(shù)據(jù)
  * @param  Byte---發(fā)送的字節(jié)數(shù)據(jù)
  * @retval 無
  */
void Serial_SendByte(uint8_t Byte)
{
	//1.發(fā)送數(shù)據(jù)
	USART_SendData(USART1, Byte);
	//2.判斷發(fā)送數(shù)據(jù)寄存器為空的標(biāo)志位(標(biāo)志位為1則表示數(shù)據(jù)轉(zhuǎn)移到移位寄存器,為0則還沒有轉(zhuǎn)移到移位寄存器)
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}


/**
  * @brief  Serial_SendArray---發(fā)送數(shù)組元素是字節(jié)數(shù)據(jù)的數(shù)組
  * @param  *Array---發(fā)送的數(shù)組的首地址指針
  * @param  Length---發(fā)送的數(shù)組的長度
  * @retval 無
  */
void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
	uint16_t i;
	for(i = 0; i < Length; i++)
	{
		Serial_SendByte(Array[i]);
	}
}

/**
  * @brief  Serial_SendString---發(fā)送一串字符串
  * @param  *String---發(fā)送的字符串的地址指針
  * @retval 無
  */
void Serial_SendString(char *String)
{
	uint8_t i;
	for(i = 0; String[i] != '\0'; i++)
	{
		Serial_SendByte(String[i]);
	}
}

/**
  * @brief  Serial_Pow---計算X的Y次方值
  * @param  X---底數(shù)
  * @param  Y---指數(shù)
  * @retval Result---計算的結(jié)果值
  */
uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
	uint32_t Result = 1;
	while(Y--)
	{
		Result *= X;
	}
	return Result;
}

/**
  * @brief  Serial_SendNumber---發(fā)送無符號整型數(shù)據(jù)(即數(shù)字)
  * @param  Number---要發(fā)送的數(shù)字?jǐn)?shù)據(jù)
  * @param  Length---數(shù)字?jǐn)?shù)據(jù)的長度
  * @retval 無
  */
void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
	uint8_t i;
	for(i = Length; i > 0; i--)
	{
		Serial_SendByte((Number / Serial_Pow(10, i-1)) % 10 + '0');
	}
	
}

/**
  * @brief  fputc---printf的底層函數(shù)(移植printf函數(shù),使printf輸出到串口)
  * @param  ch---需要輸出的字符
  * @param  *f---指定的某個指針地址
  * @retval ch---輸出的字符
  */
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

對printf函數(shù)進行重定向,目的是將printf函數(shù)打印的東西輸出到串口(printf默認(rèn)打印輸出到屏幕,但單片機沒有屏幕,所以需要重定向)

  • 在串口函數(shù)初始化的c文件中加上#include <stdio.h>
#include <stdio.h>
  • 重寫fputc函數(shù)?(fputc是printf函數(shù)的底層,printf就是不斷調(diào)用fputc函數(shù)一個個打印,把fputc函數(shù)重定向到串口,這樣子printf自然就輸出到串口)
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}

?2. 方法二(sprintf和Serial_SendString針對所有串口可行):

在主函數(shù)main.c編寫如下代碼后直接運行.

	char String[100];
	sprintf(String, "Num = %d\r\n", 99);
	Serial_SendString(String);

3. 方法三(對sprintf進行可變參數(shù)的函數(shù)封裝,方便使用):

  • 引入#include <stdarg.h>
#include <stdarg.h>
  • ?對sprintf進行可變參數(shù)的函數(shù)封裝

/**
  * @brief  Serial_Printf---對sprintf進行封裝,便于數(shù)據(jù)輸出到串口
  * @param  *format---接收的格式化字符串
  * @param  ...---接收可變參數(shù)列表
  * @retval 無
  */
void Serial_Printf(char *format, ...)
{
	char String[100];
	va_list arg;//va_list---列表名
	va_start(arg, format);//從format位置后開始接收參數(shù)表,放在arg
	vsprintf(String, format, arg);/* vsprintf---使用參數(shù)列表發(fā)送格式化輸出到字符串。 */
	va_end(arg);//釋放參數(shù)表
	Serial_SendString(String);//串口發(fā)送字符串
}
  • 在主函數(shù)main.c調(diào)用
	Serial_Printf("Num = %d\r\n", 77);

補充---串口printf輸出漢字

1.打開工程選項

keil printf,stm32,嵌入式硬件,單片機

2.在C/C++選項下的Misc Controls輸入--no-multibyte-chars這串參數(shù),然后點擊OK

keil printf,stm32,嵌入式硬件,單片機

3.在主函數(shù)main.c使用函數(shù)輸出中文

Serial_Printf("你好,世界!");

4. 在串口助手就能看見輸出的中文

keil printf,stm32,嵌入式硬件,單片機?

!!!!!注意:出現(xiàn)亂碼的話需要查看keil5的編碼格式跟串口助手接收的格式是否一致,如:

點擊設(shè)置選項

keil printf,stm32,嵌入式硬件,單片機

現(xiàn)在是GBK編碼格式

?keil printf,stm32,嵌入式硬件,單片機

串口助手也選擇GBK格式

keil printf,stm32,嵌入式硬件,單片機

如果keil5選擇的時utf-8格式,那串口助手也要設(shè)置成utf-8格式

keil printf,stm32,嵌入式硬件,單片機keil printf,stm32,嵌入式硬件,單片機文章來源地址http://www.zghlxwxcb.cn/news/detail-753897.html

到了這里,關(guān)于stm32---在keil 5中使用printf函數(shù)輸出到串口USART(printf函數(shù)的移植方法)以及補充窗口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īng)查實,立即刪除!

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

相關(guān)文章

  • 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 項目生成 ?3、KEIL端程序整合 ??4、效果測試 在HAL庫中,常用的printf函數(shù)是無法使用的。本文通過重映射實現(xiàn)在HAL庫中進行printf函數(shù)。 2.1.1 SYS配置 ?2.1.2 RCC配置 在usart.c函數(shù)最下方復(fù)制如下代碼 接著在

    2024年02月14日
    瀏覽(25)
  • STM32串口printf調(diào)試輸出(SSCOM V5.13.1)

    STM32串口printf調(diào)試輸出(SSCOM V5.13.1)

    PC與CPU相互通信就是通過USB Type_C接口和USB電平轉(zhuǎn)換實現(xiàn)的。 我們可以看到,CPU通過管腳USART1連接CH340C芯片將USB轉(zhuǎn)串口,實現(xiàn)PC與CPU之間的通信。 當(dāng)然,這里用的是CH340的芯片,我們就需要安裝ch340串口。 按住Ctrl+s生成代碼。 在usart.h中添加頭文件stdio.h 標(biāo)準(zhǔn)庫的 printf函數(shù) 能方

    2024年02月12日
    瀏覽(21)
  • STM32CubeMx+MATLAB Simulink串口輸出實驗,UART/USART串口測試實驗

    STM32CubeMx+MATLAB Simulink串口輸出實驗,UART/USART串口測試實驗

    STM32CubeMx+MATLAB Simulink串口輸出實驗

    2024年02月21日
    瀏覽(27)
  • 普中STM32-PZ6806L開發(fā)板(HAL庫函數(shù)實現(xiàn)-USART1 printf+scanf/gets)

    普中STM32-PZ6806L開發(fā)板(HAL庫函數(shù)實現(xiàn)-USART1 printf+scanf/gets)

    實現(xiàn)printf+scanf/gets通過USART1 的發(fā)送接收。 主芯片串口引腳圖 我的板子板子自帶串口壞掉了, 所以使用USB轉(zhuǎn)TTL線, 連接如下 電路原理圖 實物圖 scanf是以空白符(空格、制表符、換行等等)為結(jié)束標(biāo)志的,當(dāng)遇到空白符是就會結(jié)束一次輸入,如果你需要讀取空格的話可以使用gets或者

    2024年02月04日
    瀏覽(22)
  • STM32串口通信中的USART_RecieveData函數(shù)分析

    STM32串口通信中的USART_RecieveData函數(shù)分析

    拿這個中斷函數(shù)為例 ????????很多人可能注意到了接收數(shù)據(jù)函數(shù)的返回類型為無符號短整型,疑惑這里為什么用了一個無符號字符類型變量rec接收。 先看看這個函數(shù)的定義 ????????其實,是因為串口設(shè)置的字長為8,所以數(shù)據(jù)寄存器中第八位為0,第0~7位為數(shù)據(jù)有效位,

    2024年02月11日
    瀏覽(50)
  • 【正點原子STM32】SYSTEM文件夾介紹(sys文件夾、deley文件夾、USART 文件夾、SysTick、printf函數(shù)、fputc函數(shù)、半主機模式)

    【正點原子STM32】SYSTEM文件夾介紹(sys文件夾、deley文件夾、USART 文件夾、SysTick、printf函數(shù)、fputc函數(shù)、半主機模式)

    一、sys文件夾介紹 二、deley文件夾介紹 2.1、deley文件夾函數(shù)簡介 2.2、SysTick工作原理 2.3、SysTick寄存器介紹 2.4、delay_init()函數(shù) 2.5、delay_us()函數(shù) 2.6、delay_ms()函數(shù) 三、USART 文件夾介紹 3.1、printf函數(shù)輸出流程 3.2、printf的使用 3.3、printf函數(shù)支持 半主機模式簡介 方法一:微庫法

    2024年03月11日
    瀏覽(21)
  • 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í)如何配置開通這些串口進行收發(fā),這里不講串口通信概念與基礎(chǔ),可以自行網(wǎng)上查找,本文直接開始介紹庫函數(shù)與編程實現(xiàn): ? ? ? ? ?

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

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

    使用stm32系列單片機串口打印問題,在使用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)
  • STM32F4X USART串口使用

    STM32F4X USART串口使用

    串口是MCU與外部通信的重要通信接口,也是MCU在開發(fā)過程中的調(diào)試?yán)?。串口通信有幾個重要的參數(shù),分別是波特率、起始位、數(shù)據(jù)位、校驗位。雙方在進行串口通信前必須要約定好通信的參數(shù),否則會導(dǎo)致通信失敗。 起始位是自動產(chǎn)生,無需配置,通常是產(chǎn)生一個低電平為

    2024年02月11日
    瀏覽(28)
  • STM32開發(fā)中printf利用重定向方法輸出到串口(CubeMX 基于HAL庫方法,帶實際項目應(yīng)用技巧 巧用goto語句)

    STM32開發(fā)中printf利用重定向方法輸出到串口(CubeMX 基于HAL庫方法,帶實際項目應(yīng)用技巧 巧用goto語句)

    在stdio.h中的printf 原本輸出到控制臺, 在單片機應(yīng)用中一般將其改到串口, 并利用串口輸出信息來調(diào)試程序,非常方便。(本文以USART1為例) 此外CubeMX及CubeIDE 由于自動生成基礎(chǔ)代碼,因此每當(dāng)更改硬件配置的時候, 都會被重置生成的基礎(chǔ)代碼。 這里使用goto語句來避免部分

    2024年02月04日
    瀏覽(31)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包