娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月13日(星期五)

2019年06月13日 | STM32單片機學習筆記——USART串口通信

發布者:平安幸福 來源: eefocus關鍵字:STM32  單片機  USART  串口通信 手機看文章 掃描二維碼
隨時隨地手機看文章

首先,USART是什么呢?


USART是一個全雙工通用同步/異步串行收發模塊,該接口是一個高度靈活的串行通信設備。(來自百度)


這是官方解釋,而我對它的通俗解釋是:這是一個用于和其他設備(如電腦、單片機等)通信(交換數據、信息等)的端口,就像手機數據線那樣。


當然,這只是我的一種通俗看法,大家經過了深入的學習之后,一定會產生更為準確、成熟的看法。


我所學習的,就是通過這個模塊來實現單片機和電腦之間的通信,并以此為基礎,實現利用電腦來簡單地控制單片機的目的。


那么,我們來簡單地看一看我們這段代碼由哪幾部分組成:


1. 用于存儲相關配置的結構體。


2. 變量Temp,用于存儲從電腦接收到的信息。


3. 配置TX、RX、時鐘、串口、LED燈。


4. 預先設置LED燈關閉的一段代碼。


5. 主函數,實現接收數據、改變燈的亮滅狀態。


好了,代碼結構就是這樣了,下面我們來具體地分析一下代碼。




1. 結構體:


GPIO_InitTypeDef GPIO_LED_InitStructure;

 

GPIO_InitTypeDef GPIO_USART_TX_InitStructure;

 

GPIO_InitTypeDef GPIO_USART_RX_InitStructure;

 

USART_InitTypeDef USART_InitStructure;


我們先來看一下“GPIO_InitTypeDef”,這是定義在“stm32f10x_gpio.h”里面的結構體,用于存儲相關的配置信息。

同理,“USART_InitTypeDef”也是這樣,它們是存儲兩個不同寄存器配置的結構體。

然后,我們看右面的結構體名。這些名字沒有什么特殊含義,定義成其他名字也不影響使用。我把它們定義成這個名字就是為了和它們對應的寄存器相匹配。

我一共定義了四個結構體,第一個是LED燈的配置信息,第二個是USART的TX寄存器的配置信息,

第三個是USART的RX寄存器的配置信息,第四個是USART的配置信息。

好了,結構體的說明就到此結束。


2. 變量Temp:


這個沒有什么需要多說的,只需要注意它的變量類型,這決定了它能夠存儲什么樣的信息。


3. 配置信息:


先上代碼:

// 配置時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

// 配置USART_TX

GPIO_USART_TX_InitStructure.GPIO_Pin =  GPIO_Pin_9;

GPIO_USART_TX_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_USART_TX_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_USART_TX_InitStructure);

// 配置USART_RX

GPIO_USART_RX_InitStructure.GPIO_Pin =  GPIO_Pin_10;

GPIO_USART_RX_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

 

GPIO_Init(GPIOA, &GPIO_USART_RX_InitStructure);

// 配置串口

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

//配置燈

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

 

  GPIO_LED_InitStructure.GPIO_Pin = GPIO_Pin_0;

  GPIO_LED_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_LED_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

 

  GPIO_Init(GPIOB, &GPIO_LED_InitStructure);

這就是完整的配置信息了。


配置的過程很簡單,就是將配置信息賦值給相應的結構體成員,然后調用配置函數,由函數將配置信息寫到單片機中。


先從時鐘說起吧,“RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);”,這句就是來開啟GPIOA時鐘的。

當然,根據單片機的布線不同,相應的GPIO可能不是A,這個就靈活應變吧。

然后是“RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);”,這句是來開啟USART1的時鐘的。

同樣,根據單片機的布線不同,相應的USART也有可能不是1。

這兩個時鐘是必需打開的,否則就不能使用相應的功能了。

這里有個比喻:“時鐘就是心臟。”,這句話說的一點沒錯。即使不需要即使功能也要打開時鐘。

(我有點覺得這個時鐘其實不是用來計時的……)


然后來配置TX。

TX,就是輸出單元,指的是單片機用來給電腦(或其他設備)發送數據的寄存器。

我的單片機上的TX位于Pin9,是Pin9的復用功能,所以就有了第七和第八行的代碼。

然后速度設為50MHz,這個可以變更,但沒有必要。速度快一點不是很好嗎?

這三項配置好后,就可以調用GPIO_Init()來將其配置到單片機里面了。


然后是RX。

RX,相應的就是輸入單元。

相似的,它位于Pin10,模式是浮動輸入(當然了……)。

輸入單元不用配置速度,因為它是被動輸入,沒有速度這種說法……

同樣,調用GPIO_Init()函數配置一下。


然后是串口。

串口的配置主要包括:波特率、字長、停止位、奇偶校驗位、模式、硬件控制流等。

波特率就設為115200(原因我也不懂,大多這么設……自嘲一個……);

字長就設為8位,一個字節;停止位就設為1;

校驗位現在不需要,就設為No(就一個字節的信息還校驗什么啊……);

模式為TX和RX;

硬件控制流也不需要,設為None。

好了,現在調用USART_Init()來配置好。

這還不夠,我們還需要“使能”USART,就是讓它工作的意思。調用USART_Cmd()函數就行了。


最后是LED。

我把打開GPIOB時鐘的代碼寫到這里了,好像有點不合理……和之前一樣,只是把A改為了B。

我的單片機上的LED位于Pin0,引腳模式為輸出,速度為50MHz。


至此,配置完畢。


4. LED預代碼:


我起了一個高大上的名字,但其實就一段……

//關閉燈

GPIO_SetBits(GPIOB, GPIO_Pin_0);

我讓燈先處于關閉的狀態,當然,也可以讓它先處于打開的狀態,只要將“Set”改為“Reset”就行了。


5. 主函數:


這個主函數并不是main()函數的意思,是主要共嫩函數的意思。

while (1)

{

if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)

{

temp = USART_ReceiveData(USART1);

USART_SendData(USART1,temp);

GPIOB->ODR ^=GPIO_Pin_0;

}

}

將函數主體套在while死循環里,保證單片機一直在執行主要功能(保證它不罷工……)。

調用USART_GetFlagStatus()函數來檢查單片機是否接收到來自電腦(或其他設備)的信息,如果是,則執行之后的代碼。

將接收到的信息保存在Temp變量中,再將其發送給電腦(或其他設備)。

之后,改變LED的電平狀態,實現由亮轉滅和由滅轉亮。


OK,到此為止,所有代碼結束。最后附上完整版代碼。

#include "stm32f10x.h"

 

GPIO_InitTypeDef GPIO_LED_InitStructure;

 

GPIO_InitTypeDef GPIO_USART_TX_InitStructure;

 

GPIO_InitTypeDef GPIO_USART_RX_InitStructure;

 

USART_InitTypeDef USART_InitStructure;

 

int main()

{

unsigned short int temp;

// 配置時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

// 配置USART_TX

GPIO_USART_TX_InitStructure.GPIO_Pin =  GPIO_Pin_9;

GPIO_USART_TX_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_USART_TX_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_USART_TX_InitStructure);

// 配置USART_RX

GPIO_USART_RX_InitStructure.GPIO_Pin =  GPIO_Pin_10;

GPIO_USART_RX_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

 

GPIO_Init(GPIOA, &GPIO_USART_RX_InitStructure);

// 配置串口

USART_InitStructure.USART_BaudRate = 115200;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

USART_InitStructure.USART_StopBits = USART_StopBits_1;

USART_InitStructure.USART_Parity = USART_Parity_No;

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

//配置燈

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_LED_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_LED_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_LED_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_LED_InitStructure);

//關閉燈

GPIO_SetBits(GPIOB, GPIO_Pin_0);

while (1)

{

if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)

{

temp = USART_ReceiveData(USART1);

USART_SendData(USART1,temp);

GPIOB->ODR ^=GPIO_Pin_0;

}

 

}

}



關鍵字:STM32  單片機  USART  串口通信 引用地址:STM32單片機學習筆記——USART串口通信

上一篇:stm32串口通信程序之UART2(TTL)
下一篇:STM32自打包的UART串口通訊編程方法

推薦閱讀

正面無劉海全面屏  新浪手機訊 6月12日晚間消息,半個月前vivo在X21 FIFA世界杯非凡版的活動上為vivo NEX系列做了發布預熱。而在今晚,這一新的系列正式對外公布。究竟什么是NEX?新品各方面表現如何?定位如何又是怎樣?我們看發布會回顧。  了解這款產品信息詳細請移步:vivo NEX旗艦版評測:換馬甲還是真科技肌肉秀  會議開場,由vivo高級副...
蔚來汽車宣布NIO Pilot自動輔助駕駛系統升級,本次新增7項功能;同時推送升級的還有NIO OS 2.0智能操作系統,升級為全新的UX交互和UI設計。  據悉,NIO Pilot自動輔助駕駛系統本次新增包含高速自動輔助駕駛(Highway Pilot)、擁堵自動輔助駕駛(Traffic Jam Pilot)、轉向燈控制變道(Auto Lane Change)等在內的7項功能。 NIO Pilot系統NIO P...
上午集微網報道業界有消息稱,聯電涉及違反商業機密法的訴訟將于近日宣判。而據臺媒聯合新聞網最新消息,臺中地院今天下午宣判,以違反商業機密法等罪將何建廷判刑5年6個月,罰金500萬新臺幣(單位下同);王永銘4年6個月,罰金400萬;聯電協理戎樂天判刑6年6個月,罰金600萬;聯電被判處罰金1億元,可上訴至知識產權法院。臺中地院行政庭長林源森表示,依...
realme公司正準備在6月15日在全球范圍內發布realme GT 5G,但是realme可能正在開發realme 9系列。它將作為今年早些時候realme 8系列的繼任者。最近有人在realme網站上發現了realme 9系列身影。  現在,網絡博客Passionate Geeks提供的所謂realme 9渲染圖已經浮出水面。雖然我們目前還不能確認它的真實性。但考慮到設計語言,這些渲染圖...

史海拾趣

問答坊 | AI 解惑

大功率芯片的散熱方案

利用金屬底殼,加墊MAP軟性硅膠導熱片達到散熱效果。 原來大家使用導熱硅脂作為導熱材料的很多: 當今的電子產品朝著兩個方向發展:一方面產品的集成度越來越高、功耗不斷增大;另一方面產品越來越輕、薄、短。這就使得產品的散熱矛盾越來越突出 ...…

查看全部問答∨

stm32研討會資料

電壓檢測,定時器的使用等等問題的解決 …

查看全部問答∨

電賽C題資料

本帖最后由 paulhyde 于 2014-9-15 09:21 編輯 電賽C的一些資料,或許有重復的。但是也會有一點用。 [ 本帖最后由 koolah 于 2009-9-3 21:29 編輯 ]  …

查看全部問答∨

USB協議問題--------

請教各位,現在需要做個USB接口的鍵盤程序,先是通過遙控器按鍵向紅外線接收頭發送信號并解碼 這些部分現已完成 問題:      由于對USB協議不熟,現在正在學習中      1.請教各位,我解碼后的數據怎么 ...…

查看全部問答∨

迷茫者向各位問路!

我在現在這家公司做測試一年整,工作主要是產品驗證與報告輸出,倍感枯燥與無味,一心想往研發方向走,可現在的技術功底太一般,而且我只是個大專畢業。在校是電子專業,像模擬 、數字電路 、c語言等基礎都一般。工作之余,用一年的業余時間從頭學 ...…

查看全部問答∨

請教幾個TOPWIN2005燒錄器的問題

在運行TOPWIN2005的時候出現了EAcess violation的錯誤,我點了確定后顯示 Acess violation at address 740b0cc2,read of address 740b0cc2,是怎么回事? 我是第一次用TOPWIN2005,不好意思! 請哪位大俠幫個忙,小妹我不勝感激!…

查看全部問答∨

嵌入式技術交流QQ群

        群號:37829738 希望各位同仁共同交流有關ARM,單片機,LINUX,人工智能技術…

查看全部問答∨

STM32系列中帶FSMC能直接驅動市場上那些7寸以上的TFTLCD?

                                 請問STM32系列中帶FSMC的接口能直接驅動市場上那些7寸以上的TFT LCD ?…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 大港区| 邹城市| 中西区| 桑日县| 钟祥市| 太原市| 肥西县| 浦北县| 红桥区| 宕昌县| 大化| 六安市| 虞城县| 邹平县| 博罗县| 紫金县| 象山县| 南丰县| 靖江市| 和林格尔县| 深泽县| 孟连| 吉木萨尔县| 霍山县| 唐山市| 大竹县| 民县| 伊通| 大理市| 龙口市| 大兴区| 叙永县| 垦利县| 达孜县| 夏津县| 繁峙县| 湄潭县| 罗源县| 陇南市| 卢湾区| 巧家县|