0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你懂精通STM32的含金量嗎?

云深之無跡 ? 來源:云深之無跡 ? 2023-04-19 09:13 ? 次閱讀

你懂精通ARM的含金量嗎?你懂精通STM32的含金量嗎?不管懂不懂都要懂,趕緊學(xué)。

bc3e3d64-de2c-11ed-bfe3-dac502259ad0.png

這是它的電源系統(tǒng),下面會說這些引腳的作用

在STM32單片機中,每個寄存器都有一個獨特的地址,這些地址是在芯片的數(shù)據(jù)手冊中定義的。地址偏移是指每個寄存器的地址相對于其所在寄存器組的基地址的偏移量。

bc68f6e4-de2c-11ed-bfe3-dac502259ad0.png

在這里,每一個寄存器都有便宜的地址

例如,在STM32F407VG芯片中,GPIOB寄存器組的基地址為0x40020400。在這個寄存器組中,每個GPIOB端口的控制寄存器的地址偏移量是0x00、0x04、0x08、0x0C等。這意味著,如果您想訪問GPIOB的第一個端口(PB0),則可以通過將地址偏移量0x00添加到GPIOB基地址(0x40020400)來訪問它,即0x40020400 + 0x00 = 0x40020400。

在STM32中,使用寄存器地址偏移來訪問和控制特定寄存器,這可以通過指針操作和位域操作等方式來實現(xiàn)。需要注意的是,對于不同的芯片型號和不同的寄存器組,其基地址和偏移量可能會有所不同。

在STM32單片機中,每個寄存器都有一個復(fù)位值(也稱為默認值或初始值),這是當單片機復(fù)位時寄存器將被初始化為的值。復(fù)位值是在芯片的數(shù)據(jù)手冊中定義的。

大多數(shù)寄存器的復(fù)位值都是0或某些特定的值,例如控制寄存器的復(fù)位值通常是0x0000或0x0001。

在單片機初始化過程中,為了確保寄存器處于正確的狀態(tài),需要將所有寄存器設(shè)置為其復(fù)位值。這可以通過在啟動代碼中執(zhí)行清零操作或者使用STM32提供的庫函數(shù)來實現(xiàn)。

一字節(jié)是計算機存儲中的基本單位之一,通常包含8個比特(bit),每個比特只能表示0或1兩種狀態(tài)。在計算機中,一字節(jié)通常用于存儲一個字符或者一個整數(shù)等數(shù)據(jù)。

在二進制表示中,一字節(jié)的取值范圍是0~255(即00000000~11111111),因為它可以用8個比特組合出256種不同的狀態(tài),其中一個狀態(tài)用于表示0。

一字節(jié)的大小在不同的計算機架構(gòu)中可能會有所不同,但是在大多數(shù)計算機中,一字節(jié)都被定義為8個比特。此外,一些特殊的系統(tǒng)中,字節(jié)大小可能是其他值,如10比特或12比特。

一比特(bit)是計算機存儲和通信中最小的數(shù)據(jù)單位,它只能表示0或1兩種狀態(tài)。比特通常用于表示二進制數(shù)據(jù),在計算機中被廣泛應(yīng)用于數(shù)字電路和通信領(lǐng)域。

在二進制表示中,一個比特的取值范圍是0或1,其中0表示低電平(或者“假”),1表示高電平(或者“真”)。比特的狀態(tài)可以表示一位二進制數(shù)中的一位,因此8個比特組合起來可以表示一個字節(jié),即一個8位的二進制數(shù)。

比特在計算機中有著廣泛的應(yīng)用,例如存儲器單元中的存儲單元就是由比特組成的,CPU中的寄存器也是由多個比特組合而成的。在通信領(lǐng)域,比特是衡量數(shù)據(jù)傳輸速率的單位,例如“1Mbps”表示每秒傳輸100萬個比特。

這里寫的就是上面的電源引腳,為什么在認知中簡單的+,-兩個而已,現(xiàn)在出來這么多腳?

Vdd和Vss是電子元器件中常用的術(shù)語,它們分別代表電路的正電源和負電源。

Vdd是指電路中的正電源,通常表示為Vcc,它為電路提供正電壓,使電路中的器件工作。在數(shù)字電路中,Vdd通常為邏輯1的電壓值,而在模擬電路中,Vdd通常為固定的直流電壓源。

Vss是指電路中的負電源,也稱為地線或接地線,通常表示為GND。Vss提供電路中的器件所需的負電壓,以確保電路正常工作。在數(shù)字電路中,Vss通常為邏輯0的電壓值,而在模擬電路中,Vss通常為固定的零電位或接地。

Vdd和Vss是電子電路中最基本的兩個電源,電路中的其他信號、電壓和電流都是基于這兩個電源的。

Vdda是指模擬電路中的電源,通常用于提供模擬信號的參考電壓。Vdda通常表示為VddA,與數(shù)字電路中的Vdd不同,Vdda通常為模擬電路所需的電壓值,通常比數(shù)字電路中的Vdd更為精確和穩(wěn)定。

Vdda通常用于ADC模數(shù)轉(zhuǎn)換器)和DAC數(shù)模轉(zhuǎn)換器)等模擬電路中。在ADC中,Vdda是參考電壓,用于將模擬信號轉(zhuǎn)換為數(shù)字信號。在DAC中,Vdda是數(shù)字信號轉(zhuǎn)換為模擬信號時使用的參考電壓。

與數(shù)字電路中的Vdd相比,Vdda的電壓值通常要求更為精確和穩(wěn)定,以確保模擬電路中的信號質(zhì)量。

Vdd是指數(shù)字電路中的正電源,通常表示為Vcc,它為電路提供正電壓,使電路中的器件工作。在數(shù)字電路中,Vdd通常為邏輯1的電壓值。

Vdd電源通常用于數(shù)字邏輯電路中,例如微處理器、存儲器、計數(shù)器等。Vdd的電壓值取決于具體的器件要求和應(yīng)用場景,通常在2V到5V之間,也有些器件需要更高的電壓值。

在數(shù)字電路中,Vdd電源的穩(wěn)定性和可靠性非常重要,如果Vdd電壓不穩(wěn)定或存在波動,可能會導(dǎo)致電路運行不穩(wěn)定或出現(xiàn)錯誤。因此,在數(shù)字電路設(shè)計中,通常需要使用穩(wěn)壓電路或者其他電源管理技術(shù)來確保Vdd電壓的穩(wěn)定性和可靠性,以保證電路的正常工作。

Vssa是指模擬電路中的負電源,通常表示為VssA,它為模擬電路中的器件提供負電壓,以確保模擬電路的正常工作。Vssa通常用于模擬信號的處理和放大等模擬電路中。

與數(shù)字電路中的Vss不同,Vssa通常需要比Vss更為精確和穩(wěn)定,以確保模擬電路中的信號質(zhì)量。在實際應(yīng)用中,通常需要使用高精度電源管理電路或其他電源穩(wěn)定技術(shù)來確保Vssa的穩(wěn)定性和可靠性,以確保模擬電路的正常工作。

需要注意的是,Vssa和VddA通常是相對于某個參考電位(通常是地線)而言的,它們之間的電壓差通常稱為模擬電源電壓。

bc865a2c-de2c-11ed-bfe3-dac502259ad0.png

這個簡單,就是CubuMX的

在 STM32 數(shù)據(jù)手冊中,寄存器的訪問選項通常包括以下內(nèi)容:

讀/寫權(quán)限:指示寄存器是否可讀、可寫或既可讀又可寫。

寄存器地址:指示寄存器在芯片內(nèi)存映射中的地址。

寄存器位域:對于一些特殊的寄存器,可能會將其分為幾個位域來表示不同的控制或狀態(tài)信息。

復(fù)位值:指示寄存器在復(fù)位時的初始值。

等待周期:指示在對該寄存器進行讀/寫操作時需要等待多長時間才能獲得結(jié)果。在一些情況下,需要等待芯片內(nèi)部的一些操作完成后才能獲得正確的結(jié)果,因此需要等待周期。

等待周期是指訪問某些寄存器需要等待芯片內(nèi)部操作完成的時間,通常稱為訪問延遲。在進行某些特殊操作時,需要等待周期才能確保數(shù)據(jù)的正確性。在進行讀取操作時,等待周期可能包括寄存器響應(yīng)時間、總線傳輸時間等等,具體時間可能會因為系統(tǒng)的配置和芯片的類型而有所不同。

微控制器中,有時需要對存儲器進行不同粒度的讀寫操作,字節(jié)(Byte)、半字(Half Word)和字(Word)是三種常見的數(shù)據(jù)粒度,它們分別表示存儲器中的不同位數(shù)。具體含義如下:

字節(jié)(Byte):是存儲器中的最小單元,通常表示為8位二進制數(shù)。字節(jié)可存儲0-255的無符號整數(shù),或者-128到127的有符號整數(shù)。字節(jié)訪問意味著每次訪問一個字節(jié)。

半字(Half Word):是由兩個連續(xù)的字節(jié)組成,通常表示為16位二進制數(shù)。半字可存儲0-65535的無符號整數(shù),或者-32768到32767的有符號整數(shù)。半字訪問意味著每次訪問兩個字節(jié)。

字(Word):是由四個連續(xù)的字節(jié)組成,通常表示為32位二進制數(shù)。字可存儲0-4294967295的無符號整數(shù),或者-2147483648到2147483647的有符號整數(shù)。字訪問意味著每次訪問四個字節(jié)。

在STM32微控制器中,為了支持不同粒度的讀寫操作,一些寄存器和存儲器區(qū)域提供了不同的訪問選項,例如:

8位字節(jié)訪問(BYTE):每次訪問8位(1個字節(jié))的數(shù)據(jù)。

16位半字訪問(HALFWORD):每次訪問16位(2個字節(jié))的數(shù)據(jù)。

32位字訪問(WORD):每次訪問32位(4個字節(jié))的數(shù)據(jù)。

在 STM32 微控制器中,系統(tǒng)時鐘和外設(shè)時鐘都是由一個基礎(chǔ)時鐘源衍生出來的,對于 STM32 系列微控制器而言,通常都是使用內(nèi)部的 RC 振蕩器或者外部的晶體振蕩器作為基礎(chǔ)時鐘源。

時鐘中斷寄存器是一類特殊的寄存器,用于配置 STM32 微控制器中的時鐘中斷。時鐘中斷是指在系統(tǒng)時鐘或者外設(shè)時鐘到達某個特定時間或者計數(shù)值時產(chǎn)生的一種中斷信號,用于觸發(fā)某些特定的操作或者執(zhí)行周期性的任務(wù)。

STM32 微控制器中的時鐘中斷寄存器通常包括以下內(nèi)容:

時鐘控制寄存器:用于配置時鐘的各種參數(shù),例如時鐘源選擇、時鐘分頻系數(shù)、時鐘計數(shù)器等等。

中斷控制寄存器:用于配置時鐘中斷的觸發(fā)條件和中斷優(yōu)先級等參數(shù)。

中斷狀態(tài)寄存器:用于記錄當前是否有時鐘中斷發(fā)生,并且可以清除中斷標志位。

在 STM32 微控制器中,不同的系列和型號會有不同的時鐘中斷寄存器,具體的使用方法和配置參數(shù)需要根據(jù)具體的型號和應(yīng)用場景進行選擇和調(diào)整。

bca0ce3e-de2c-11ed-bfe3-dac502259ad0.png

復(fù)位電路

bcc11a2c-de2c-11ed-bfe3-dac502259ad0.png

時鐘樹在面試的時候也會問,這個其實就是多看看就好了

bcf56d4a-de2c-11ed-bfe3-dac502259ad0.png

在HSE時鐘上面的晶振如何接

bd24ce14-de2c-11ed-bfe3-dac502259ad0.png

在MX上面生成調(diào)試的時候,需要選擇這個

bd39305c-de2c-11ed-bfe3-dac502259ad0.png

會有默認的引腳來啟用

bd5e9f68-de2c-11ed-bfe3-dac502259ad0.png

可以選擇一個IIC

bd780afc-de2c-11ed-bfe3-dac502259ad0.png

下面是具體的一些功能,可以去設(shè)置,在代碼中有體現(xiàn)

bd96561a-de2c-11ed-bfe3-dac502259ad0.png

IIC默認開啟的是這兩個引腳

bdb61e46-de2c-11ed-bfe3-dac502259ad0.png

有時候引腳之間是互相沖突的

bdd7120e-de2c-11ed-bfe3-dac502259ad0.png

可以試試UART

bdf09044-de2c-11ed-bfe3-dac502259ad0.png

硬件外設(shè)就直接打開

be0d0abc-de2c-11ed-bfe3-dac502259ad0.png

這些是串口的常見設(shè)置

be28c022-de2c-11ed-bfe3-dac502259ad0.png

你可以點右邊來設(shè)置精確的功能

be583d02-de2c-11ed-bfe3-dac502259ad0.png

在這里被設(shè)置

be92954c-de2c-11ed-bfe3-dac502259ad0.png

當然DMA如果要開啟的時候也是可以的

bec1add2-de2c-11ed-bfe3-dac502259ad0.png

時鐘

bee17ea0-de2c-11ed-bfe3-dac502259ad0.png

這是一些設(shè)置

bf073d02-de2c-11ed-bfe3-dac502259ad0.png

為每個外設(shè)生成H,C

bf3321f6-de2c-11ed-bfe3-dac502259ad0.png

也可以選取LL低級性能庫

bf5910aa-de2c-11ed-bfe3-dac502259ad0.png

第一次找到這個功能,好像是打開回調(diào)

bf7b2154-de2c-11ed-bfe3-dac502259ad0.png

bf9fa9c0-de2c-11ed-bfe3-dac502259ad0.png

代碼在之間

bfb9a3de-de2c-11ed-bfe3-dac502259ad0.png

這個就是生成的函數(shù)

bfdfc424-de2c-11ed-bfe3-dac502259ad0.png

里面的中斷函數(shù)

c0107c4a-de2c-11ed-bfe3-dac502259ad0.png

IO腳的設(shè)置自己看嘛

c03fdeae-de2c-11ed-bfe3-dac502259ad0.png

4部分

c078f5ea-de2c-11ed-bfe3-dac502259ad0.png

01控制

c096e1e0-de2c-11ed-bfe3-dac502259ad0.png

速度控制,說了100遍

c0b62a46-de2c-11ed-bfe3-dac502259ad0.png

也可以選擇JTAG

c0d12f3a-de2c-11ed-bfe3-dac502259ad0.png

默認復(fù)位的功能

c0f141bc-de2c-11ed-bfe3-dac502259ad0.png

一次用4個線,不配了

c10ebecc-de2c-11ed-bfe3-dac502259ad0.png

引腳的配置

c13a0e60-de2c-11ed-bfe3-dac502259ad0.png

自己看

c1701618-de2c-11ed-bfe3-dac502259ad0.png

輸入模式

在 STM32 微控制器中,APB2(Advanced Peripheral Bus 2)是一個高速外設(shè)總線,它連接了一些重要的外設(shè)模塊,例如定時器、串行通信接口、通用串行總線控制器等等。APB2 的時鐘頻率可以通過時鐘樹的分頻器進行配置,因此可以實現(xiàn)不同外設(shè)模塊之間的時序控制和數(shù)據(jù)交換。

STM32 APB2 外設(shè)包括但不限于以下幾個:

定時器:STM32 微控制器中有多種不同類型的定時器,包括基本定時器、通用定時器、高級定時器等等,這些定時器可以用于產(chǎn)生各種精度和周期的定時器中斷,同時還支持 PWM 信號輸出、脈沖計數(shù)等功能。

串行通信接口:STM32微控制器中支持多種不同的串行通信協(xié)議,包括 UART、SPI、I2C等等,這些外設(shè)模塊可以實現(xiàn)與其他設(shè)備的數(shù)據(jù)通信和控制。

通用串行總線控制器:STM32 微控制器中的通用串行總線控制器(USB OTG FS)是一種高速的通用串行總線接口,可以實現(xiàn)與 USB 設(shè)備的通信和數(shù)據(jù)傳輸。

ADC:STM32 微控制器中的 ADC(模數(shù)轉(zhuǎn)換器)可以用于采集模擬信號并將其轉(zhuǎn)換為數(shù)字信號,提供多種不同的采樣率和分辨率選擇。

DMA:STM32 微控制器中的 DMA(直接存儲器訪問)模塊可以實現(xiàn)高效的數(shù)據(jù)傳輸和數(shù)據(jù)存儲,同時也可以降低 CPU 的負載,提高系統(tǒng)性能。

在STM32中,APB2是高速外設(shè)總線,例如SPI、I2S、USART、ADC等,其時鐘頻率通常比APB1和AHB總線更高。在每個APB2時鐘上采樣指的是在APB2時鐘周期內(nèi)對某個外設(shè)進行多次采樣以提高采樣精度和減小采樣誤差的技術(shù)。

例如,在使用STM32的ADC(模數(shù)轉(zhuǎn)換器)時,可以選擇在每個APB2時鐘上采樣來提高轉(zhuǎn)換精度。這樣做的好處是可以將ADC的采樣周期與APB2總線的時鐘同步,提高ADC采樣率,減小噪聲和抖動對采樣的影響,從而提高系統(tǒng)的性能和穩(wěn)定性。

在STM32中,IRQ是指中斷請求(Interrupt Request)。它是一種特殊的處理器信號,用于通知CPU有重要的事件需要立即處理。當一個中斷事件被觸發(fā)時,它會向處理器發(fā)出IRQ信號,將處理器從正常的程序執(zhí)行中打斷,轉(zhuǎn)而執(zhí)行預(yù)定義的中斷服務(wù)程序(ISR)來處理中斷事件。

STM32芯片具有許多外設(shè)(例如定時器、串口、ADC等),這些外設(shè)可以通過配置相應(yīng)的中斷請求(IRQ)來實現(xiàn)異步事件的處理。當外設(shè)產(chǎn)生了預(yù)定義的事件(例如定時器計數(shù)器溢出、串口接收數(shù)據(jù)等)時,它會自動向中斷控制器發(fā)出IRQ信號,觸發(fā)中斷請求,并使得CPU暫時停止執(zhí)行正在運行的程序,轉(zhuǎn)而執(zhí)行相應(yīng)的中斷服務(wù)程序來處理該事件。

在STM32中,IRQ信號由中斷控制器(NVIC,Nested Vector Interrupt Controller)進行管理和分配,它可以對外設(shè)產(chǎn)生的不同類型的中斷請求進行優(yōu)先級排序和處理。

異步編程是一種編程模型,它不依賴于線程的同步和阻塞等機制,而是通過回調(diào)函數(shù)、事件驅(qū)動等方式來實現(xiàn)代碼的非阻塞執(zhí)行,從而提高系統(tǒng)的并發(fā)性能和響應(yīng)速度。

異步編程通常涉及到異步操作和異步實踐兩個概念。

異步操作指的是一種不會阻塞當前線程的操作,例如IO操作、網(wǎng)絡(luò)請求等。異步操作一般是通過異步函數(shù)或異步API來實現(xiàn)的,它們通常會在后臺啟動一個或多個線程或進程來處理請求,從而避免當前線程被阻塞。異步操作通常會在完成后觸發(fā)一個事件或回調(diào)函數(shù),通知應(yīng)用程序異步操作已經(jīng)完成,并將操作結(jié)果傳遞給應(yīng)用程序。

異步實踐指的是使用異步編程模型來優(yōu)化系統(tǒng)性能和響應(yīng)速度的一系列技術(shù)和方法。異步實踐的核心思想是將那些可能導(dǎo)致阻塞的操作(例如IO操作、數(shù)據(jù)庫訪問等)轉(zhuǎn)換為異步操作,以保證系統(tǒng)的高并發(fā)性能和響應(yīng)速度。異步實踐還包括一些常見的技術(shù)和方法,例如使用事件驅(qū)動、異步回調(diào)、異步消息隊列等,來實現(xiàn)代碼的異步執(zhí)行和解耦合。

嵌入式開發(fā)中,異步實踐也非常重要。例如,使用STM32等微控制器進行嵌入式開發(fā)時,可以使用異步編程模型和異步實踐技術(shù)來實現(xiàn)對外設(shè)的異步控制和數(shù)據(jù)采集等功能,從而提高系統(tǒng)的性能和可靠性。

1.使用異步函數(shù)或異步API:嵌入式系統(tǒng)中的許多操作都是耗時的,例如IO操作、網(wǎng)絡(luò)通信等,如果使用同步方式進行處理,會導(dǎo)致當前線程被阻塞,影響系統(tǒng)的響應(yīng)速度。因此,在嵌入式系統(tǒng)中,通常使用異步函數(shù)或異步API來實現(xiàn)這些操作。異步函數(shù)或API會在后臺啟動一個或多個線程或任務(wù)來處理請求,從而避免當前線程被阻塞,同時也可以提高系統(tǒng)的并發(fā)性能和響應(yīng)速度。

2.使用中斷機制:嵌入式系統(tǒng)中,許多操作都是通過中斷機制來實現(xiàn)的,例如定時器中斷、外部中斷等。使用中斷機制可以使得系統(tǒng)不必等待某些操作的完成,而是在該操作完成時自動觸發(fā)中斷處理程序,從而實現(xiàn)異步處理。

3.使用事件驅(qū)動模型:事件驅(qū)動模型是一種基于事件和回調(diào)函數(shù)的編程模型,它通過監(jiān)聽特定的事件來觸發(fā)對應(yīng)的回調(diào)函數(shù)。在嵌入式系統(tǒng)中,事件驅(qū)動模型可以用來實現(xiàn)異步操作的回調(diào)函數(shù)。例如,在處理串口通信時,可以使用事件驅(qū)動模型監(jiān)聽串口接收數(shù)據(jù)的事件,并在數(shù)據(jù)到達時觸發(fā)對應(yīng)的回調(diào)函數(shù)進行數(shù)據(jù)處理。

4.使用消息隊列:消息隊列是一種將消息異步傳遞給消費者的機制。在嵌入式系統(tǒng)中,可以使用消息隊列來實現(xiàn)異步任務(wù)的處理。例如,在處理圖像識別時,可以使用消息隊列來異步處理圖像數(shù)據(jù),從而避免阻塞當前任務(wù)的執(zhí)行。

引腳的開漏模式是指在輸出電平時,將該引腳連接的晶體管的源極或發(fā)射極與地相連,使得該引腳的輸出電平只能為低電平(0V)或高阻態(tài)(電阻很大,相當于沒有連接)。開漏模式的引腳通常被稱為開漏輸出引腳。

在開漏模式下,輸出引腳不會直接提供高電平的輸出,而是通過連接一個上拉電阻或使用內(nèi)部上拉電阻來實現(xiàn)。上拉電阻的值通常很大,因此在輸出高電平時,輸出電平可能不穩(wěn)定,容易受到外部干擾的影響。

開漏模式的引腳通常用于控制外部電路中的開關(guān)元件(例如晶體管、繼電器等),以及驅(qū)動I2C總線等外部設(shè)備。在這些場景中,開漏模式的引腳可以通過控制開關(guān)元件的導(dǎo)通和斷開來實現(xiàn)對外部設(shè)備的控制,同時也可以避免由于外部設(shè)備的反向電流等問題對系統(tǒng)的損害。

需要注意的是,開漏模式的引腳在輸出高電平時不能直接驅(qū)動負載,需要通過使用外部上拉電阻或使用內(nèi)部上拉電阻來實現(xiàn),同時在設(shè)計電路時需要考慮到該引腳的輸出電流和負載電流的匹配,以避免對系統(tǒng)的損害。

引腳的推挽模式是指在輸出電平時,將該引腳連接的晶體管的源極或發(fā)射極與電源相連,使得該引腳的輸出電平可以為高電平(電源電壓)或低電平(0V)。推挽模式的引腳通常被稱為推挽輸出引腳。

在推挽模式下,輸出引腳可以直接提供高電平和低電平的輸出,并且輸出電流通常比較大,可以直接驅(qū)動一定的負載電流。

推挽模式的引腳通常用于控制外部電路中的驅(qū)動元件(例如LED、直流電機等),以及驅(qū)動SPI總線等外部設(shè)備。在這些場景中,推挽模式的引腳可以通過控制驅(qū)動元件的導(dǎo)通和斷開來實現(xiàn)對外部設(shè)備的控制,同時也可以提供較大的輸出電流以驅(qū)動負載電流。

需要注意的是,在推挽模式下,引腳的輸出電平不能為高阻態(tài),需要確保連接的晶體管在輸出低電平時處于關(guān)閉狀態(tài),否則可能導(dǎo)致電路不穩(wěn)定或電路損壞。

相同點:

都可以作為引腳的輸出模式,輸出高電平和低電平的電壓信號;

都可以用來控制外部電路中的驅(qū)動元件,例如LED、直流電機等。

不同點:

開漏模式的引腳輸出電平只能為低電平或高阻態(tài),需要通過上拉電阻來實現(xiàn)高電平的輸出;推挽模式的引腳輸出電平可以為低電平或高電平;

推挽模式的引腳具有較大的輸出電流能力,可以直接驅(qū)動負載電流,而開漏模式的引腳需要通過上拉電阻來驅(qū)動負載電流;

開漏模式的引腳通常用于控制外部電路中的開關(guān)元件(例如晶體管、繼電器等),以及驅(qū)動I2C總線等外部設(shè)備;而推挽模式的引腳通常用于控制外部電路中的驅(qū)動元件(例如LED、直流電機等),以及驅(qū)動SPI總線等外部設(shè)備。

推挽模式的引腳適合需要較大輸出電流的場景,例如驅(qū)動LED、直流電機等負載,同時也適合驅(qū)動SPI總線等外部設(shè)備;

開漏模式的引腳適合需要通過控制開關(guān)元件的導(dǎo)通和斷開來實現(xiàn)控制的場景,例如驅(qū)動I2C總線等外部設(shè)備。

當外設(shè)模塊需要從CPU讀取數(shù)據(jù)時,它需要按照APB2總線時鐘的節(jié)奏來發(fā)送讀取請求,并在每個APB2時鐘周期中傳輸一個數(shù)據(jù)位,直到所有數(shù)據(jù)都被讀取完畢為止。

施密特觸發(fā)輸入是一種常見的數(shù)字電路輸入技術(shù),也被稱為施密特觸發(fā)器輸入或雙穩(wěn)態(tài)輸入。施密特觸發(fā)輸入通過特殊的電路設(shè)計,能夠使輸入信號的干擾和抖動不會輕易導(dǎo)致輸出信號的誤判或不穩(wěn)定。

施密特觸發(fā)輸入的基本原理是在輸入信號的電壓上下閾值范圍內(nèi),輸出信號維持穩(wěn)定的高或低電平;而當輸入信號超過一定的閾值范圍時,輸出信號則發(fā)生明顯的翻轉(zhuǎn),并維持到輸入信號回到另一個閾值范圍時才再次翻轉(zhuǎn)。這種特性可以有效地防止輸入信號的干擾和抖動導(dǎo)致輸出信號的誤判或不穩(wěn)定。

施密特觸發(fā)輸入常見的應(yīng)用場景包括數(shù)字信號的輸入、信號的去抖動處理、信號的濾波處理等。在數(shù)字電路的設(shè)計和實現(xiàn)中,施密特觸發(fā)輸入可以提高電路的抗干擾能力和穩(wěn)定性,從而提高數(shù)字系統(tǒng)的性能和可靠性。

P-MOS

P-MOS是一種由p型半導(dǎo)體材料制成的MOSFET晶體管,其控制方式是通過在柵極和源極之間施加負電壓來控制晶體管的導(dǎo)通狀態(tài)。當柵極電壓低于源極電壓時,P-MOS導(dǎo)通;當柵極電壓高于源極電壓時,P-MOS截止。P-MOS的導(dǎo)通電阻相對較大,通常用于高電平驅(qū)動電路中。

N-MOS

N-MOS是一種由n型半導(dǎo)體材料制成的MOSFET晶體管,其控制方式是通過在柵極和源極之間施加正電壓來控制晶體管的導(dǎo)通狀態(tài)。當柵極電壓高于源極電壓時,N-MOS導(dǎo)通;當柵極電壓低于源極電壓時,N-MOS截止。N-MOS的導(dǎo)通電阻相對較小,通常用于低電平驅(qū)動電路中。

弱上拉是指在輸入端口(比如微控制器的GPIO口)上通過加入一個大約為10kΩ的電阻,從而使該輸入端口與VCC(正電源)之間形成一個電阻分壓網(wǎng)絡(luò),從而使輸入端口的電壓在沒有外部信號的情況下趨向于高電平,即被上拉到VCC電平。

弱上拉的作用在于,當沒有外部信號輸入時,輸入端口會被保持在一個已知的狀態(tài),從而有效地避免了輸入端口因為外部信號干擾而導(dǎo)致的錯誤輸入。同時,在需要對輸入端口進行讀取的時候,由于弱上拉電阻的存在,輸入端口的狀態(tài)可以更容易地被檢測到。

我們其實就是操作IO的輸出和輸入,各種功能到底怎么樣的配置?

c1952f3e-de2c-11ed-bfe3-dac502259ad0.pngc1b88646-de2c-11ed-bfe3-dac502259ad0.png

這么多的定時器,讓我來給大家寫一寫

STM32定時器的輸入捕獲功能可以用來測量外部信號的時間間隔、頻率和脈寬等信息,常用于測量脈沖信號、編碼器信號、PWM信號等。

具體實現(xiàn)步驟如下:

配置定時器為輸入捕獲模式。

配置定時器的輸入捕獲通道,選擇輸入捕獲邊沿(上升沿或下降沿)觸發(fā)測量。

在輸入捕獲中斷服務(wù)函數(shù)中讀取捕獲寄存器的值,計算出測量值。

根據(jù)需要,可以通過中斷或DMA方式進行多次測量,并對測量結(jié)果進行平均值計算等處理。

下面是一個基于STM32 HAL庫的輸入捕獲示例代碼,以測量外部脈沖信號的周期和脈寬為例:

#include "stm32f4xx_hal.h"


TIM_HandleTypeDef htim2;
uint32_t pulse_width = 0;
uint32_t period = 0;


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        static uint32_t last_capture = 0;
        uint32_t capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        uint32_t diff = capture - last_capture;
        last_capture = capture;
        
        if (diff > 0) {
            period = diff;
        } else {
            pulse_width = -diff;
        }
    }
}


int main(void)
{
    HAL_Init();
    __HAL_RCC_TIM2_CLK_ENABLE();
    
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 83; // 84MHz / 84 = 1MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 0xFFFF;
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_IC_Init(&htim2);


    TIM_IC_InitTypeDef sConfigIC;
    sConfigIC.ICPolarity = TIM_ICPOLARITY_BOTHEDGE;
    sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
    sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
    sConfigIC.ICFilter = 0;
    HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);


    HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);


    while (1)
    {
        // do something
    }
}

在上述代碼中,使用了TIM2定時器的通道1進行輸入捕獲,并開啟了中斷模式(HAL_TIM_IC_Start_IT函數(shù))。在輸入捕獲中斷服務(wù)函數(shù)中,計算出上一次和本次捕獲的時間差,根據(jù)時間差的正負值來區(qū)分計算周期還是脈寬,最終得到測量結(jié)果。

STM32定時器的輸出比較功能可以用來生成PWM波形、產(chǎn)生觸發(fā)信號、實現(xiàn)周期性的定時器中斷等。其實現(xiàn)步驟如下:

配置定時器為輸出比較模式,并選擇輸出比較通道。

配置定時器的時基參數(shù),包括計數(shù)器的時鐘頻率、計數(shù)器的計數(shù)范圍等。

配置輸出比較模式下的通道參數(shù),包括輸出模式(比較輸出或PWM輸出)、比較值等。

啟動定時器,使其開始計數(shù)并產(chǎn)生輸出信號。

下面是一個基于STM32 HAL庫的輸出比較示例代碼,以生成50%占空比、1kHz的PWM信號為例:

#include "stm32f4xx_hal.h"


TIM_HandleTypeDef htim2;


void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if (htim->Instance == TIM2)
    {
        __HAL_RCC_TIM2_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();


        GPIO_InitStruct.Pin = GPIO_PIN_5;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
}


void MX_TIM2_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};


    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 83; // 84MHz / 84 = 1MHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim2.Init.Period = 999; // 1kHz PWM
    htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim2);


    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);


    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);


    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 499; // 50% duty cycle
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
}


int main(void)
{
    HAL_Init();
    MX_TIM2_Init();
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
    
    while (1)
    {
        // do something
    }
}

STM32定時器的互補輸出功能可以用來實現(xiàn)半橋或全橋逆變器、電機驅(qū)動器等應(yīng)用。它通過在同一個定時器中同時配置兩個輸出比較通道,一個通道輸出高電平,另一個通道輸出低電平,以實現(xiàn)互補輸出的功能。

下面是一個基于STM32HAL庫的互補輸出示例代碼,以實現(xiàn)半橋逆變器為例:

#include "stm32f4xx_hal.h"


TIM_HandleTypeDef htim1;


void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if (htim->Instance == TIM1)
    {
        __HAL_RCC_TIM1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_GPIOE_CLK_ENABLE();


        GPIO_InitStruct.Pin = GPIO_PIN_8;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


        GPIO_InitStruct.Pin = GPIO_PIN_13;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
    }
}


void MX_TIM1_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};


    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 839; // 84MHz / 840 = 100kHz
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 9999; // 10Hz PWM
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 1; // 2 channels, repetition count = 1
    HAL_TIM_PWM_Init(&htim1);


    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);


    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);


    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 4999; // 50% duty cycle
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);


    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
}


int main(void)
{
    HAL_Init();
    MX_TIM1_Init();
    
    while (1)
    {
}
}

STM32定時器的剎車輸入是用于實現(xiàn)電機或馬達控制器的緊急停止或剎車功能。當剎車輸入信號被觸發(fā)時,定時器立即停止計數(shù),并且輸出保持在一個預(yù)定義的狀態(tài)(例如輸出低電平或高電平)。在應(yīng)用中,剎車輸入通常是由硬件電路(如電機控制器)提供的。

STM32定時器的剎車輸入通常與定時器的輸入捕獲或輸出比較功能結(jié)合使用。例如,在一個三相電機驅(qū)動器中,定時器的輸入捕獲功能用于捕獲電機轉(zhuǎn)速,輸出比較功能用于產(chǎn)生PWM波形驅(qū)動電機,而剎車輸入則用于實現(xiàn)急停功能。

下面是一個基于STM32 HAL庫的剎車輸入示例代碼:

#include "stm32f4xx_hal.h"


TIM_HandleTypeDef htim1;


void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if (htim->Instance == TIM1)
    {
        __HAL_RCC_TIM1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();


        GPIO_InitStruct.Pin = GPIO_PIN_8;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }
}


void MX_TIM1_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};


    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 839; // 84MHz / 840 = 100kHz
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 999; // 1kHz PWM
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim1);


    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);


    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);


    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 499; // 50% duty cycle
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);


    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}


int main(void)
{
    HAL_Init();
    MX_TIM1_Init();
    
    while (1)
    {
        // Main loop
    }
}


void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        // Handle PWM pulse finished event
    }
}

STM32定時器的外部觸發(fā)時鐘輸入是一種使定時器以外部信號作為計數(shù)時鐘的功能。它允許定時器在外部觸發(fā)信號到來時開始計數(shù),并且不依賴于內(nèi)部時鐘。這種功能常用于需要精確時間測量或同步的應(yīng)用,如數(shù)據(jù)采集、PWM控制和通信接口等。

STM32定時器的外部觸發(fā)時鐘輸入可通過使用TIMx_ETR (外部觸發(fā)器)引腳來實現(xiàn)。在應(yīng)用中,可以選擇使用外部觸發(fā)器引腳(例如TIM1_ETR),然后使用寄存器配置定時器的觸發(fā)模式和觸發(fā)源。

下面是一個基于STM32 HAL庫的外部觸發(fā)時鐘輸入示例代碼:

#include "stm32f4xx_hal.h"


TIM_HandleTypeDef htim1;


void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        __HAL_RCC_TIM1_CLK_ENABLE();
    }
}


void MX_TIM1_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};


    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 8399; // 84MHz / 8400 = 10kHz
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 999; // 10Hz timer
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_Base_Init(&htim1);


    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
    sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
    sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
    sClockSourceConfig.ClockFilter = 0;
    HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);


    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);


    HAL_TIM_Base_Start(&htim1);
}


int main(void)
{
    HAL_Init();
    MX_TIM1_Init();


    while (1)
    {
        // Main loop
    }
}

TM32定時器是一種用于計時和控制輸出信號的硬件模塊,它具有多種功能和操作模式。STM32定時器的原理是利用一個計數(shù)器(Counter)來計數(shù),當計數(shù)器的值達到某個閾值時,就會產(chǎn)生一個中斷或觸發(fā)一個事件。其中,計數(shù)器的計數(shù)基準由定時器時鐘源(Timer Clock Source)提供,可以是內(nèi)部時鐘(例如APB1時鐘)或外部時鐘(例如外部晶振)。

STM32定時器的計數(shù)器可以通過多種方式進行控制和配置,其中包括:

c1db6e54-de2c-11ed-bfe3-dac502259ad0.png

接著看看串口的功能

分頻器(Prescaler):通過分頻器可以將定時器時鐘源的頻率降低,從而改變計數(shù)器的計數(shù)速度。分頻器的分頻值由預(yù)分頻器寄存器(PSC)設(shè)置,它是一個16位寄存器。

自動重載寄存器(Auto-reload Register):自動重載寄存器(ARR)存儲定時器計數(shù)器的最大值。當計數(shù)器的計數(shù)值達到自動重載寄存器的值時,計數(shù)器會重新從零開始計數(shù)。這種方式通常用于周期性產(chǎn)生中斷或控制PWM波形的占空比。

捕獲寄存器(Capture Register):捕獲寄存器(CCR)用于存儲定時器計數(shù)器的當前值。當捕獲到一個特定事件時,捕獲寄存器會自動被更新。這種方式通常用于測量外部事件的持續(xù)時間或頻率,例如測量脈沖寬度或計算輸入信號的頻率。

比較寄存器(Compare Register):比較寄存器(CCR)用于存儲與計數(shù)器進行比較的值。當計數(shù)器的值達到比較寄存器的值時,會觸發(fā)中斷或控制輸出信號的狀態(tài)。這種方式通常用于產(chǎn)生精確的定時事件或控制PWM波形的頻率和占空比。

TM32的UART模塊支持全雙工模式,其中數(shù)據(jù)可以在同一個UART通道上同時發(fā)送和接收。

要使用STM32的UART模塊進行全雙工通信,您需要進行以下設(shè)置:

配置UART模塊的時鐘和波特率,使其能夠與外部設(shè)備通信。

配置UART模塊的發(fā)送和接收引腳,以便將數(shù)據(jù)發(fā)送到外部設(shè)備并從外部設(shè)備接收數(shù)據(jù)。

配置UART模塊的工作模式為全雙工模式,這可以通過將UART模塊的USART_InitTypeDef結(jié)構(gòu)體中的Mode字段設(shè)置為USART_MODE_TX_RX來實現(xiàn)。

在程序中編寫發(fā)送和接收函數(shù),以便發(fā)送和接收數(shù)據(jù)。

以下是一個使用STM32的UART模塊進行全雙工通信的示例代碼:

#include "stm32f10x.h"
#include 


USART_InitTypeDef USART_InitStructure;


void USART1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_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_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);


    USART_Cmd(USART1, ENABLE);
}


void USART1_SendChar(char ch)
{
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    USART_SendData(USART1, ch);
}


char USART1_ReceiveChar(void)
{
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
    return USART_ReceiveData(USART1);
}


int main(void)
{
    char received_char;
    USART1_Init();
    
    while(1)
    {
        //發(fā)送數(shù)據(jù)
        USART1_SendChar('H');
        USART1_SendChar('e');
        USART1_SendChar('l');
        USART1_SendChar('l');
        USART1_SendChar('o');
        USART1_SendChar('
');
        
        //接收數(shù)據(jù)
        received_char = USART1_ReceiveChar();
        printf("Received: %c
", received_char);
    }

單工模式(Simplex Mode):在單工模式下,串口只能在一個方向上傳輸數(shù)據(jù),即數(shù)據(jù)只能單向發(fā)送或接收。在單工模式下,無法同時發(fā)送和接收數(shù)據(jù)。這種模式的應(yīng)用場景較為有限,通常只用于簡單的數(shù)據(jù)采集或監(jiān)測任務(wù)。

半雙工模式(Half Duplex Mode):在半雙工模式下,串口可以在兩個方向上傳輸數(shù)據(jù),但不能同時進行。也就是說,數(shù)據(jù)可以在發(fā)送和接收之間切換,但不能同時進行。這種模式廣泛應(yīng)用于需要雙向通信的應(yīng)用場景,例如工業(yè)自動化機器人控制。

全雙工模式(Full Duplex Mode):在全雙工模式下,串口可以在兩個方向同時傳輸數(shù)據(jù),也就是說,可以同時發(fā)送和接收數(shù)據(jù)。這種模式的應(yīng)用場景最為廣泛,通常用于數(shù)據(jù)通信、網(wǎng)絡(luò)通信等領(lǐng)域。

不同串口模式的異同在于其能否同時進行數(shù)據(jù)的發(fā)送和接收。單工模式只能單向傳輸數(shù)據(jù),半雙工模式可以雙向傳輸數(shù)據(jù)但不能同時進行,全雙工模式可以同時進行數(shù)據(jù)的雙向傳輸。因此,在實際應(yīng)用中,需要根據(jù)具體的場景和需求選擇適合的串口模式。

c2021f5e-de2c-11ed-bfe3-dac502259ad0.png

SPI全雙工模式:在SPI全雙工模式下,數(shù)據(jù)可以同時在主機和從機之間傳輸。主機通過發(fā)送時鐘信號來控制數(shù)據(jù)傳輸,每次傳輸一個字節(jié)或者一個字(16位)。SPI全雙工模式是最常用的SPI模式,應(yīng)用于數(shù)據(jù)傳輸速度要求較高、需要雙向數(shù)據(jù)傳輸?shù)膱鼍啊?/p>

SPI半雙工模式:在SPI半雙工模式下,數(shù)據(jù)只能在主機和從機之間單向傳輸。主機先發(fā)送數(shù)據(jù),然后從機接收數(shù)據(jù),或者從機先發(fā)送數(shù)據(jù),然后主機接收數(shù)據(jù)。SPI半雙工模式應(yīng)用于一些只需要單向數(shù)據(jù)傳輸?shù)膱鼍?,例如LED顯示、IO擴展等。

SPI主機模式:在SPI主機模式下,主機控制SPI通信的時序和數(shù)據(jù)傳輸,從機被動接受并響應(yīng)主機的控制。SPI主機模式常用于控制多個SPI從機的場景。

SPI從機模式:在SPI從機模式下,從機被動接受來自主機的控制和數(shù)據(jù)傳輸。SPI從機模式應(yīng)用于一些只需要單個從機的場景。

不同SPI模式的異同在于其能否同時進行雙向數(shù)據(jù)傳輸,以及數(shù)據(jù)傳輸時的時序和控制方式。

SPI全雙工模式和半雙工模式的主要區(qū)別在于雙向傳輸?shù)哪芰?,而SPI主機模式和從機模式的主要區(qū)別在于SPI通信的控制者是主機還是從機。

SPI(Serial Peripheral Interface,串行外圍設(shè)備接口)是一種簡單的、高速的串行通信協(xié)議,用于在微控制器和外部設(shè)備之間傳輸數(shù)據(jù)。SPI協(xié)議是一種同步協(xié)議,數(shù)據(jù)在時鐘信號的控制下進行傳輸。

SPI協(xié)議的基本通信原理是:

在SPI通信中,需要至少兩個設(shè)備,一個作為主設(shè)備,另一個或多個作為從設(shè)備。主設(shè)備負責控制SPI通信的時序和數(shù)據(jù)傳輸,從設(shè)備被動接受并響應(yīng)主設(shè)備的控制。

SPI通信中有四條信號線:SCK、MOSI、MISO和SS。SCK是時鐘信號線,由主設(shè)備產(chǎn)生;MOSI是主設(shè)備發(fā)送數(shù)據(jù)到從設(shè)備的信號線;MISO是從設(shè)備發(fā)送數(shù)據(jù)到主設(shè)備的信號線;SS是片選信號線,用于選擇從設(shè)備。在多個從設(shè)備的情況下,每個從設(shè)備都需要有一個獨立的片選信號線。

在SPI通信中,主設(shè)備產(chǎn)生時鐘信號,每個時鐘周期傳輸一個比特位,總線的數(shù)據(jù)傳輸是由主設(shè)備控制的。主設(shè)備先選擇一個從設(shè)備,即在對應(yīng)的片選信號線拉低,然后向從設(shè)備發(fā)送數(shù)據(jù)。從設(shè)備在接收到數(shù)據(jù)后,根據(jù)協(xié)議進行響應(yīng),并將響應(yīng)數(shù)據(jù)發(fā)送給主設(shè)備。主設(shè)備接收完從設(shè)備的響應(yīng)數(shù)據(jù)后,選擇下一個從設(shè)備或結(jié)束通信。

SPI協(xié)議的優(yōu)點是傳輸速度快、控制簡單、通信穩(wěn)定可靠。SPI通信速度可以達到幾十MHz,具有很高的實時性和實時控制性能。

c2237e74-de2c-11ed-bfe3-dac502259ad0.png

c2478224-de2c-11ed-bfe3-dac502259ad0.png

c2607086-de2c-11ed-bfe3-dac502259ad0.png

c280c12e-de2c-11ed-bfe3-dac502259ad0.png

三瓜倆棗的價格還給個USB

c29d650e-de2c-11ed-bfe3-dac502259ad0.png

USB OTG(On-The-Go)控制器:USB OTG控制器可以支持主機和設(shè)備兩種USB模式,因此可以在連接不同USB設(shè)備時自動識別主機和設(shè)備角色,并切換到相應(yīng)的模式。USB OTG控制器支持USB 2.0標準,能夠?qū)崿F(xiàn)高速(480 Mbps)、全速(12 Mbps)和低速(1.5 Mbps)的數(shù)據(jù)傳輸。此外,USB OTG控制器還支持Suspend和Resume模式,可以使設(shè)備在空閑狀態(tài)下降低功耗。

USB設(shè)備接口:STM32F103系列微控制器還內(nèi)置了USB設(shè)備接口,可以直接連接到PC或其他USB主機設(shè)備。在這種模式下,微控制器可以作為USB設(shè)備與主機進行通信,如傳輸數(shù)據(jù)、控制外圍設(shè)備等。USB設(shè)備接口支持USB 2.0標準,能夠?qū)崿F(xiàn)高速、全速和低速的數(shù)據(jù)傳輸。

USB引導(dǎo)加載器:STM32F103系列微控制器還支持通過USB引導(dǎo)加載器(USB bootloader)對程序進行燒錄,這種方式不需要額外的燒錄器件,只需通過USB接口即可進行程序下載。這種方式便于生產(chǎn)線上的批量燒錄和固件更新。

USB DMA(Direct Memory Access)控制器:STM32F103系列微控制器還支持USB DMA控制器,可以實現(xiàn)高效的USB數(shù)據(jù)傳輸。DMA控制器能夠直接將USB數(shù)據(jù)傳輸?shù)絻?nèi)存中,從而減少CPU的負擔,提高數(shù)據(jù)傳輸效率。

c2c7092c-de2c-11ed-bfe3-dac502259ad0.pngc2f19b92-de2c-11ed-bfe3-dac502259ad0.png

c3174572-de2c-11ed-bfe3-dac502259ad0.png

完事了家人們

SDIO是一種標準的接口協(xié)議,它可以用于SD卡,MMC(MultiMediaCard)卡等存儲卡的數(shù)據(jù)交換。STM32F103的SDIO接口支持SD卡的SD1.0、SD1.1、SD2.0和SD3.0標準,最高傳輸速度可達到48Mbps。

SDIO接口的主要功能包括:

初始化:配置SDIO時鐘、總線寬度、傳輸模式、數(shù)據(jù)超時等參數(shù)。

SD卡識別:通過發(fā)送CMD0命令使SD卡進入Idle狀態(tài),并發(fā)送CMD8命令獲取SD卡的電壓范圍和支持的接口版本。

卡信息讀取:通過發(fā)送CMD9命令讀取SD卡的CSD(Card Specific Data)寄存器和CID(Card Identification)寄存器,獲取SD卡的制造商信息、容量、傳輸速率等信息。

數(shù)據(jù)讀寫:通過發(fā)送CMD17和CMD18命令讀取SD卡的數(shù)據(jù)塊,通過發(fā)送CMD24和CMD25命令寫入數(shù)據(jù)塊。

卡狀態(tài)監(jiān)測:通過發(fā)送CMD13命令查詢SD卡的狀態(tài),包括卡是否準備好、當前傳輸狀態(tài)、錯誤狀態(tài)等。

DMA傳輸:STM32F103的SDIO接口支持DMA傳輸,可以減少CPU的負擔,提高數(shù)據(jù)傳輸效率。

最后兩個,打完收工:

c3312b18-de2c-11ed-bfe3-dac502259ad0.pngc34e3b7c-de2c-11ed-bfe3-dac502259ad0.png

c36a85a2-de2c-11ed-bfe3-dac502259ad0.png

誰懂啊,家人們

c382c356-de2c-11ed-bfe3-dac502259ad0.png

輸入和輸出

定時器這塊沒有完全吃透,準備先寫51或者是MSP430的時鐘系統(tǒng)。

c3a203c4-de2c-11ed-bfe3-dac502259ad0.png

這個就是定時器的數(shù)據(jù)手冊,不知道為什么倒著寫

c3bb6576-de2c-11ed-bfe3-dac502259ad0.png

①CK_PSC是定時器時鐘TIMxCLK,經(jīng)APB1預(yù)分頻器后分頻提供。

②定時器時鐘經(jīng)過PSC 預(yù)分頻器之后,即CK_CNT,用來驅(qū)動計數(shù)器計數(shù)。

③計數(shù)器CNT 是一個16 位的計數(shù)器,向上,向下,向上/下計數(shù)模式,最大計數(shù)值為65535。當計數(shù)達到自動重裝載寄存器的時候產(chǎn)生更新事件,并清零從頭開始計數(shù)。

④自動重裝載寄存器ARR 是一個16位的寄存器,這里面裝著計數(shù)器能計數(shù)的最大數(shù)值。當計數(shù)到這個值的時候,如果使能了中斷的話,定時器就產(chǎn)生溢出中斷。

c3ea5fe8-de2c-11ed-bfe3-dac502259ad0.png

計數(shù)器信號

其中CK_CNT時鐘就類似心跳,CNT計數(shù)器就類似心跳次數(shù)。要實現(xiàn)60秒定時,CK_CNT是1s,我們設(shè)置CNT計數(shù)器向上計數(shù)開啟中斷,因為只有溢出時,也就是計數(shù)到65535時才會有中斷,那么我們設(shè)置CNT計數(shù)器為65535-60=65475,開始計時,那么60秒后就會產(chǎn)生中斷。

設(shè)置自動重裝載寄存器ARR也為65475,當CNT計數(shù)器溢出時,自動重裝載寄存器ARR就會自動裝載到CNT計數(shù)器中,就能實現(xiàn)自動循環(huán)定時60秒。經(jīng)過上面分析,精確定時的關(guān)鍵在于CK_CNT的頻率,而CK_CNT是由定時器時鐘分頻而來的。

c404eb9c-de2c-11ed-bfe3-dac502259ad0.png

c4293baa-de2c-11ed-bfe3-dac502259ad0.png

注:為什么需要中間對齊模式:

在永磁同步電機的控制中,需要對電機的三相定子施加一定的電壓,才能控制電機轉(zhuǎn)動?,F(xiàn)在用的較多的是SVPWM(SVPWM的具體原理會在后面另寫一篇博客說明),要想產(chǎn)生SVPWM波形,需要控制的三相電壓呈如下形式,即A、B、C三相的電壓是中間對齊的,這就需要用到stm32定時器的中間對齊模式了。

c4586a74-de2c-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6040

    文章

    44611

    瀏覽量

    637315
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9148

    瀏覽量

    368448
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5362

    瀏覽量

    120884
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10921

    瀏覽量

    356938
  • 電源系統(tǒng)
    +關(guān)注

    關(guān)注

    3

    文章

    627

    瀏覽量

    37839

原文標題:萬字長文解讀STM32-1

文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    STM32從入門到精通2012年3月版

    ` 本帖最后由 eehome 于 2013-1-5 10:08 編輯 STM32從入門到精通2012年3月版是很好的學(xué)習(xí)資料,現(xiàn)在分享給大家`
    發(fā)表于 10-29 21:52

    【從零開始學(xué)STM32】點亮LED,真的?

    ,led12,led1,led0,led0,0xff}; #endif4,初始化我用了庫函數(shù),為什么主程序卻去操作寄存器?(明白這個,面試跟面試官這樣說出理由,他會覺得真的stm32了哦^ ^)5
    發(fā)表于 11-05 22:12

    小寒老師教你學(xué)STM32,10天從入門到精通

    STM32走向嵌入式的大門,店主小寒老師對電子線路設(shè)計、軟件編寫等方面,具有較深入的研究,歡迎廣大電子愛好者交流。本視頻共四套(寄存器+庫函數(shù))+外加資料大禮包,資料合計大小10G左右,10天
    發(fā)表于 06-17 12:10

    STM32從入門到精通神舟I號板

    STM32從入門到精通神舟I號板
    發(fā)表于 08-17 21:06

    STM32從入門到精通-神舟I號板

    STM32從入門到精通-神舟I號板
    發(fā)表于 03-31 11:45

    STM32從入門到精通-神舟I號板

    STM32從入門到精通-神舟I號板
    發(fā)表于 04-21 09:27

    真地符號鏈接和硬鏈接嗎?

    一起來做題:真地符號鏈接和硬鏈接嗎?
    發(fā)表于 04-24 10:32

    STM32從入門到精通-神舟I號板

    STM32從入門到精通-神舟I號板
    發(fā)表于 05-17 08:29

    STM32從入門到精通-神舟I號板

    STM32從入門到精通-神舟I號板 教程
    發(fā)表于 02-25 13:36

    STM32從入門到精通-神舟I號板

    STM32從入門到精通-神舟I號板
    發(fā)表于 03-21 13:10

    STM32從入門到精通

    STM32從入門到精通
    發(fā)表于 09-30 09:13

    真的Word嗎

    在日常辦公當中, Word文檔就是我們最常用的軟件之一。用它我們寫論文、寫方案、寫小說等等。但是,真的Word嗎?其實,Word軟件背后,還有一大批隱藏技能不知道。掌握他們,
    發(fā)表于 01-12 08:22

    一級消防工程師的含金量怎么樣

    一級消防工程師自從2015年首考以來,短短四年的時間,便成為證書行業(yè)的“寵兒”。雖然外界有關(guān)一級消防工程師證書“含金量高”的說法很多,但還有些“不知情”的小伙伴內(nèi)心還在猶豫,有很多疑慮,消防工程師的含金量究竟如何,以后的發(fā)展趨勢如何呢?
    的頭像 發(fā)表于 08-28 16:34 ?4010次閱讀

    真的CPU大小端模式嗎?

    真的CPU大小端模式嗎?
    的頭像 發(fā)表于 02-27 16:46 ?2774次閱讀

    什么電子廢品含金量最高

    之后,就演變?yōu)榱穗娮永?常見的線路板有CPU、電腦主板、內(nèi)存條、顯卡等電腦配件含金量較高,按照含金量高低來說,醫(yī)療器械中的線路板含金量要比電腦配件中含金量高出許多,還有一些精密儀器
    的頭像 發(fā)表于 07-07 14:44 ?4.3w次閱讀