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

STM32入門學(xué)習(xí)之USART串口通信:

這篇具有很好參考價(jià)值的文章主要介紹了STM32入門學(xué)習(xí)之USART串口通信:。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.串口通信簡(jiǎn)介:通用異步收發(fā)傳輸器UART(Universal Asynchronous Receiver/Transmitter)是負(fù)責(zé)處理數(shù)據(jù)總線和串口之間的串/并通信的設(shè)備。UART通信規(guī)定了數(shù)據(jù)幀的格式:起始位、數(shù)據(jù)位、校驗(yàn)位、停止位等。UART異步通信只需要通信雙方設(shè)置好數(shù)據(jù)幀的格式和波特率即可完成通信。因?yàn)槭钱惒酵ㄐ牛圆恍枰獣r(shí)鐘,只需要兩根信號(hào)線就可以實(shí)習(xí)數(shù)據(jù)通信:接受數(shù)據(jù)RXD、發(fā)送數(shù)據(jù)TXD。

常見(jiàn)的使用了UASR通信協(xié)議的接口標(biāo)準(zhǔn)有:RS232、RS485等。

UART是全雙工通信:同一時(shí)刻兩個(gè)設(shè)備之間可以同時(shí)進(jìn)行發(fā)送和接受數(shù)據(jù)操作。

(補(bǔ)充:?jiǎn)喂ねㄐ牛喝魏螘r(shí)刻數(shù)據(jù)只能從一個(gè)方向進(jìn)行通信,一個(gè)設(shè)備發(fā)送,另一個(gè)設(shè)備接受。

??????????????? 半雙工通信:兩個(gè)設(shè)備之間可以收發(fā)數(shù)據(jù),但是不能在同一個(gè)時(shí)刻進(jìn)行,即在同一個(gè)時(shí)刻,只能一個(gè)設(shè)備發(fā)送,另一個(gè)設(shè)備接受。)

2.設(shè)計(jì)思路:本文通過(guò)串口中斷接受來(lái)接受發(fā)送到串口的數(shù)據(jù)。主要步驟是使能串口和引腳的時(shí)鐘、配置引腳和串口以及中斷的信息、寫串口中斷的回調(diào)函數(shù)。

配置串口通信,需要了解串口狀態(tài)寄存器USART_SR和數(shù)據(jù)寄存器USART_DA。

(1)串口狀態(tài)寄存器USART_SR:

STM32入門學(xué)習(xí)之USART串口通信:,STM32開發(fā)學(xué)習(xí),stm32,學(xué)習(xí),單片機(jī),USART,串口通信,接受中斷

?主要是了解第5位RXNE和第六位TC.

RXNE:為1時(shí),表示數(shù)據(jù)寄存器中有數(shù)據(jù),可以讀取數(shù)據(jù)。為0時(shí)表示未接收到數(shù)據(jù)。當(dāng)接受到數(shù)據(jù)時(shí),RXNE由硬件置為1??梢酝ㄟ^(guò)對(duì)數(shù)據(jù)寄存器USART_DR執(zhí)行讀操作,將RXNE置為0?;蛘呦虼宋粚懭?。

TC:可以通過(guò)此位判斷數(shù)據(jù)是否發(fā)送完成??梢酝ㄟ^(guò)讀取USART_SR寄存器,再往USART_DR寄存器寫入數(shù)據(jù),將TC置為?;蛘咧苯油鵗C位寫入0。

(2)串口數(shù)據(jù)寄存器USART_DR:

STM32入門學(xué)習(xí)之USART串口通信:,STM32開發(fā)學(xué)習(xí),stm32,學(xué)習(xí),單片機(jī),USART,串口通信,接受中斷

?如上圖所示,USART_DR只有0-8位是有用的。

3.代碼:

(1).usart.h:

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"
#include <stdio.h>

#define RX_LEN 100						//?ü1??óêüμ?×?′ó×??úêy

extern u8 RX_BUF[RX_LEN];
extern int len;
extern u8 RX_FLAG;

void usart_init(int bound);

#endif

(2).usart.c:

#include "USART.h"

int len = 0;
u8 data;
u8 RX_BUF[RX_LEN];
u8 RX_FLAG = 0;


//′??ú3?ê??ˉoˉêy
void usart_init(int bound)
{
	//1.?¨ò?òy???¢USART?¢?D???á11ì?£o
	GPIO_InitTypeDef GPIO_Initstruct;
	USART_InitTypeDef USART_Initstruct;
	NVIC_InitTypeDef NVIC_Initstruct;
	
	//2.ê1?ü???úoíUSARTμ?ê±?ó£o
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO,ENABLE);

	//3.????òy??£o
	//PA9£o
	GPIO_Initstruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_Initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_Initstruct);
	
	//PA10:
	GPIO_Initstruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_Initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_Initstruct);
	
	//4.????USART1:
	USART_Initstruct.USART_BaudRate = bound;
	USART_Initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Initstruct.USART_Parity = USART_Parity_No;
	USART_Initstruct.USART_StopBits = USART_StopBits_1;
	USART_Initstruct.USART_WordLength = USART_WordLength_8b;
	
	USART_Init(USART1,&USART_Initstruct);		//???à1?êy?YD′è?USARTμ???′??÷
	USART_Cmd(USART1,ENABLE);								//ê1?üUSART??′??÷
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);		//ê1?ü?óê??D??
	
	//5.?????D??£o
	NVIC_Initstruct.NVIC_IRQChannel = USART1_IRQn;
	NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 3;
	NVIC_Initstruct.NVIC_IRQChannelSubPriority = 3;
	NVIC_Init(&NVIC_Initstruct);
	
}

void USART1_IRQHandler(void)
{
	//uint16_t x[] = {1,2,3};
	//?D??ê?·?2úéú′??úêy?Y?óêü?D??
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
	{
		data = USART_ReceiveData(USART1);
		RX_BUF[len++] = data;
		RX_FLAG = 1;
	}
}

//???¨?òfputcoˉêy£o
int fputc(int ch,FILE *f)
{
	//1.?D??′??úê?·?·¢?ííê3é£o
	while((USART1->SR & 0x40) == 0);
	
	//2.·¢?íò???×??ú£???êy?YD′è?μ???′??÷£o
	USART1->DR = (u8) ch;
	return ch;
}

(3).main.c:

#include "stm32f10x.h"
#include "USART.h"
#include <stdio.h>

extern u8 data;

int main(void)
{
	int i;
	
	//?D??ó??è??·?×é£o
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//3?ê??ˉ′??úUSART1:
	usart_init(9600);
	
	//char *x = "h";
	while(1)
	{
		if(RX_FLAG)
		{
			printf("?óêüμ?μ?êy?Y:\r\n");
			for(i = 0;i < len;i++)
			{
				USART_SendData(USART1,RX_BUF[i]);
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);		//?ì2éê?·?·¢?ííê3é
			}
			RX_FLAG = 0;
			len = 0;
			printf("\r\n\r\n");
		}						
	}
}


上圖中的注釋會(huì)出現(xiàn)亂碼,將代碼復(fù)制到keil中就可以正常顯示了。

4.運(yùn)行結(jié)果:

STM32入門學(xué)習(xí)之USART串口通信:,STM32開發(fā)學(xué)習(xí),stm32,學(xué)習(xí),單片機(jī),USART,串口通信,接受中斷

5.總結(jié):配置串口通信需要使能引腳、串口時(shí)鐘,配置rx、tx引腳 ,配置串口寄存器,配置中斷。雖然,這些都可以通過(guò)STM32提供的庫(kù)函數(shù)完成。但是,我們還是應(yīng)該是大概的了解一下對(duì)應(yīng)寄存器的功能。比如USART_SR和USART_DR。

使用異步收發(fā)傳輸器UART的通信雙方需要設(shè)置好數(shù)據(jù)幀格式、波特率,通過(guò)接受數(shù)據(jù)RXD和發(fā)送數(shù)據(jù)TXD即可完成通信。UART數(shù)據(jù)通信的方式為全雙工。UART具有通信簡(jiǎn)單,易實(shí)習(xí)的優(yōu)點(diǎn),其缺點(diǎn)是傳輸速率低、傳輸距離較短、容易被干擾。

UART與通用同步/異步串行收發(fā)器USART(Universal Synchronous/Asynchronous Receiver/Transmitter)的區(qū)別在于:UART只有異步通信,而USART有同步和異步通信。

同步和異步最大的區(qū)別在于:同步通信中雙方需要時(shí)鐘線進(jìn)行同步,而異步通信不需要時(shí)鐘線。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-603307.html

到了這里,關(guān)于STM32入門學(xué)習(xí)之USART串口通信:的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • STM32CubeMX實(shí)現(xiàn)USART串口通信

    STM32CubeMX實(shí)現(xiàn)USART串口通信

    硬件:stm32f103c8t6核心板 軟件:STM32CubeMX 6.6.1 keil5 mdk 這里就不再詳細(xì)介紹了,詳細(xì)請(qǐng)參考上一篇博客: https://blog.csdn.net/qq_55894922/article/details/127232999?spm=1001.2014.3001.5501 若點(diǎn)擊 Manage embedded software packages 后,出現(xiàn)失敗,則需要隨便點(diǎn)擊其它任一選項(xiàng),進(jìn)行下載一些文件,比如點(diǎn)

    2023年04月17日
    瀏覽(26)
  • stm32中常見(jiàn)的通信協(xié)議之USART(串口)

    stm32中常見(jiàn)的通信協(xié)議之USART(串口)

    USART是一種通用的串行、異步通信總線,該總線有兩條數(shù)據(jù)線,可以實(shí)現(xiàn)全雙工的發(fā)送和接收。 串口的通信速度用波特率來(lái)表示,其單位為bps(bit per second)即每秒鐘傳送bit的數(shù)量。 串口規(guī)定,數(shù)據(jù)線在空閑的狀態(tài)下,必須是置為高電平的狀態(tài)。 起始信號(hào)為低電平,因?yàn)榇?/p>

    2023年04月08日
    瀏覽(23)
  • STM32 串口通信USART1的配置和使用

    STM32 串口通信USART1的配置和使用

    UART:universal asynchronous receiver and transmitter通用異步收發(fā)器 USART:universal synchronous asynchronous receiver and transmitter通用同步異步收發(fā)器 上圖是利用寄存器配置的步驟,下面我用官方庫(kù)函數(shù)配置USART1 1、要配置串口usart1,先查看數(shù)據(jù)手冊(cè)以及開發(fā)板原理圖的芯片管腳 根據(jù)上圖可以看

    2024年02月05日
    瀏覽(26)
  • STM32F4 基于USART串口的藍(lán)牙通信

    STM32F4 基于USART串口的藍(lán)牙通信

    目錄 一、硬件資源 連接方案 其他配置 二、實(shí)驗(yàn)原理 基本定義 USART介紹 USART工作原理 數(shù)據(jù)發(fā)送 數(shù)據(jù)接收 藍(lán)牙HM-10配置 三、代碼部分 usart.c usart.h Serial.c Serial.h main.c 結(jié)語(yǔ) STM32F401,OLED,藍(lán)牙hm10 連接方案 設(shè)備1的TX與設(shè)備2的RX連接,這樣設(shè)備1發(fā)送的數(shù)據(jù)可以被設(shè)備2接收到。

    2024年01月17日
    瀏覽(52)
  • STM32串口通信中的USART_RecieveData函數(shù)分析

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

    拿這個(gè)中斷函數(shù)為例 ????????很多人可能注意到了接收數(shù)據(jù)函數(shù)的返回類型為無(wú)符號(hào)短整型,疑惑這里為什么用了一個(gè)無(wú)符號(hào)字符類型變量rec接收。 先看看這個(gè)函數(shù)的定義 ????????其實(shí),是因?yàn)榇谠O(shè)置的字長(zhǎng)為8,所以數(shù)據(jù)寄存器中第八位為0,第0~7位為數(shù)據(jù)有效位,

    2024年02月11日
    瀏覽(50)
  • 【STM32】STM32學(xué)習(xí)筆記-USART串口協(xié)議(25)

    【STM32】STM32學(xué)習(xí)筆記-USART串口協(xié)議(25)

    按數(shù)據(jù)傳送的方式,通訊可分為串行通訊與并行通訊,串行通訊是指設(shè)備之間通過(guò)少量數(shù)據(jù)信號(hào)線(一般是8根以下), 地線以及控制信號(hào)線,按數(shù)據(jù)位形式一位一位地傳輸數(shù)據(jù)的通訊方式。而并行通訊一般是指使用8、16、32及64根或更多的數(shù)據(jù)線進(jìn)行傳輸?shù)耐ㄓ嵎绞剑?它們的通

    2024年01月19日
    瀏覽(26)
  • 【STM32】STM32學(xué)習(xí)筆記-USART串口數(shù)據(jù)包(28)

    【STM32】STM32學(xué)習(xí)筆記-USART串口數(shù)據(jù)包(28)

    串口通訊(Serial Communication)是一種設(shè)備間非常常用的串行通訊方式,因?yàn)樗?jiǎn)單便捷,因此大部分電子設(shè)備都支持該通訊方式, 電子工程師在調(diào)試設(shè)備時(shí)也經(jīng)常使用該通訊方式輸出調(diào)試信息。 在計(jì)算機(jī)科學(xué)里,大部分復(fù)雜的問(wèn)題都可以通過(guò)分層來(lái)簡(jiǎn)化。如芯片被分為內(nèi)核層和

    2024年01月18日
    瀏覽(33)
  • 江科協(xié)STM32教程——STM32 使用串口助手進(jìn)行LED燈的點(diǎn)亮熄滅滅控制全代碼過(guò)程(USART串口通信的簡(jiǎn)單應(yīng)用)

    江科協(xié)STM32教程——STM32 使用串口助手進(jìn)行LED燈的點(diǎn)亮熄滅滅控制全代碼過(guò)程(USART串口通信的簡(jiǎn)單應(yīng)用)

    ? ? ? ? 使用USART串口通信,通過(guò)上位機(jī)串口助手發(fā)送符串給STM32執(zhí)行LED燈點(diǎn)亮熄滅操作的流程。 ? ? ? ? 基本的配置如下所示,GPIO口配置的為PA9推挽輸出,用于LED燈的操作。其余注意USART_ITConfig和USART_Cmd開啟USART接收中斷和使能USART運(yùn)行。 ? ? ? ? 接下來(lái)要進(jìn)行發(fā)送字

    2024年03月21日
    瀏覽(25)
  • stm32學(xué)習(xí)筆記-9 USART串口

    stm32學(xué)習(xí)筆記-9 USART串口

    注:筆記主要參考B站 江科大自化協(xié) 教學(xué)視頻“STM32入門教程-2023持續(xù)更新中”。 注:工程及代碼文件放在了本人的Github倉(cāng)庫(kù)。 從本節(jié)開始,將逐一學(xué)習(xí)STM32的通信接口。首先介紹以下stm32都集成了什么通信外設(shè)。 為了控制或讀取外掛模塊,stm32需要與外掛模塊進(jìn)行通信,來(lái)擴(kuò)

    2024年02月14日
    瀏覽(20)
  • STM32F103C8T6的USART串口通信及中斷

    STM32F103C8T6的USART串口通信及中斷

    一、串口通信 (一)串口協(xié)議和RS-232標(biāo)準(zhǔn) 1.串口通信協(xié)議 串口通信是指串口按位(bit)發(fā)送和接收字節(jié)。盡管比特字節(jié)(byte)的串行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。 串口通信協(xié)議是指規(guī)定了數(shù)據(jù)包的內(nèi)容,內(nèi)容包含了起始位、主體

    2024年02月02日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包