什么是串口
毫無疑問,串口是我們接觸到的第一種通信接口,無論是串口調(diào)試還是與外設(shè)的通信,串口的用途十分廣。
關(guān)于同步和異步,最簡單的區(qū)分方法就是看在通信時需不需要接時鐘線,像SPI、I2C等通信接口都需要接CLK線,毫無疑問它們都是同步的,而串口是一種擁有兩種模式的通信接口,可以選擇是否連接時鐘線。至于串行和并行,區(qū)分的方法就是看數(shù)據(jù)是一位一位的發(fā)送還是以一個字節(jié)(8位)或16位的格式發(fā)送,顯然并口的數(shù)據(jù)線就要多的多,而串行接口的數(shù)據(jù)線就少的多,若只發(fā)送或只接受(單工),一根數(shù)據(jù)線就夠了,半雙工或全雙工的通信接口也一般只需要兩條數(shù)據(jù)線。
UART是一種通用串行數(shù)據(jù)總線,用于異步通信。該總線雙向通信,可以實(shí)現(xiàn)全雙工傳輸和接收。在嵌入式設(shè)計中,UART用于主機(jī)與輔助設(shè)備通信,如汽車音響與外接AP之間的通信,與PC機(jī)通信包括與監(jiān)控調(diào)試器和其它器件,如EEPROM通信。
STM32上的串口
現(xiàn)在基本所有的MCU都會有串口,在STM32上有為數(shù)不少的串口,而且同一串口可以在不同的引腳映射,給我們的開發(fā)帶來了極大的方便,據(jù)有經(jīng)驗(yàn)的人教導(dǎo),可以用串口收發(fā)數(shù)據(jù)的模塊千萬不要使用別的通信接口,一是因?yàn)榇诘呐渲煤褪褂么_實(shí)簡單好用,二是因?yàn)檫B接雙方使用“端對端”的方式連接,發(fā)生錯誤后的排查檢測也比較容易。但是串口也有數(shù)據(jù)傳輸速度較慢的不足,只能用于低速通信,以及從程序開發(fā)的角度上看,串口具有獨(dú)占性,一旦有一個程序使用了某個串口,則別的程序無法再使用這個串口;即使是同一個程序,在使用同一個串口的時候,由于“串行通信”的特性,因而無法采用多線程編程對某個串口進(jìn)行同時操作,否則會因各命令相互干擾而導(dǎo)致所有的命令都失效。
STM32中的USART框圖
STM32中的USART寄存器
SR(狀態(tài)寄存器)中可以獲知當(dāng)前串口的狀態(tài)
DR(數(shù)據(jù)寄存器)用來存放接收或?qū)⒁l(fā)送的數(shù)據(jù)
BRR(波特率寄存器)用來設(shè)置串口的波特率
CR(控制寄存器)則用來對USART進(jìn)行配置及使能
GTPR可以設(shè)置USART的保護(hù)時間和預(yù)分頻系數(shù)
STM32中串口的配置
串口的配置較為簡單,短短幾步就能完成對串口的配置
此處借用原子哥的原碼來進(jìn)行講解
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV@OVER8=0
mantissa=temp; //得到整數(shù)部分
fraction=(temp-mantissa)*16; //得到小數(shù)部分@OVER8=0
mantissa<<=4;
mantissa+=fraction;
RCC->AHB1ENR|=1<<0; //使能PORTA口時鐘
RCC->APB2ENR|=1<<4; //使能串口1時鐘
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,復(fù)用功能,上拉輸出
GPIO_AF_Set(GPIOA,9,7); //PA9,AF7
GPIO_AF_Set(GPIOA,10,7);//PA10,AF7
//波特率設(shè)置
USART1->BRR=mantissa; //波特率設(shè)置
USART1->CR1&=~(1<<15); //設(shè)置OVER8=0
USART1->CR1|=1<<3; //串口發(fā)送使能
#if EN_USART1_RX //如果使能了接收
//使能接收中斷
USART1->CR1|=1<<2; //串口接收使能
USART1->CR1|=1<<5; //接收緩沖區(qū)非空中斷使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//組2,最低優(yōu)先級
#endif
USART1->CR1|=1<<13; //串口使能
}
入口參數(shù)為時鐘頻率和波特率
1、首先通過時鐘頻率和波特率計算出“mantisa”這個參數(shù)是一會兒賦值給USARTx->BRR 寄存器的,來設(shè)置串口的波特率
2、使能IO口時鐘和所用串口的時鐘
3、設(shè)置IO口(TX、RX),設(shè)置為復(fù)用功能,復(fù)用為USART
4、設(shè)置波特率,是否過采樣(16倍過采樣來保證較好的容錯性),數(shù)據(jù)長度和有無校驗(yàn)位
5、使能發(fā)送和接收
6、使能中斷,并且設(shè)置中斷的優(yōu)先級以及優(yōu)先級分組
7、使能串口
STM32中串口中斷
STM32中串口接收數(shù)據(jù)
#if EN_USART1_RX //如果使能了接收
//串口1中斷服務(wù)程序
//注意,讀取USARTx->SR能避免莫名其妙的錯誤
u8 USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節(jié).
//接收狀態(tài)
//bit15, 接收完成標(biāo)志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節(jié)數(shù)目
u16 USART_RX_STA=0; //接收狀態(tài)標(biāo)記
void USART1_IRQHandler(void)
{
u8 res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntEnter();
#endif
if(USART1->SR&(1<<5))//接收到數(shù)據(jù)
{
res=USART1->DR;
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
else USART_RX_STA|=0x8000; //接收完成了
}else //還沒收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數(shù)據(jù)錯誤,重新開始接收
}
}
}
}
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
OSIntExit();
#endif
}
#endif
u8 USART_RX_BUF[USART_REC_LEN];是定義了一個接收緩沖數(shù)組,來存放接收到的數(shù)據(jù),每個元素可以存放一個字節(jié)的數(shù)據(jù),數(shù)組的長度為USART_REC_LEN。
關(guān)于操作系統(tǒng)的部分暫時忽略,接下來定義了一個16位的接收狀態(tài)標(biāo)記USART_RX_STA
它的第15位是接收完成標(biāo)志,第14位是接收到0x0d的標(biāo)志,而0-13位表示接收到的有效字節(jié)的數(shù)目
當(dāng)接收到一個數(shù)據(jù)后,把接收到的數(shù)據(jù)(DR寄存器中的值)暫存在中間變量中,先檢驗(yàn)接收是否完成,若未完成,檢驗(yàn)是否接收到0x0d,如果接收到,修改狀態(tài)標(biāo)記,然后把中間變量的值賦給緩沖數(shù)組,將狀態(tài)標(biāo)記的值自增,完成對一個字節(jié)的接收
STM32中串口發(fā)送數(shù)據(jù)
使用串口發(fā)送數(shù)據(jù)就更加簡單了,只需要將要發(fā)送的數(shù)據(jù)(8位)賦給數(shù)據(jù)寄存器(DR)然后等待發(fā)送完成即可
上一篇:STM32通信接口(二)IIC--軟件模擬
下一篇:STM32 SPI2讀W25Q128驅(qū)動
推薦閱讀
史海拾趣
隨著制造業(yè)信息化的發(fā)展,企業(yè)對信息化解決方案的需求日益迫切。為了滿足客戶的需求,Extech公司在2003年相繼推出了XTMES、XTPLM等產(chǎn)品,并在國內(nèi)首次提出了“一體化解決方案”的概念。這一解決方案覆蓋了制造業(yè)信息化的各個環(huán)節(jié),為客戶提供了全方位的信息化服務(wù)。通過這一解決方案的推出,Extech公司在制造業(yè)信息化領(lǐng)域進(jìn)一步擴(kuò)大了自己的市場份額。
進(jìn)入新世紀(jì)后,Extech公司迎來了新的發(fā)展機(jī)遇。2000年,公司成為國家第一批863/CIMS系統(tǒng)集成和咨詢服務(wù)企業(yè),同時也是國家863/CIMS示范應(yīng)用工程的主流供應(yīng)商。這一榮譽(yù)的獲得不僅體現(xiàn)了公司在技術(shù)實(shí)力和服務(wù)能力方面的優(yōu)勢,也為公司未來的發(fā)展提供了更廣闊的空間。
在追求經(jīng)濟(jì)效益的同時,Advanced Electronic Packaging公司始終關(guān)注企業(yè)社會責(zé)任和可持續(xù)發(fā)展。公司積極采用環(huán)保材料和生產(chǎn)工藝,減少生產(chǎn)過程中的能源消耗和環(huán)境污染。此外,公司還積極參與社會公益活動,為當(dāng)?shù)厣鐓^(qū)提供就業(yè)機(jī)會和培訓(xùn)支持。這些舉措不僅提升了公司的社會形象,也為公司的長期發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
這些故事只是Advanced Electronic Packaging公司發(fā)展過程中的一部分,它們共同展現(xiàn)了公司在電子行業(yè)中的成長軌跡和取得的成就。未來,隨著科技的不斷進(jìn)步和市場需求的不斷變化,相信Advanced Electronic Packaging公司將繼續(xù)保持創(chuàng)新精神,為電子行業(yè)的發(fā)展貢獻(xiàn)更多力量。
隨著產(chǎn)品的不斷升級和市場的不斷擴(kuò)大,Altitude Technology開始將目光投向海外市場。公司制定了詳細(xì)的市場拓展計劃,通過參加國際電子展會、建立海外銷售渠道等方式,積極推廣自己的產(chǎn)品。經(jīng)過一番努力,Altitude Technology的產(chǎn)品逐漸在國際市場上獲得了認(rèn)可,公司的知名度也得到了提升。
隨著電子元器件市場的不斷擴(kuò)大,富捷電子積極實(shí)施產(chǎn)能擴(kuò)張計劃。自2020年起,公司相繼啟動了多個擴(kuò)產(chǎn)項(xiàng)目,包括一期100億產(chǎn)能生產(chǎn)基地項(xiàng)目建設(shè)和二期車規(guī)電阻產(chǎn)能擴(kuò)充項(xiàng)目。這些項(xiàng)目的順利實(shí)施,極大地提升了公司的生產(chǎn)能力和市場響應(yīng)速度,有效滿足了智能終端、5G、工業(yè)互聯(lián)網(wǎng)等重要行業(yè)對電子元器件的旺盛需求。同時,富捷電子還通過優(yōu)化生產(chǎn)流程、提升設(shè)備自動化水平等措施,進(jìn)一步提高了生產(chǎn)效率和產(chǎn)品質(zhì)量。
隨著技術(shù)的不斷成熟和產(chǎn)品質(zhì)量的提升,APSA公司開始積極拓展市場。通過參加行業(yè)展會、與合作伙伴建立戰(zhàn)略合作關(guān)系等方式,公司的知名度逐漸提升。同時,公司也注重品牌形象的建立,通過一系列市場營銷活動,成功塑造了專業(yè)、可靠的品牌形象。
傳感器接近開關(guān)10-36VDC/200mA/4mmLJ18A3-4-Z/BX 樂清市新歐傳感器有限公司1傳感器接近開關(guān)10-36VDC/200mA/8mmLJ18A3-8-Z/BX 樂清市新歐傳感器有限公司1傳感器接近開關(guān)黃色/塑料/大 1傳感器光電二極管發(fā)射管EL-1KL3 2傳感器光電三極管接 ...… 查看全部問答∨ |
|
WinCE6.0中Catalog Item沒有CISCO Aironet 340/350 PCMCIA WLAN Card網(wǎng)卡驅(qū)動選項(xiàng) 我要加一個CISCO Aironet 350 PCMCIA 無線網(wǎng)卡,查看Windows Embedded CE6.0幫助文件,有CISCO Aironet 340/350 PCMCIA WLAN Card驅(qū)動可以用,位于Device Drivers\\Networking\\下。可是我的Wince6.0卻找不到這個驅(qū)動,不知道怎么回事?… 查看全部問答∨ |
|
wince5.0 我的板子不用ADSL線,用公司網(wǎng)絡(luò)上網(wǎng)正常,說明網(wǎng)卡及驅(qū)動沒有問題! 我用ADSL線直接接我的PC,通過輸入用戶名及密碼,正常登錄,并正常瀏覽網(wǎng)頁,說明ADSL線及賬戶沒有問題! 我的問題是: ADSL線接上我的板子,創(chuàng)建PPPOE后,只要一 ...… 查看全部問答∨ |
【LaunchPad手記】MSP430 LaunchPad演示應(yīng)用:內(nèi)部溫度測量 不會編輯帖子,直奔主題,利用剛剛到手的MSP430 LaunchPad演示應(yīng)用,內(nèi)部溫度測量,注意到手后的430先不要下載新程序哦,里面是帶程序的準(zhǔn)備工作1:下載IAR for MSP430,因?yàn)槲矣玫腎AR就暫時不提CCS了哦準(zhǔn)備工作2:檢查電腦是否安裝java程序,如果 ...… 查看全部問答∨ |
數(shù)碼管 點(diǎn)陣已關(guān) 怎么還閃? 1062不能正常顯示 要使用1062液晶顯示 所以通過void cmg88()//關(guān)數(shù)碼管,點(diǎn)陣函數(shù),但是點(diǎn)陣關(guān)不不了,還是不停的閃,液晶顯示也有點(diǎn)閃,不知道為什么這樣。 程序如下: #include<reg51.h>//包含頭文件,一般情況不需要改動,頭文件包含特殊功 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 基于GPS自動授時的無線智能控制器的設(shè)計
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時處理器M7000
- 基于HW2181B的航模無線遙控通信系統(tǒng)設(shè)計與實(shí)現(xiàn)
- 應(yīng)對機(jī)器人“四高”,極海推出全球首款雙核Cortex-M52 MCU G32R501
- 非道路移動機(jī)械透射式煙度計研究與實(shí)現(xiàn)
- 基于STM32F103的角磨機(jī)開關(guān)磁阻電機(jī)控制器的設(shè)計
- 大眾汽車宣布明年起其所有電動車型全面轉(zhuǎn)向磷酸鐵鋰電池,升級至MEB Plus平臺
- 總產(chǎn)值破2000億,深圳要做“機(jī)器人第一城”?
- 鴻道Intewell操作系統(tǒng) 人形機(jī)器人底層操作系統(tǒng)
- 如何定位國產(chǎn)智駕芯片的終局價值?
- 新一代車規(guī)級數(shù)字功放電感VSAD-T系列 為汽車音響注入高保真基因
- 蜂巢能源快充電池突破:15分鐘充至滿電,提升30%效率
- 整車操作系統(tǒng)何以躋身智能汽車三大件?
- 人形機(jī)器人如何做到“手眼”協(xié)同+“大小腦”協(xié)同?
- 中國電池公司獲英國政府10億英鎊支持!
- 從游戲到智能駕駛,英偉達(dá)有哪些技術(shù)升級?