首先,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串口通信程序之UART2(TTL)
下一篇:STM32自打包的UART串口通訊編程方法
推薦閱讀
史海拾趣
在XX世紀XX年代,DYMO公司推出了一款具有劃時代意義的標簽打印機。這款打印機采用了全新的打印技術,能夠打印出清晰、耐用的標簽,并且支持多種字體和圖案。這一創新技術讓DYMO公司在標簽打印領域取得了領先地位,并為其后續的產品線奠定了堅實的基礎。
Aerotronics Marketing Inc公司注重與高校和研究機構的合作,通過產學研合作的方式推動技術創新。公司與多所知名高校建立了緊密的合作關系,共同開展無人機技術的研發和應用研究。這種合作模式不僅為公司提供了源源不斷的技術支持和人才儲備,還推動了整個電子行業的技術進步。
隨著全球化趨勢的加劇,AITSEMI公司開始實施全球化戰略,積極開拓海外市場。通過設立海外分支機構、參加國際展會等方式,AITSEMI成功將產品推廣至全球范圍,并贏得了廣泛的國際認可。同時,公司還加大了品牌建設的力度,通過廣告宣傳、社交媒體推廣等方式提升品牌影響力,進一步鞏固了公司在全球電子行業的領先地位。
這些故事基于AITSEMI公司的公開資料和發展歷程進行編寫,旨在展示其在電子行業中的成長和發展。然而,由于公司具體的發展過程可能涉及更多的細節和未公開的信息,因此這些故事可能并不完全準確或詳盡。如需更詳細和準確的信息,建議直接訪問AITSEMI公司的官方網站或查閱相關新聞報道。
CommScope Inc公司的前身可以追溯到1953年,在北卡羅萊納州的山核桃成立的高級電纜公司。這個公司以其卓越的電話線產品贏得了市場的認可。到了1964年,康普的產品線開始使用高級電纜和同軸電纜,標志著公司在電纜技術領域的突破。隨著技術的不斷革新,1966年,康普在卡托巴縣的福特社區開始數控制造,進一步提升了生產效率。1976年,大陸高級康普部門被Frank Drendel領導的投資者集團收購,這為公司日后的發展奠定了堅實的基礎。
GreenTech還致力于綠色照明技術的研發和推廣。公司推出了一系列高效節能的LED照明產品,包括智能路燈、室內照明系統等。這些產品不僅具有長壽命、低能耗等優點,還通過智能控制實現了按需照明,進一步降低了能耗。GreenTech積極與各地政府和企業合作,推動綠色照明技術在城市照明、工業照明等領域的廣泛應用,為節能減排和環境保護做出了積極貢獻。
在電子技術的不斷推動下,Global Specialties始終保持對新技術的高度敏感。公司不斷投入研發資源,對現有產品進行升級換代,并推出了一系列具有創新性的新產品。例如,公司開發的智能測試儀器能夠自動完成復雜的測試任務,大大提高了測試效率和準確性。這些技術創新不僅鞏固了Global Specialties在業內的領先地位,還為公司帶來了更多的商業機會。
利用金屬底殼,加墊MAP軟性硅膠導熱片達到散熱效果。 原來大家使用導熱硅脂作為導熱材料的很多: 當今的電子產品朝著兩個方向發展:一方面產品的集成度越來越高、功耗不斷增大;另一方面產品越來越輕、薄、短。這就使得產品的散熱矛盾越來越突出 ...… 查看全部問答∨ |
|
請教各位,現在需要做個USB接口的鍵盤程序,先是通過遙控器按鍵向紅外線接收頭發送信號并解碼 這些部分現已完成 問題: 由于對USB協議不熟,現在正在學習中 1.請教各位,我解碼后的數據怎么 ...… 查看全部問答∨ |
|
在運行TOPWIN2005的時候出現了EAcess violation的錯誤,我點了確定后顯示 Acess violation at address 740b0cc2,read of address 740b0cc2,是怎么回事? 我是第一次用TOPWIN2005,不好意思! 請哪位大俠幫個忙,小妹我不勝感激!… 查看全部問答∨ |
|