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

stm32---串口接收與發(fā)送(針對USART1的Rx和Tx引腳)

這篇具有很好參考價值的文章主要介紹了stm32---串口接收與發(fā)送(針對USART1的Rx和Tx引腳)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

圖文概述:?

stm32配置rx和tx,stm32,嵌入式硬件,單片機(jī)stm32配置rx和tx,stm32,嵌入式硬件,單片機(jī)stm32配置rx和tx,stm32,嵌入式硬件,單片機(jī)

stm32配置rx和tx,stm32,嵌入式硬件,單片機(jī)?

stm32配置rx和tx,stm32,嵌入式硬件,單片機(jī)

代碼:

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


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


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

uint8_t Serial_RxData;
uint8_t Serial_RxFlag;


/**
  * @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);
	
	/* RX引腳是USART1外設(shè)控制的輸出腳,需要選浮空輸入或上拉輸入 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉輸入模式
	GPIO_InitStructure.GPIO_Pin = USART1_RX;
	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 | USART_Mode_Rx;//串口模式---同時開啟發(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);
	
	/* 當(dāng)RXNE標(biāo)志位一旦置1,就向NVIC申請中斷,可以使用中斷函數(shù)接收數(shù)據(jù) */
	//開啟觸發(fā)RXNE標(biāo)志位到NVIC的輸出
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC優(yōu)先級分組
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //NVIC中斷通道配置為USART1通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級設(shè)為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //響應(yīng)優(yōu)先級設(shè)為1
	NVIC_Init(&NVIC_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;
}


/**
  * @brief  Serial_Printf---對sprintf進(jìn)行封裝,便于數(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ā)送字符串
}

uint8_t Serial_GetRxFlag(void)
{
	if(Serial_RxFlag == 1)
	{
		Serial_RxFlag = 0;
		return 1;
	}
	return 0;  //返回狀態(tài)值
}

uint8_t Serial_GetRxData(void)
{
	return Serial_RxData; //返回接受數(shù)據(jù)寄存器的值
}

//USART1通道的中斷函數(shù)
void USART1_IRQHandler(void)
{
	//獲取USART的接收數(shù)據(jù)寄存器不為空中斷標(biāo)志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) 
	{
		//獲取接收數(shù)據(jù)寄存器中的值
		Serial_RxData = USART_ReceiveData(USART1); 
		//置變量Serial_RxFlag為1(表示接收到數(shù)據(jù))
		Serial_RxFlag = 1;  
		//手動清除清除USART1的中斷掛起位(如果獲取接收寄存器則會自動清除標(biāo)志位)
		USART_ClearITPendingBit(USART1, USART_IT_RXNE); 
	}

}

關(guān)鍵步驟:

1.?開啟APB2外設(shè)的時鐘---USART1是APB2的外設(shè)(需要查看手冊了解對應(yīng)芯片上的USART1_TX和USART1_RX的引腳分布在哪個GPIO口上)

	//1.開啟APB2外設(shè)的時鐘---USART1是APB2的外設(shè)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2. 初始化GPIO的引腳配置(即USART1外設(shè)的TX引腳)?

	//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);
	
	/* RX引腳是USART1外設(shè)控制的輸出腳,需要選浮空輸入或上拉輸入 */
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉輸入模式
	GPIO_InitStructure.GPIO_Pin = USART1_RX;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(BUS, &GPIO_InitStructure);

3.?初始化USART的各項配置

	//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 | USART_Mode_Rx;//串口模式---同時開啟發(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);

補(bǔ)充:如果需要接收數(shù)據(jù)后進(jìn)入中斷,則還需要配置NVIC?,即如下代碼:

	/* 當(dāng)RXNE標(biāo)志位一旦置1,就向NVIC申請中斷,可以使用中斷函數(shù)接收數(shù)據(jù) */
	//開啟觸發(fā)RXNE標(biāo)志位到NVIC的輸出
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	//配置NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC優(yōu)先級分組
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //NVIC中斷通道配置為USART1通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級設(shè)為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //響應(yīng)優(yōu)先級設(shè)為1
	NVIC_Init(&NVIC_InitStructure);

4.?開啟USART

	USART_Cmd(USART1, ENABLE);

5. 發(fā)送字節(jié)數(shù)據(jù)的基礎(chǔ)函數(shù):

/**
  * @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);
}

?6. 接收字節(jié)數(shù)據(jù)的基礎(chǔ)函數(shù)(在觸發(fā)的中斷函數(shù)中接收數(shù)據(jù)):

//USART1通道的中斷函數(shù)
void USART1_IRQHandler(void)
{
	//獲取USART的接收數(shù)據(jù)寄存器不為空中斷標(biāo)志位
	if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) 
	{
		//獲取接收數(shù)據(jù)寄存器中的值
		Serial_RxData = USART_ReceiveData(USART1); 
		//置變量Serial_RxFlag為1(表示接收到數(shù)據(jù))
		Serial_RxFlag = 1;  
		//手動清除清除USART1的中斷掛起位(如果獲取接收寄存器則會自動清除標(biāo)志位)
		USART_ClearITPendingBit(USART1, USART_IT_RXNE); 
	}

}

? ???

?文章來源地址http://www.zghlxwxcb.cn/news/detail-760441.html

到了這里,關(guān)于stm32---串口接收與發(fā)送(針對USART1的Rx和Tx引腳)的文章就介紹完了。如果您還想了解更多內(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ù)器費用

相關(guān)文章

  • 江科大32——USART串口發(fā)送&串口發(fā)送+接收代碼

    江科大32——USART串口發(fā)送&串口發(fā)送+接收代碼

    ?1.程序初始化流程 1)開啟USART和GPIO時鐘。 2)GPIO初始化,把TX配置成復(fù)用輸出,RX配置成輸入。 3)使用結(jié)構(gòu)體配置USART。 如果只需發(fā)送功能,直接開啟USART就行了。 如果需要發(fā)送和接收,需要在開啟USART之前加上 ITConfig 和 NVIC 的代碼。 初始化完成,只需調(diào)用特定函數(shù)就能完

    2024年02月12日
    瀏覽(23)
  • STM32F103RCT6 -- 基于FreeRTOS 的USART1 串口通訊

    使用 FreeRTOS 提供的隊列(Queue)機(jī)制來實現(xiàn)數(shù)據(jù)的接收和發(fā)送 TX - PA9 RX - PA10 波特率:9600 數(shù)據(jù)位:8bit 校驗位:無 停止位:1bit 數(shù)據(jù)格式: RX: 55 AA 06 00 06 31 02 24 01 FC 80 TX: 55 AA 06 00 06 32 01 24 01 B8 70 55 AA – 幀頭 06 - 數(shù)據(jù)字節(jié)數(shù),不包括幀頭,不包括校驗位 00 06 – 模塊 31 02 24

    2024年02月16日
    瀏覽(91)
  • APM32F072單片機(jī)進(jìn)入STOP模式,并通過RTC Wakeup Timer和USART1串口接收事件喚醒

    串口初始化(注意USART1時鐘源要選擇HSI): 使用power_init函數(shù)初始化RTC,然后調(diào)用power_enter_stop_mode(n)函數(shù)進(jìn)入STOP模式,n秒后自動喚醒,或由USART1接收喚醒:

    2024年02月13日
    瀏覽(23)
  • FPGA:uart原理+tx發(fā)送模塊+rx接收模塊

    FPGA:uart原理+tx發(fā)送模塊+rx接收模塊

    處理器與外部設(shè)備通信的兩種方式: 串行通信: 指數(shù)據(jù)的各個位使用多條數(shù)據(jù)線同時進(jìn)行傳輸。 并行通信: 將數(shù)據(jù)分成一位一位的形式在一條數(shù)據(jù)線上逐個傳輸。 串行通信的通信方式: 同步通信: 帶時鐘同步信號的數(shù)據(jù)傳輸,發(fā)送方和接收方在同一時鐘控制下,同步傳輸

    2024年02月12日
    瀏覽(18)
  • 關(guān)于STM32F407ZGT6的USB損壞后使用ST-Link和USART1實現(xiàn)串口功能

    關(guān)于STM32F407ZGT6的USB損壞后使用ST-Link和USART1實現(xiàn)串口功能

    開發(fā)板:STM32F407ZGT6; 目標(biāo):想使用軟件“串口調(diào)試助手” 情況:開發(fā)板上的USB_UART口所在器件損壞或者直接沒有; ? 解決辦法:查看該開發(fā)板的原理圖,可得:串口1的RX接TXD,串口1的TX接RXD,那么按如下步驟操作: 1、現(xiàn)在使用USB轉(zhuǎn)TTL模塊,將串口1的RX接USB轉(zhuǎn)TTL模塊的TXD,

    2024年02月08日
    瀏覽(50)
  • vivado GTX ip核接收端RX與發(fā)送端TX數(shù)據(jù)對齊的方法

    vivado GTX ip核接收端RX與發(fā)送端TX數(shù)據(jù)對齊的方法

    當(dāng)8B/10B編碼的K碼為K28.5時,當(dāng)txdata中某一字節(jié)為8\\\'hBC時(為什么是BC,請搜索8B/10B編碼相關(guān)文章),設(shè)置txcharisk對應(yīng)的比特位為1即可實現(xiàn)txdata與rxdata對齊。 舉例說明 示例1 txdata低8位為BC,設(shè)置txcharisk最低位為1。 可以發(fā)現(xiàn),接收數(shù)據(jù)與發(fā)送數(shù)據(jù)32bit實現(xiàn)了對齊。 ? 示例2 txdat

    2024年02月15日
    瀏覽(48)
  • STM32單片機(jī)(九)USART串口----第三節(jié):USART串口實戰(zhàn)練習(xí)(串口發(fā)送)

    STM32單片機(jī)(九)USART串口----第三節(jié):USART串口實戰(zhàn)練習(xí)(串口發(fā)送)

    ?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時才能融會貫通。 ?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機(jī),且有一定C語言基礎(chǔ)的的童鞋

    2024年02月10日
    瀏覽(97)
  • 關(guān)于STM32F407ZGT6的USB_UART端口損壞后使用ST-Link和USART1實現(xiàn)串口功能

    關(guān)于STM32F407ZGT6的USB_UART端口損壞后使用ST-Link和USART1實現(xiàn)串口功能

    開發(fā)板:STM32F407ZGT6; 目標(biāo):想使用軟件“串口調(diào)試助手” 情況:開發(fā)板上的USB_UART口所在器件損壞或者直接沒有; ? 解決辦法:查看該開發(fā)板的原理圖,可得:串口1的RX接TXD,串口1的TX接RXD,那么按如下步驟操作: 1、現(xiàn)在使用USB轉(zhuǎn)TTL模塊,將串口1的RX接USB轉(zhuǎn)TTL模塊的TXD,

    2024年02月07日
    瀏覽(29)
  • STM32-串口通信(串口的接收和發(fā)送)

    STM32-串口通信(串口的接收和發(fā)送)

    本文在于記錄自己的學(xué)習(xí)過程中遇到的問題和總結(jié),各種情況下串口通信在STM32的實際使用方面占有很大的比重,本文主要對 串口通信 做一個簡要的總結(jié)。 在STM32里,串口通信是USART,STM32可以通過串口和其他設(shè)備進(jìn)行傳輸 并行數(shù)據(jù) ,是 全雙工 , 異步時鐘控制 ,設(shè)備之間是

    2024年02月03日
    瀏覽(97)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包