日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年08月05日(星期二)

2019年08月05日 | STM32F030 Nucleo-開發(fā)調(diào)試的經(jīng)驗USART的重要性

發(fā)布者:GoldenEclipse 來源: eefocus關(guān)鍵字:STM32F030  Nucleo  開發(fā)調(diào)試  USART 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

先聲明一點,我自己不是高手,也不是大神,只是積累了一點點,想分享一下罷了!


還記得那會我在初學(xué)51單片機(jī)時,當(dāng)?shù)弥狿89V51系列單片機(jī)支持在線仿真、跟蹤代碼時,那是一個興奮啊,無論如何都要弄一個來玩玩,進(jìn)行代碼跟蹤!


當(dāng)在開始接觸和學(xué)習(xí)STM32是,那時候知道了J-Link的存在,它出了燒錄,也能代碼跟蹤,單步執(zhí)行。最后有知道了St-Link的存在,它針對意法半導(dǎo)體的MCU作調(diào)試和燒錄!當(dāng)然了,還有ST-Link和J-Link的各種針對于STM32的兼容用法。但知道當(dāng)我開始使用別人的代碼進(jìn)行開發(fā)的時候,無可想象,使用J-link或者ST-Link進(jìn)行在線仿真調(diào)試(代碼跟蹤)顯得矯情了!


對于最底層的硬件驅(qū)動調(diào)試來說,使用J-link或者ST-Link進(jìn)行代碼跟蹤效果是比較可觀的,因為只因為我們可以看到寄存器的值進(jìn)行邏輯的判斷和配置正確與否的判斷。當(dāng)然,也可以在某些特殊的情況的要求下,進(jìn)行代碼的優(yōu)化,也可以使用。至于其他的情況,自我感覺使用J-Link/ST-Link進(jìn)行代碼跟蹤顯得很矯情了!


通常一個大的項目或者一個產(chǎn)品項目中,整一個軟件程序基本上不可能是同一個人寫的,可能同事寫的,也有可能是芯片原廠提供的方案,而且各個程序員的風(fēng)格各異(對于對編程風(fēng)格有要求的公司,情況可能會好一點,總之有些程序員的程序風(fēng)格可以叫做慘不忍睹,總之,在調(diào)試程序一天,你就會罵他娘一天,直到罵到公司不再使用這個方案或者你辭職,也不知道這類程序員是咋想的,為毛原意讓人家罵他娘,他都不愿意修正或者學(xué)習(xí)一下風(fēng)格),除了這些還有這項技術(shù)的難度、算法的復(fù)雜程度等等,所以通常會將軟件進(jìn)行分層,最底層就是啟動之后硬件驅(qū)動了,然后就是與硬件無關(guān)的功能代碼了(當(dāng)然,我只是隨便舉個例子,比如Linux、Android這些程序就分成了好幾層,而且非常復(fù)雜),還有就是,有些技術(shù)是原廠或者方案公司不方便外漏的技術(shù),所以他們所提供的二次開發(fā)包SDK通常關(guān)鍵技術(shù)已經(jīng)封裝成庫,那么使用J-Link/ST-Link來調(diào)試跟蹤代碼已經(jīng)不現(xiàn)實了,因為在一個項目中我們不可能了解到全部的代碼,也不可能去看全部的代碼,只因為沒有時間。通常可能我們只需要知道自己負(fù)責(zé)的這部分的邏輯流程和進(jìn)入接口和向外輸出接口即可,也就是說,我們自己只能在小小的空間里面做事,萬萬不能越界。這時候,UART/USART同步/異步串行口通信將起到了巨大的作用。很簡單,只需在其接口Tx和Rx與PC機(jī)建立串口通信,使用串口調(diào)試助手與其通信(打印或者輸入標(biāo)志到MCU),即可通過串口調(diào)試助手的打印現(xiàn)象來進(jìn)行代碼的跟蹤。說白了,就是在我們代碼的某處(需要的地方)將某些標(biāo)志或者數(shù)據(jù)打印出來,既可以輕易的對代碼進(jìn)行跟蹤。就可以知道代碼的執(zhí)行邏輯和步驟。我現(xiàn)在這可比J-Link/ST-Link簡單多了。


所以,基于這樣的一個思想,每當(dāng)我進(jìn)行新的硬件代碼調(diào)試時(不管是自己寫驅(qū)動還是使用SDK包),只要硬件支持UART/USART,第一件事就是點燈(能夠控制GPIO口)和調(diào)通UART/USART(以便進(jìn)行代碼的調(diào)試),這兩點自我覺得是非常重要的。


到這里,基本上經(jīng)驗之談已經(jīng)結(jié)束,下面就記錄一下STM32F030 Nucleo板卡的學(xué)習(xí) 。


首先,有必要搞清楚幾點:


(1)UART和USART之間的區(qū)別:


UART:Universal Asynchronous Receiver and Transmitter,通用異步收發(fā)器,[Bus Signal] Tx , Rx


51單片機(jī)上面的就是這個了,ARM架構(gòu)的MCU/CPU部分也還支持。


USART:Universal Synchronous Asynchronous Receiver and Transmitter,通用同步異步收發(fā)器,[Bus Signal]Tx , Rx , CK


從名字上,就可以看出了,USART比UART高大上多了,只是在UART之上增強(qiáng)了通信協(xié)議。


USART支持同步模式,因此USART需要同步信號USART_CK(仔細(xì)的觀察STM32單片機(jī),就可以發(fā)現(xiàn)這樣的引腳),通常同步信號通信相對而言是比較少用的,所以通常的調(diào)試中,UART和USART的使用方式是一樣的,都使用異步模式。


(2)STM32 USART通信的各種模式:


不用多說,我相信看到這個表就一目了然了!


當(dāng)然,通過MAX485或者RS485等芯片,UART/USART接口可以作為458通信接口。


那么現(xiàn)在就要把??桶蹇ǖ腢SART1調(diào)通,與PC機(jī)進(jìn)行串口通信,


(1)找到使用的USART1引腳。


查看Datasheet,得知如下圖:


STM32F030 USATU1的復(fù)用第一功能引腳就如上了,其中有GPIOA8作為USART1_CK,同步模式時作為USART同步通信的同步時鐘引腳;GPIOA9腳為USART1通信時的發(fā)送引腳;GPIOA10腳作為USART1通信時的接收引腳;GPIOA11和GPIOA12引腳作為USART1通信當(dāng)使用硬件流控時,作為流控控制引腳。然而,在這里咱不玩什么同步模式,也不玩流控,所以只需要配置GPIOA9和GPIOA10引腳即可。


(2)找到??桶蹇ǖ腢SART1的引腳位置。


查看牛客板卡的用戶手冊《STM32 Nucleo-64 boards》,找到下圖:


(3)在庫中找到USART相關(guān)的接口。


先確定要調(diào)試功能:


打開GPIO時鐘和USART1時鐘,選擇時鐘源,配置復(fù)用IO模式:


void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState); //GPIO時鐘使能函數(shù)


void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); //USART1時鐘使能函數(shù)


void RCC_USARTCLKConfig(uint32_t RCC_USARTCLK);//USART1時鐘源選擇函數(shù)


void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);//IO口復(fù)用配置函數(shù)。


配置GPIO口:


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)


USART初始化并啟動USART通信:


void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);//USART初始化函數(shù)


void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);//USART使能函數(shù)


void USART_ClearFlag(USART_TypeDef* USARTx, uint32_t USART_FLAG);//USART清標(biāo)志函數(shù)


配置中斷:


對于USART的接收功能來說,可以使用兩種方式,分別是循環(huán)檢測接收方式和中斷方式接收數(shù)據(jù),前一種方式會阻塞占用MCU,導(dǎo)致效率低下,而中斷方式接收數(shù)據(jù)則不會阻塞,所以這里使用中斷方式接收數(shù)據(jù)。


void USART_ITConfig(USART_TypeDef* USARTx, uint32_t USART_IT, FunctionalState NewState);//USART中斷使能函數(shù)


void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//嵌套向量中斷控制器初始化配置函數(shù)


接收和發(fā)送數(shù)據(jù):


FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint32_t USART_FLAG);//獲取USART狀態(tài)標(biāo)識函數(shù)


uint16_t USART_ReceiveData(USART_TypeDef* USARTx);//USART讀取數(shù)據(jù)函數(shù)


void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);//USART發(fā)送數(shù)據(jù)函數(shù)


那么這么多函數(shù)是從哪里找的呢??答案是,在keil上搜索得到的,所以這種開發(fā)的方式就是,當(dāng)調(diào)試某個功能時,找到與之相關(guān)的文件比如:stm32f0xx_usart.c和stm32f0xx_usart.h文件,其由于GPIO相關(guān),又去找stm32f0xx_gpio.c和stm32f0xx_gpio.h文件,其時鐘還與RCC相關(guān),就去找stm32f0xx_rcc.c和stm32f0xx_rcc.h文件,又還與NVIC相關(guān),所以又去找stm32f0xx_misc.c和stm32f0xx_misc.h文件??傊褪且痪湓?,它需要什么就給它什么。


還有個問題就是,你咋知道先配置什么,再配置什么的???答案是:其實我也不知道,是參考手冊或者編程手冊告訴我的,比如下圖:


圖已經(jīng)告訴咱數(shù)據(jù)是怎么傳輸?shù)牧?,?yīng)該配置啥寄存器等等,那咱不就是知道怎么配置了么》??就是這樣的。


(4)配上COMS電平轉(zhuǎn)TTL電平的模塊,比如MAX232,MAX3232,RS232,PL2303等。與PC機(jī)連接通信。


我用的就是上圖這種模塊了,連接是:


MCU_Tx---------模塊Rx


MCU_Rx---------模塊Tx


然后就與PC機(jī)連接,再連上串口調(diào)試助手。


OK!到這里就還有一點要講的了!那就是波特率,其實就是單片機(jī)或計算機(jī)串口通信時的速率。其實在手冊當(dāng)中也給咱講的一清二楚了,


人家講的很清楚,還給咱舉了例子,如何計算,如何配置。其實如上圖的計算過程只是對于玩操作寄存器的人才需要考慮的計算,如果直接用庫函數(shù)開發(fā),直接指定波特率就好了。


還有就是,普通的通信應(yīng)該配置成什么呢???三個字“8N1,無奇偶”,啥意思呢??8個數(shù)據(jù)為,無流控,1個停止位,無奇偶校驗,就是這么簡單。


且看庫的配置結(jié)構(gòu)體:


指定波特率,設(shè)置數(shù)據(jù)位長度8位,1個停止位,無奇偶校驗,輸入和輸出模式,無流控。如下圖:


具體初始化如下:


USART初始化:


NVIC初始化:

初始化就如上了。


那么,咱要發(fā)送數(shù)據(jù)哇!所以,咋就寫寫:


發(fā)送一個字節(jié):


發(fā)送字符串:

發(fā)送十進(jìn)制數(shù)據(jù):

OK!發(fā)送的就是這樣,沒什么好解釋的!哈哈!


但是,如果用來進(jìn)行調(diào)試的話,以上方法好像不太給力哦,為毛呢??比如所咱想發(fā)送字符串和數(shù)據(jù)混雜呢》》按照上面的方法,那可得寫好幾句打印函數(shù)呢!嘿嘿!那咱就把ANSI標(biāo)準(zhǔn)C的printf移植過來用吧!腫么玩呢??其實,兩步就好:


(1)包含頭文件#include


(2)如下圖:


這幾個意思呢??而且,明眼人一看就能看見,在咱的工程中,壓根就沒有調(diào)用int fputc(int ch, FILE *f)這個函數(shù),只是寫在那里了而已,哈哈!其實呢,int fputc(int ch, FILE *f)函數(shù)是printf函數(shù)開放的一個從硬件讀取數(shù)據(jù)的接口,那么在哪里調(diào)用呢??肯定在C標(biāo)志庫調(diào)用啦!只是咱看不到罷了。所以,不用管它,寫上就好!哈哈!


這樣,咱就能在工程中直接使用printf函數(shù)了,至于怎么使用,不會的話,自己好好的去學(xué)習(xí)C吧。


發(fā)送數(shù)據(jù)講完了,咱就說說接收數(shù)據(jù)了,我在這里就簡單的表示一下,具體的還要看實際應(yīng)用的需要修改。


首先咱得找到stm32f0xx_it.c文件,然后再文件中任意位置寫函數(shù)


void USART1_IRQHandler(void)


{


}


那么這個函數(shù)名從哪來的呢??又是干啥的呢??


還記得前面提到的在啟動文件建立的中斷向量表嗎?打開startup_stm32f030.s文件,中斷向量表如下:


沒錯,當(dāng)發(fā)生中斷時,MCU會:


(1)將現(xiàn)有數(shù)據(jù)保存在相應(yīng)寄存器中,即保存現(xiàn)場


(2)跳轉(zhuǎn)到中斷向量表中查詢發(fā)生中斷的外設(shè),并找到中斷入口地址


(3)執(zhí)行中斷功能


(4)跳出中斷,從相應(yīng)寄存器中讀取數(shù)據(jù),即恢復(fù)現(xiàn)場


中斷的過程就是上面這幾個了,那么void USART1_IRQHandler(void)函數(shù)就是USART1的中斷入口地址了,就是這么簡單。再多說一點就是,有些人說,看見別人在函數(shù)的任意位置填寫任意的函數(shù),他就直接成了中斷函數(shù)了,為毛這里要有ST規(guī)定了名字啊???其實我想說,只要你開心,想怎么樣都可以;首先,void USART1_IRQHandler(void)函數(shù)可以存在于工程中的任意C文件,再就是,如果想自己命名,那就修改一下中斷向量表的名字為你想要的名字即可,只要你開心。


OK!實現(xiàn)就如下圖了:


上圖首先檢測USART1讀標(biāo)志,然后讀取數(shù)據(jù),再然后將其打印出來個咱看,數(shù)據(jù)是否發(fā)送成功。然后情況標(biāo)志位。在這里只是驗證通信的成功。


所以當(dāng)我們從串口調(diào)試助手發(fā)送數(shù)據(jù)后,發(fā)送的數(shù)據(jù)有會在串口調(diào)試助手上面打印出來,有點像回顯。哈哈!就是這么簡單了!


具體的主程序調(diào)用如下:


很簡單!一直在輸出!哈哈!OK了!

關(guān)鍵字:STM32F030  Nucleo  開發(fā)調(diào)試  USART 引用地址:STM32F030 Nucleo-開發(fā)調(diào)試的經(jīng)驗USART的重要性

上一篇:HAL庫-STM32F4 UART-IT
下一篇:HAL庫-STM32F4 HAL_GPIO_Init()

推薦閱讀

8月2日,由高工產(chǎn)研機(jī)器人研究所(GGII)主辦的2018中國機(jī)器人集成商大會在東莞松山湖舉行。上個月初,中國機(jī)器人產(chǎn)業(yè)聯(lián)盟對外發(fā)布數(shù)據(jù),去年國產(chǎn)工業(yè)機(jī)器人的市場份額下降至不到27%,同比降低6個百分點,遭遇5年以來的首次下降。 記者在現(xiàn)場了解到,國產(chǎn)機(jī)器人的“春寒”也成為此次大會的焦點話題。高工咨詢董事長張小飛在大會開幕講話中對國產(chǎn)機(jī)器人...
還記得當(dāng)年的打印機(jī),鼠標(biāo)和調(diào)制解調(diào)器嗎?他們都有巨大笨重的連接器和粗電纜,并且必須擰到你的電腦上。這些設(shè)備正是使用UART協(xié)議與計算機(jī)進(jìn)行通信。雖然USB幾乎完全取代了舊的電纜和連接器,但UART絕對沒有過時。您會發(fā)現(xiàn)目前許多項目中使用UART的GPS模塊、藍(lán)牙模塊和RFID讀卡器模塊等連接到Raspberry Pi,Arduino或其他微控制器上。通用異步收發(fā)傳輸器...
main.c/**定時器中斷TIM3方式,(當(dāng)基本定時器不用PWM輸出)設(shè)計兩路輸出兩路脈沖波:周期:100us,占空比80%周期:100us,占空比20%**/int main(void){ LED_Init();//pc14引腳初始化 BEEP_Init();/pc13引腳初始化 TIME_Init();//定時器初始化 while(1);}time.c#include "stm32f10x.h"#include "time.h"#inc...
凌華科技推出采用傳感器開放式系統(tǒng)架構(gòu)(SOSA)并搭載第 11 代英特爾? Core? i7處理器的堅固型 3U VPX 處理器刀片 VPX3-TL 模塊集成 8 核 CPU,適用于更強(qiáng)大的圖形計算、AI 加速功能和多樣化I/O的關(guān)鍵任務(wù)型應(yīng)用摘要:● 凌華科技3U VPX 模塊基于第 11 代英特爾?Core? i7 處理器技術(shù)(原 Tiger Lake-H),具備更強(qiáng)大的數(shù)據(jù)和圖形...

史海拾趣

問答坊 | AI 解惑

FPGA設(shè)計中的編程技巧

本人搜集的FPGA設(shè)計中的編程技巧(免費下載)!共同學(xué)習(xí),共同進(jìn)步!…

查看全部問答∨

求助!??!

我之前是從事C++的,現(xiàn)在剛換的工作,新工作要求我學(xué)習(xí)STM32的內(nèi)容,可是現(xiàn)在自己連DMA是什么都忘記了。 請教各位大俠,如果我想從事基于STM32的工作,目前我應(yīng)該惡補(bǔ)那些知識?!?

查看全部問答∨

太陽能空調(diào)制冷系統(tǒng) (你聽說過嗎,我第一次知道這個概念)

太陽能空調(diào)制冷系統(tǒng)由于節(jié)能、清潔無污染等特點,促使人們不斷深入地對它進(jìn)行研究。隨著太陽能集熱器和制冷系統(tǒng)的材料、工質(zhì)、工藝制造、設(shè)計等應(yīng)用技術(shù)的不斷改進(jìn),太陽能空調(diào)制冷裝置的應(yīng)用將得到廣泛的運用。利用太陽能作為能源的空調(diào)裝置,一般 ...…

查看全部問答∨

淺析AT89S51與AT89C51單片機(jī)的區(qū)別

    AT89S51 是一個低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含8k Bytes ISP(In-systemprogrammable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯 ...…

查看全部問答∨

51單片機(jī)求教:外部Flash、RAM的讀寫問題

假如51外掛一塊Flash,一塊RAM。應(yīng)用程序存在外部的Flash里面 我寫一段引導(dǎo)程序,讓51上電后,把程序從Flash復(fù)制到RAM里,然后執(zhí)行 現(xiàn)在有幾個問題比較困惑: 1 按一般介紹,程序都是放在ROM里,如果把程序?qū)懙絉AM里,將PC指向程序首行,是否也 ...…

查看全部問答∨

有誰做過tsl2561和isl29002?

有誰做過tsl2561和isl29002我現(xiàn)在讀出的數(shù)據(jù)都是 ff  ff誰能給我發(fā)個能有的,郵箱 chenqiuhuang3@163.com謝謝??!…

查看全部問答∨

Ubuntu10.10下不能make menuconfig問題解決

在Ubuntu下交叉編譯Linux2.6內(nèi)核,輸入make menuconfig發(fā)現(xiàn)有一些頭文件找不到: root@loong:/opt/linux-2.6.39# make menuconfig  HOSTCC  scripts/basic/fixdep  HOSTCC  scripts/basic/docproc  HOSTCC  scrip ...…

查看全部問答∨

70V的直流電能用導(dǎo)線傳輸嗎?影響大嗎?

各位高手,我想問一下,70V的直流電能直接用導(dǎo)線傳輸嗎?或者是必須得用SMA線傳輸啊? 麻煩各位啦…

查看全部問答∨

用匯編把ADC值轉(zhuǎn)換為溫度值的查表程序,求大神幫忙

已經(jīng)顯示出ADC的值,但是不會根據(jù)公式寫查表程序轉(zhuǎn)換為溫度值,求壇子里的各路大神幫幫忙,感激不盡…

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved