STM32單片機入門學習——第26節: [9-2] USART串口外設

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難,但我還是想去做!

本文寫于:2025.04.08

STM32開發板學習——第26節: [9-2] USART串口外設

  • 前言
  • 開發板說明
  • 引用
  • 解答和科普
  • 一、USART結構
  • 二、數據幀
  • 問題
  • 總結

前言

? ?本次筆記是用來記錄我的學習過程,同時把我需要的困難和思考記下來,有助于我的學習,同時也作為一種習慣,可以督促我學習,是一個激勵自己的過程,讓我們開始32單片機的學習之路。
? ?歡迎大家給我提意見,能給我的嵌入式之旅提供方向和路線,現在作為小白,我就先學習32單片機了,就跟著B站上的江協科技開始學習了.
? ?在這里會記錄下江協科技32單片機開發板的配套視頻教程所作的實驗和學習筆記內容,因為我之前有一個開發板,我大概率會用我的板子模仿著來做.讓我們一起加油!
? ?另外為了增強我的學習效果:每次筆記把我不知道或者問題在后面提出來,再下一篇開頭作為解答!

開發板說明

? ?本人采用的是慧凈的開發板,因為這個板子是我N年前就買的板子,索性就拿來用了。另外我也購買了江科大的學習套間。
? ?原理圖如下
1、開發板原理圖
在這里插入圖片描述
2、STM32F103C6和51對比
在這里插入圖片描述
3、STM32F103C6核心板
在這里插入圖片描述

視頻中的都用這個開發板來實現,如果有資源就利用起來。另外也計劃實現江協科技的套件。

下圖是實物圖
在這里插入圖片描述

引用

【STM32入門教程-2023版 細致講解 中文字幕】
還參考了下圖中的書籍:
STM32庫開發實戰指南:基于STM32F103(第2版)
在這里插入圖片描述
數據手冊
在這里插入圖片描述

解答和科普

一、USART結構

在這里插入圖片描述
波特率發生器:就是分頻器;
波特率,數據位,停止位,校驗位配置;
硬件流控制,A發的太快了B原本只能拋棄新數據或者覆蓋原數據,如果有硬件流控制,在硬件電路上,會多出一根線,如果B沒準備好接受,置高電平,如果準備好了就置低電平,A接受到了B反饋的信號,就只會在B準備好的時候,才發數據;可以防止B處理數據慢,導致數據丟失;STM32也有,一般不用。兼容其他的的協議。
USART1(APB2) 開啟時鐘注意一下;
在這里插入圖片描述
這里有TX和RX,這兩個就是發送和接受引腳,下面的 SW_RX、IRDA_OUT/IN這些是智能卡和IRDA通信的引腳,我們不用這些協議,所以這些引腳就不用管,
在這里插入圖片描述
在這里插入圖片描述
發送或接收的字節數據就存在這里,上面有兩個數據寄存器,一個是發送數據寄存器TDR,另一個是接受數據寄存器RDR,這兩個寄存器占用同一個地址,就和51單片機串口的SBUFF寄存器一樣,在程序上,只表現為一個寄存器,就是數據寄存器DR,但實際硬件中,是分成了兩個寄存器,一個用于發送TDR,一個用于接受RDR,TDR是只寫的,RDR是只讀的,當你進行寫操作時,數據就寫入到TDR,當你進行讀操作時,數據就是從RDR讀出來的;
下面是兩個移位寄存器,一個用于發送,一個用于接受,發送移位寄存器的作用就是,把一個字節的數據一位一位地移出去,正好對應串口協議的波形數據位,這兩個寄存器是怎么工作的,比如你在某時刻給TDR寫入了0x55這個數據,在寄存器里就是二進制存儲,0101 0101,那么此時硬件檢測到你寫入數據了,他就會檢查,當前移位寄存器是不是有數據正在移位,如果沒有這個0101 0101就會立刻,全部移動到發送移位寄存器,準備發送,當數據從TDR移動到移位寄存器時,會只一個標志位,叫TXE,發送寄存器空,我們檢查這個標志位,如果置1了,我們就可以在TDR寫入下一個數據了,注意一下,當TXE置1時,數據其實還沒有發送數據,只要數據從TDR轉移到發送移位寄存器了,TXE就會置1,我們就可以寫入新的數據了;

在這里插入圖片描述
然后發送移位寄存器就會在下面這里的發生器控制的驅動下,向右移位,然后一位一位地,把數據輸出到TX引腳,這里是向右移位的,正好和串口協議規定的低位先行,是一致的,當數據移位完成后,新的數據就會再次自動地從TDR轉移到發送移位寄存器里來,如果當前移位寄存器移位還沒有完成,TDR的數據就會進行等待,一但移位完成,就會立刻轉移過來,有了TDR和移位寄存器的雙重緩存,可以保證連續發數據的時候,數據幀之間不會
有空閑,提高了工作效率,簡單來說就是你數據一但從TDR轉移到移位寄存器了,管你有沒有移位完成,我就立刻把下一個數據放在TDR等著,一但移完了,新的數據就會立刻跟上,這樣做,效率就會比較高;
接收端也是這樣,數據從RX引腳通向接受移位寄存器,在接收器控制的驅動下,一位一位地讀取 RX電平,先放在最高位,然后向右移,移位8次就接收一個字節,同樣,串口協議規定低位先行,所以接受移位寄存器是從高位往低位這個方向移動的,之后,當一個字節移位完成之后,這一個字節的數據就會整體地一下子轉移到接受寄存器RDR里面,在轉移的過程中,也會置一個標志位,叫RXNE,接受寄存器為非空,當檢測到RXNE置1之后,就可以把數據讀走了,同樣這里也是兩個寄存器緩存,當數據從移位寄存器轉移到RDR時,就可以直接移位接受下一幀數據了,這就是USART外設整個的工作流程,主要功能就差不多了,就是數據寄存器和移位寄存器,發送移位寄存器往TX引腳移位,接收移位寄存器從RX引腳移位,當然發送還需加上幀頭幀尾,接受還需提出幀頭幀尾,這些操作,它內部有電路自動執行,

發送器控制,就是用來控制發送移位寄存器的工作的,接收器控制,用來控制接受移位寄存器的工作,左邊有一個硬件流控制,簡稱流控,如果設備發的太快,接收設備來不及處理,就會出現丟棄或覆蓋數據的現象,那有了流控,就可以避免這個問題了,這里流控有兩個引腳一個是nRTS:請求發送,也就是告訴別人,我當前能不能接收,是輸出腳,一個是nCTS:也就是用來接收別人的nRTS信號的,n代表的是低電平有效,首先得找另一個支持流控的串口,它的TX接到我的RX,然后我的RTS要輸出一個能不能接受的反饋信號,接到對方的CTS,當我能接收的時候,RTS就置低電平,請求對方發送,對方的CTS接收到之后,就可以一直發,當我處理不過來的時候,比如接受寄存器我一直沒有讀,又有新的數據過來了,現在就代表我沒有及時處理,那RTS就會置高電平,對方CTS接收到之后,就會暫停發送,直到這里接受寄存器數據寄存器被讀走,RTS被置低電平,新的數據才會繼續發送,那反過來,當我的TX給對方發送數據時,我們CTS就要接到對方的RTS,用于判斷 對方能不能接受,TX和CTS是一對,RX和RTS是一對,CTS和RTS也要交叉連接,這就是流控的工作模式;

右邊這塊電路是用來產生同步的時鐘信號,它是配合發送移位寄存器輸出的,發送寄存器每移位一次,同步時鐘電平就跳變一個周期,時鐘告訴對方,我移出去一位數據了,你看要不要讓我這個時鐘信號來指導你接收一下,當然這個時鐘只支持輸出,不支持輸入,所以兩個USART之間,不能實現同步的串口通信,那這個時鐘有什么用呢:第一個,兼容別的協議,比如串口加上時鐘之后,就更SPI協議特別像,所以有了時鐘輸出的串口,就可以兼容SPI,另外這個時鐘也可以做自適應波特率,比如接收設備不確定發送設備給的什么波特率,那就可以測量一下這個時鐘周期,然后再計算得到波特率,不過這就需要另外寫程序來實現這個功能了,這個時鐘功能一般不用;

喚醒單元:這部分的作用是實現串口掛載多設備,我們之前說,串口一般是點對點的通信,點對點,只支持兩個設備互相通信,想發數據直接發就行,而多設備,在一條總線上,可以接多個從設備,每個設備分配一個地址,我想和某個設備通信,就先進行尋址,確定通信對象,再進行數據收發,那回到這里,這個喚醒單元就可以用來實現多設備的功能,在這里,可以給串口分配一個地址,當你發送指定地址時,此設備喚醒開始工作,當你發送別的設備地址時候,別的設備就喚醒工作,這個設備沒收到地址,就會保持沉默,這樣就可以實現多設備的串口通信了,一般也不用;

中斷輸出控制,中斷申請位,就是狀態寄存器這里的各種標志位,狀態寄存器這里,有兩個標志位比較重要,一個是TXE發送寄存器,另一個是RXNE接受寄存器非空,這兩個是判斷發送狀態和接受狀態的必要標志位,剩下的標志位,了解一下就行;
中斷輸出控制:就是配置中斷是不是能通向NVIC;
最下面時波特率發生器:其實就是分頻器,APB時鐘進行分頻,得到發送和接受移位的時鐘,這里時鐘輸入是fPCLKx(x=1或2), USART1掛載在APB2,所以就是PCLK2的時鐘,一般是72M,其他的都掛載在APB1,所以是PCLK1的時鐘,一般是36M,之后這個時鐘進行分頻,除以個USARTDIV的分頻系數,USARTDIV里面就是右邊這樣,是一個數值,并且分為了整數部分和小數部分,因為有些波特率,用72M除一個整數的話,可能除不盡,會有誤差,所以這里分頻系數是支持小數點后4位的,分頻就更加精準,之后分頻完之后,還要再除個16,得到發送器時鐘和接收器時鐘,通向控制部分,然后右邊這里,如果TE(TX Enable)為1,就是發送器使能了,發送部分的波特率就有效;如果RE為1,那就是接收器使能了,接收部分的波特率就有效。到這里這個串口的主體結構就看完了。
看看寄存器描述,就知道怎么控制的。

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
這些引腳都必須按照引腳定義里規定的來,或者看看有沒有重映射。
在這里插入圖片描述
最左邊是波特率發生器,用于產生約定的通信速率,時鐘來源是PCLK2或1,經過波特率分頻器后,產生的時鐘通向發送控制器和接收控制器,發送控制器和接收控制器,用來控制發送移位和接收移位,之后,由發送數據寄存器和發送移位寄存器這兩個寄存器的配合,將數據一位一位地移出去,通過GPIO的復用輸出,輸出到TX引腳,產生串口協議規定的波形,這里畫了幾個右移的符號,就是代表這個移位寄存器是往右移的,是低位先行,當數據由數據寄存器轉到移位寄存器時,會置一個TXE的標志位,我們判斷這個標志位,就可以知道是不是可以寫下一個數據了,然后接收部分也是類似;
RX引腳的波形,通過GPIO輸入,在接收控制器的控制下,一位一位地移入接收移位寄存器,這里畫了右移的符號,也是右移的,因為是低位先行,所以要從左邊開始移進來,移完一幀數據后,數據就會統一轉運到接受數據寄存器,在轉移的同時,置一個RXNE標志位,我們檢查這個標志位,就可以知道是不是收到數據了,同時這個標志位也是可以去申請中斷,這樣就可以在收到數據時,直接進入中斷函數,然后快速地讀取和保存數據,那右邊實際上有四個寄存器,但在軟件寄存器,只有一個DR寄存器可以供我們讀寫,寫入DR時,數據走上面這條路,進行發送,讀取DR時,數據走下面這條路,進行接收,這就是USART進行串口數據收發的過程;
最后右下角,是一個開關控制,就是配置完成之后,用Cmd開啟一下外設。

二、數據幀

在這里插入圖片描述
這個圖是在程序中配置8位字長和9位字長的波形比較,這里的字長就是前面說的數據位長度,它這里的字長,是包含校驗位的額,是這種描述方式。
第一條時序,很明顯就是TX發送或者RX接收的數據幀格式,空閑高電平,然后起始位0,然后根據寫入的數據,置1或0,一次發送位0到位8,加起來就是9位,最后停止位1,數據幀結束;在這里位8,也就是第9個位置,是一個可能的奇偶校驗位,通過配置寄存器就可以配置成奇校驗、偶校驗或者無校驗,這里可以選擇配置成8位有效載荷+1位校驗位,也可以選擇9位全都是有效載荷,不過既然選擇了9位字長,一般都是要加上校驗位的,因為8位有效載荷,正好對應一個字節;
下面這個時鐘,就是之前說的同步時鐘輸出的功能,可以看到,這里在每個數據位的中間,都有一個時鐘上升沿,時鐘的頻率,和數據速率也是一樣的,接收端可以在時鐘上升沿進行采樣,這樣就可以精準定位每一位數據,這個時鐘的最后一位,可以通過這個LBCL位控制,要不要輸出,另外這個時鐘的極性、相位什么的,也是可以通過配置寄存器配置;
一個是空閑幀,一個是斷開幀是局域網用的。

8位字長的波形,這里的數據位是從位0一直到位7,總共是8位,比上面這個少了一個位8,同樣這個最后一位位7,也是一個可能的奇偶校驗位,還是同樣既然你選擇了8位字長,那這里最好就選擇無校驗,要不然你校驗位占1位,有效載荷就剩下7位了,一個字節都發不了;總共有4種選擇:9位字長,有校驗無校驗,8位字長,有校驗無校驗;最好選擇9位字長,有校驗或者8位字長,無校驗這兩種,這樣每一幀的有效載荷都會死一個字節,比較舒服。

在這里插入圖片描述
數據幀不同停止位:STM32串口可以配置停止位長度為0.5,1,1.5,2這四種,這四種參數的區別就是停止位的時長不一樣:
1個停止位:這時停止位的時長就和數據位的一位,時長一樣;
1.5個停止位:這時停止位就是數據位一位時長的1.5倍;
2個停止位:這時停止位就是數據位一位時長的2倍;
0.5個停止位:這時停止位就是數據位一位時長的0.5倍.
在這里插入圖片描述
這兩個圖展示的是USART電路輸入數據的一些策略:對于串口來說,根據前面的介紹,可以想到,串口的輸出TX應該是比輸入RX簡單很多,輸入你就定時翻轉TX引腳高低電平就行了,但是輸入,就復雜一些,你不僅要保證,輸入的采樣頻率和波特率一致, 還要保證每次輸入采樣的位置,要正好處于每一位的正中間,只有在每個電平的正中間采樣,這樣的高低電平讀進來,才是最可靠的,如果你采樣點過于靠前或者靠后,那就可能高低電平還在翻轉,電平還不穩定,或者少有誤差,數據就采樣錯了,另外,輸入最后還要對噪聲有一定的判斷能力,如果是噪聲,最好能置個標志位提醒我一下,這些就是輸入數據所面臨的問題,那看一下STM32是如何來設計輸入電路的。
首先第一個圖,這里展示的是USART的起始位 幀測 ,當輸入電路偵測到一個數據幀的起始位后,就會以波特率的頻率,連續采樣一幀數據,同時,從起始位開始,采樣位置就要對齊到位的正中間,只要第一位對齊了,后面就肯定都是對齊的,那為了實現這些功能,首先輸入的這部分電路對采樣時鐘進行了細分,它會以波特率的16倍頻率進行采樣,也就是在一位的時間里,可以進行16次采樣,最開始,空閑狀態高電平,那采樣就一直是1,在某個位置,突然采到一個0,那么就說明,在這兩次采樣之間,出現了下降沿,如果沒有噪聲,那之后就應該是起始位了,在起始位,會進行連續16次采樣,沒有噪聲的話,這16位采樣肯定就都是0,這沒問題,但是實際電路還是會存在一些噪聲的,所以及時這里出現下降沿了,后續也要再采樣幾次,以防萬一,根據手冊的描述,這會接收電路,還會在下降沿之后的第3次、5次、7次,進行一批采樣,在第8次、9次、10次,再進行一批采樣,且這兩批采樣,都要要求每3位里面至少應有2個0,沒有噪聲,那肯定全是0,滿足情況,如果有一些輕微噪聲,導致這3位里面只有兩個0,另一個是1,那也算是檢測到了起始位,但是在狀態寄存器會置一個NE,噪聲標志位,就是提醒你一下,數據我收到了,但是有噪聲,你小心點,如果這三位只有一個0,那就不算檢測到了起始位,可能前面那個下降沿是噪聲導致的,這時電路就忽略前面的數據,重新開始捕捉下降沿,這就是STM32的串口,在接收過程中,對噪聲的處理,如果通過了這個起始位偵測,那接受狀態就由空閑,變為接收起始位,同時第8、9、10次采樣的位置,就正好是起始位的正中間,之后,接收數據位時,就都在第8、9、10次,進行采樣,這樣就能保證采樣位置在位的正中間了,這就是起始位偵測和采樣位置對齊的策略;

在這里插入圖片描述

這里,從1到16,是一個數據位的時間長度,在一個數據位,有16個采樣時鐘,由于起始位偵測已經對齊了采樣時鐘,所以這里就直接在第8、9、10次采樣數據位,為了保證數據的可靠性,這里是連續采樣3次,沒有噪聲的理想情況下,這3次肯定全為1或者全為0,全為1,就認為收到了1,全為0,就認為收到了0,如果有噪聲,導致3次采樣不是全為1,或者全為0,那就按照2:1的規則來,2次為1,那就認為收到了1,在這種情況下,噪聲標志位NE也會置1,告訴你,我收到數據了,但是有噪聲,你小心點,這就是檢測噪聲的數據采樣,可見STM32對這個電路的設計考慮還是很充分的;
在這里插入圖片描述
波特率發生器就是分頻器,發送器和接收器的波特率由波特率寄存器BRR里面的DIV確定,DIV分為整數和小數部分,可以實現更細膩的分頻,那波特率和分頻系數的關系,可以由這個計算公式進行計算:波特率=PCLK2/1的時鐘頻率/16倍的DIV,為什么這里多了一個16,因為它內部還有一個16倍波特率的采樣時鐘,所以這里輸入時鐘/DIV要等于16倍的波特率,最終計算波特率,自然要多除一個16了,幾個例子,比如我要配置USART1為9600的波特率,那如何配置這個BRR寄存器,代入公式,9600=72M/(16*DIV),解出來DIV=72M/9600/16,468.75,轉換成二進制,11101 0100 .11;
在這里插入圖片描述

最左邊是USB端口,USB有四根線,GND、D+、D-、VCC, USB標準供電時5V,然后中間D+和D-是通信線,走的也是USB協議,所以這里需要一個CH340芯片轉換一下,轉換之后輸出的就是TXD和RXD,是串口協議,最后通過排針引出來,那需要注意的就是這邊的供電策略,首先,所有的電都是這個VCC+5V來的,然后VCC+5V通過這個穩壓管電路進行降壓,得到VCC+3.3V,之后VCC+5V和VCC+3.3V,都通過排針引出來了,所以這個第6腳和第4腳,是分別有5V和3.3V輸出的,很多人迷惑的是這個第5腳,板子上標的是VCC,這個引腳,通過原理圖可以看到,它是通向CH340芯片的VCC上,所以這個第5腳,實際上是CH340的電影輸入腳,一般我們這個模塊的排針會有一個跳線帽,這個跳線帽需要插在4、5腳或者5、6腳上,右邊也有文字說明,5V到VCC,CH340供電為5V,TTL電平為5V,短路3V3到VCC,CH340供電為3.3V,TTL電平為3.3V,所以這個跳線帽是用來選擇通信電平的,也是給CH340供電的,所以最好不要拿掉,如果你拿掉了,就相當于這整個芯片,沒有供電,即使把跳線帽拔掉,不給芯片供電,這個串口還是能工作的,可能是從別的地方汲取的電流,也有可能是其他地方,測試一下,不差跳線帽,通信電平是3.3V,不過為了穩定,最好還是插上跳線帽,STM32通信需要3.3V,所以把跳線帽插在4,5腳上就行了。

然后就是數據手冊了。

問題

總結

本節課主要學了STM32的USART串口的外設,以及工作流程是什么樣的,最左邊是波特率發生器,用于產生約定的通信速率,時鐘來源是PCLK2或1,經過波特率分頻器后,產生的時鐘通向發送控制器和接收控制器,發送控制器和接收控制器,用來控制發送移位和接收移位,之后,由發送數據寄存器和發送移位寄存器這兩個寄存器的配合,將數據一位一位地移出去,通過GPIO的復用輸出,輸出到TX引腳,產生串口協議規定的波形,這里畫了幾個右移的符號,就是代表這個移位寄存器是往右移的,是低位先行,當數據由數據寄存器轉到移位寄存器時,會置一個TXE的標志位,我們判斷這個標志位,就可以知道是不是可以寫下一個數據了,然后接收部分也是類似;
RX引腳的波形,通過GPIO輸入,在接收控制器的控制下,一位一位地移入接收移位寄存器,這里畫了右移的符號,也是右移的,因為是低位先行,所以要從左邊開始移進來,移完一幀數據后,數據就會統一轉運到接受數據寄存器,在轉移的同時,置一個RXNE標志位,我們檢查這個標志位,就可以知道是不是收到數據了,同時這個標志位也是可以去申請中斷,這樣就可以在收到數據時,直接進入中斷函數,然后快速地讀取和保存數據,那右邊實際上有四個寄存器,但在軟件寄存器,只有一個DR寄存器可以供我們讀寫,寫入DR時,數據走上面這條路,進行發送,讀取DR時,數據走下面這條路,進行接收,這就是USART進行串口數據收發的過程;
最后右下角,是一個開關控制,就是配置完成之后,用Cmd開啟一下外設。
還學習了USB轉串口的原理圖。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76081.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【學Rust寫CAD】31 muldiv255函數(muldiv255.rs,已經取消)

源碼 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

LLM+js實現大模型對話

代碼運行效果圖&#xff1a;前提是你有一個可用的openai服務&#xff0c;然后用下面一個html頁即可啟動 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

用claude3.7,不到1天寫了一個工具小程序(11個工具6個游戲)

一、功能概覽和本文核心 本次開發&#xff0c;不是1天干擼&#xff0c;而是在下班后或早起搞的&#xff0c;總體加和計算了一下&#xff0c;大概1天的時間&#xff08;12個小時&#xff09;&#xff0c;平常下班都是9點的衰仔&#xff0c;好在還有雙休&#xff0c;謝天謝地。 …

C++實現文件斷點續傳:原理剖析與實戰指南

文件傳輸示意圖 一、斷點續傳的核心價值 1.1 大文件傳輸的痛點分析 網絡閃斷導致重復傳輸&#xff1a;平均重試3-5次。 傳輸進度不可回溯&#xff1a;用戶無法查看歷史進度。 帶寬利用率低下&#xff1a;每次中斷需從頭開始。 1.2 斷點續傳技術優勢 指標傳統傳輸斷點續傳…

升級 SAP S/4 HANA 之 EWM 攻略

目錄 簡介 知識點 數據遷移 簡介 倉庫管理&#xff0c;SAP 升級不管是否啟動 EWM 功能&#xff0c;評估 EWM 是必經之路&#xff0c;不僅是因為 EWM 是 SAP 主推的倉庫解決方案&#xff0c;更是其功能強大而便捷&#xff0c;不管是簡易倉庫、復雜倉庫、立體倉庫、高架倉庫、…

知識表示方法之六:過程表示法(Procedural Representation)

在人工智能的發展史中&#xff0c;關于知識的表示方法曾存在兩種不同的觀點。一種觀點認為知識主要是陳述性的&#xff0c;其表示方法應著重將其靜態特性&#xff0c;即事物的屬性以及事物間的關系表示出來&#xff0c;稱以這種觀點表示知識的方法為陳述式或說明式表示法&#…

綠色供應鏈管理體系認證:開啟企業可持續發展的綠色新篇章

在全球“雙碳”目標驅動下&#xff0c;綠色供應鏈管理已成為企業高質量發展的核心議題。據國際權威機構預測&#xff0c;到2030年&#xff0c;綠色供應鏈相關市場規模將突破萬億美元。在此背景下&#xff0c;綠色供應鏈管理體系認證不僅是企業合規的“通行證”&#xff0c;更是…

MATLAB如何打印一個桃心形狀

在MATLAB中打印一個桃心形狀&#xff0c;您可以使用繪圖函數來創建一個心形圖案。以下是一個簡單的例子&#xff0c;展示了如何使用MATLAB繪制一個心形&#xff1a; 定義心形的參數方程&#xff1a;心形可以通過一組參數方程來描述。 使用MATLAB的繪圖函數&#xff1a;plot函…

前端知識(vue3)

1.Vue3 1.1 介紹 Vue&#xff08;讀音 /vju?/, 類似于 view&#xff09;是一款用于構建用戶界面的漸進式的JavaScript框架 官網&#xff1a;https://cn.vuejs.org 1.2 常見指令 指令&#xff1a;指的是HTML 標簽上帶有 v- 前綴的特殊屬性&#xff0c;不同指令具有不同含義…

狀態機思想編程

1. LED流水燈的FPGA代碼 一個使用狀態機思想來實現LED流水燈的FPGA代碼 這個例子采用VHDL編寫 VHDL代碼示例&#xff1a; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;entity led_flowing isPort ( clk …

網絡安全小知識課堂(五)

病毒與蠕蟲&#xff1a;你的電腦為何會 “生病” 和 “傳染”&#xff1f; 引言 你是否見過這樣的場景&#xff1a;電腦突然彈窗廣告暴增&#xff0c;文件莫名消失&#xff0c;甚至整個公司網絡集體癱瘓&#xff1f;這些癥狀背后&#xff0c;可能是 ** 病毒&#xff08;Virus…

RVOS-1.環境搭建與系統引導

0.環境搭建 riscv-operating-system-mooc: 開放課程《循序漸進&#xff0c;學習開發一個 RISC-V 上的操作系統》配套教材代碼倉庫。 mirror to https://github.com/plctlab/riscv-operating-system-mooc 在 Ubuntu 20.04 以上環境下我們可以直接使用官方提供的 GNU工具鏈和 QEM…

UNet 改進(5):結合SE模塊提升圖像分割性能

U-Net是醫學圖像分割領域最成功的架構之一&#xff0c;其對稱的編碼器-解碼器結構和跳躍連接使其能夠有效捕捉多尺度特征。本文將解析一個改進版的U-Net實現&#xff0c;該版本通過引入Squeeze-and-Excitation(SE)模塊進一步提升了模型性能。 一、架構概覽 這個改進的U-Net保持…

機器人擰螺絲緊固裝配(Robot screw fastening assembly)

機器人擰螺絲緊固裝配技術正以其高精度、高效率和高靈活性&#xff0c;重塑著傳統制造業的生產范式。這項融合了機械臂定位、扭矩控制、視覺引導與數據分析的自動化解決方案&#xff0c;不僅將工人從重復性高強度勞動中解放出來&#xff0c;更通過實時數據反饋與精準執行&#…

圖像處理中的 Gaussina Blur 和 SIFT 算法

Gaussina Blur 高斯模糊 高斯模糊的數學定義 高斯模糊是通過 高斯核(Gaussian Kernel) 對圖像進行卷積操作實現的. 二維高斯函數定義為 G ( x , y , σ ) 1 2 π σ 2 e ? x 2 y 2 2 σ 2 G(x, y, \sigma) \frac{1}{2\pi \sigma^2} e^{-\frac{x^2 y^2}{2\sigma^2}} G(x…

在Unity中實現《幽靈行者》風格的跑酷動作

基礎設置 角色控制器選擇&#xff1a; 使用Character Controller組件或Rigidbody Capsule Collider 推薦使用Character Controller以獲得更精確的運動控制 輸入系統&#xff1a; 使用Unity的新輸入系統(Input System Package)處理玩家輸入 滑鏟實現 public class Slide…

青蛙吃蟲--dp

1.dp數組有關元素--路長和次數 2.遞推公式 3.遍歷順序--最終影響的是路長&#xff0c;在外面 其次次數遍歷&#xff0c;即這次路長所有情況都更新 最后&#xff0c;遍歷次數自然就要遍歷跳長 4.max時時更新 dp版本 #include<bits/stdc.h> using namespace std; #def…

Tiktok 關鍵字 視頻及評論信息爬蟲(2) [2025.04.07]

&#x1f64b;?♀?Tiktok APP的基于關鍵字檢索的視頻及評論信息爬蟲共分為兩期&#xff0c;希望對大家有所幫助。 第一期&#xff1a;基于關鍵字檢索的視頻信息爬取 第二期見下文。 1.Node.js環境配置 首先配置 JavaScript 運行環境&#xff08;如 Node.js&#xff09;&…

Matlab繪圖—‘‘錯誤使用 plot輸入參數的數目不足‘‘

原因1&#xff1a; ?? 文件列名不是合法變量名 在excel中數據列名稱為Sample:float,將:刪除就解決了

Kotlin問題匯總

Kotlin問題匯總 真機安裝調試 查看真機的Android版本&#xff0c;將build.gradle文件中的minSdk改為手機的Android版本&#xff0c;點Sync Now更新設置 apk安裝失敗 在gradle.properties全局配置中設置android.injected.testOnlyfalse Unresolved reference: 在activity_…