你懂精通ARM的含金量嗎?你懂精通STM32的含金量嗎?不管懂不懂都要懂,趕緊學(xué)。
這是它的電源系統(tǒng),下面會(huì)說(shuō)這些引腳的作用
在STM32單片機(jī)中,每個(gè)寄存器都有一個(gè)獨(dú)特的地址,這些地址是在芯片的數(shù)據(jù)手冊(cè)中定義的。地址偏移是指每個(gè)寄存器的地址相對(duì)于其所在寄存器組的基地址的偏移量。
在這里,每一個(gè)寄存器都有便宜的地址
例如,在STM32F407VG芯片中,GPIOB寄存器組的基地址為0x40020400。在這個(gè)寄存器組中,每個(gè)GPIOB端口的控制寄存器的地址偏移量是0x00、0x04、0x08、0x0C等。這意味著,如果您想訪問(wèn)GPIOB的第一個(gè)端口(PB0),則可以通過(guò)將地址偏移量0x00添加到GPIOB基地址(0x40020400)來(lái)訪問(wèn)它,即0x40020400 + 0x00 = 0x40020400。
在STM32中,使用寄存器地址偏移來(lái)訪問(wèn)和控制特定寄存器,這可以通過(guò)指針操作和位域操作等方式來(lái)實(shí)現(xiàn)。需要注意的是,對(duì)于不同的芯片型號(hào)和不同的寄存器組,其基地址和偏移量可能會(huì)有所不同。
在STM32單片機(jī)中,每個(gè)寄存器都有一個(gè)復(fù)位值(也稱(chēng)為默認(rèn)值或初始值),這是當(dāng)單片機(jī)復(fù)位時(shí)寄存器將被初始化為的值。復(fù)位值是在芯片的數(shù)據(jù)手冊(cè)中定義的。
大多數(shù)寄存器的復(fù)位值都是0或某些特定的值,例如控制寄存器的復(fù)位值通常是0x0000或0x0001。
在單片機(jī)初始化過(guò)程中,為了確保寄存器處于正確的狀態(tài),需要將所有寄存器設(shè)置為其復(fù)位值。這可以通過(guò)在啟動(dòng)代碼中執(zhí)行清零操作或者使用STM32提供的庫(kù)函數(shù)來(lái)實(shí)現(xiàn)。
一字節(jié)是計(jì)算機(jī)存儲(chǔ)中的基本單位之一,通常包含8個(gè)比特(bit),每個(gè)比特只能表示0或1兩種狀態(tài)。在計(jì)算機(jī)中,一字節(jié)通常用于存儲(chǔ)一個(gè)字符或者一個(gè)整數(shù)等數(shù)據(jù)。
在二進(jìn)制表示中,一字節(jié)的取值范圍是0~255(即00000000~11111111),因?yàn)樗梢杂?個(gè)比特組合出256種不同的狀態(tài),其中一個(gè)狀態(tài)用于表示0。
一字節(jié)的大小在不同的計(jì)算機(jī)架構(gòu)中可能會(huì)有所不同,但是在大多數(shù)計(jì)算機(jī)中,一字節(jié)都被定義為8個(gè)比特。此外,一些特殊的系統(tǒng)中,字節(jié)大小可能是其他值,如10比特或12比特。
一比特(bit)是計(jì)算機(jī)存儲(chǔ)和通信中最小的數(shù)據(jù)單位,它只能表示0或1兩種狀態(tài)。比特通常用于表示二進(jìn)制數(shù)據(jù),在計(jì)算機(jī)中被廣泛應(yīng)用于數(shù)字電路和通信領(lǐng)域。
在二進(jìn)制表示中,一個(gè)比特的取值范圍是0或1,其中0表示低電平(或者“假”),1表示高電平(或者“真”)。比特的狀態(tài)可以表示一位二進(jìn)制數(shù)中的一位,因此8個(gè)比特組合起來(lái)可以表示一個(gè)字節(jié),即一個(gè)8位的二進(jìn)制數(shù)。
比特在計(jì)算機(jī)中有著廣泛的應(yīng)用,例如存儲(chǔ)器單元中的存儲(chǔ)單元就是由比特組成的,CPU中的寄存器也是由多個(gè)比特組合而成的。在通信領(lǐng)域,比特是衡量數(shù)據(jù)傳輸速率的單位,例如“1Mbps”表示每秒傳輸100萬(wàn)個(gè)比特。
這里寫(xiě)的就是上面的電源引腳,為什么在認(rèn)知中簡(jiǎn)單的+,-兩個(gè)而已,現(xiàn)在出來(lái)這么多腳?
Vdd和Vss是電子元器件中常用的術(shù)語(yǔ),它們分別代表電路的正電源和負(fù)電源。
Vdd是指電路中的正電源,通常表示為Vcc,它為電路提供正電壓,使電路中的器件工作。在數(shù)字電路中,Vdd通常為邏輯1的電壓值,而在模擬電路中,Vdd通常為固定的直流電壓源。
Vss是指電路中的負(fù)電源,也稱(chēng)為地線或接地線,通常表示為GND。Vss提供電路中的器件所需的負(fù)電壓,以確保電路正常工作。在數(shù)字電路中,Vss通常為邏輯0的電壓值,而在模擬電路中,Vss通常為固定的零電位或接地。
Vdd和Vss是電子電路中最基本的兩個(gè)電源,電路中的其他信號(hào)、電壓和電流都是基于這兩個(gè)電源的。
Vdda是指模擬電路中的電源,通常用于提供模擬信號(hào)的參考電壓。Vdda通常表示為VddA,與數(shù)字電路中的Vdd不同,Vdda通常為模擬電路所需的電壓值,通常比數(shù)字電路中的Vdd更為精確和穩(wěn)定。
Vdda通常用于ADC(模數(shù)轉(zhuǎn)換器)和DAC(數(shù)模轉(zhuǎn)換器)等模擬電路中。在ADC中,Vdda是參考電壓,用于將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。在DAC中,Vdda是數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)時(shí)使用的參考電壓。
與數(shù)字電路中的Vdd相比,Vdda的電壓值通常要求更為精確和穩(wěn)定,以確保模擬電路中的信號(hào)質(zhì)量。
Vdd是指數(shù)字電路中的正電源,通常表示為Vcc,它為電路提供正電壓,使電路中的器件工作。在數(shù)字電路中,Vdd通常為邏輯1的電壓值。
Vdd電源通常用于數(shù)字邏輯電路中,例如微處理器、存儲(chǔ)器、計(jì)數(shù)器等。Vdd的電壓值取決于具體的器件要求和應(yīng)用場(chǎng)景,通常在2V到5V之間,也有些器件需要更高的電壓值。
在數(shù)字電路中,Vdd電源的穩(wěn)定性和可靠性非常重要,如果Vdd電壓不穩(wěn)定或存在波動(dòng),可能會(huì)導(dǎo)致電路運(yùn)行不穩(wěn)定或出現(xiàn)錯(cuò)誤。因此,在數(shù)字電路設(shè)計(jì)中,通常需要使用穩(wěn)壓電路或者其他電源管理技術(shù)來(lái)確保Vdd電壓的穩(wěn)定性和可靠性,以保證電路的正常工作。
Vssa是指模擬電路中的負(fù)電源,通常表示為VssA,它為模擬電路中的器件提供負(fù)電壓,以確保模擬電路的正常工作。Vssa通常用于模擬信號(hào)的處理和放大等模擬電路中。
與數(shù)字電路中的Vss不同,Vssa通常需要比Vss更為精確和穩(wěn)定,以確保模擬電路中的信號(hào)質(zhì)量。在實(shí)際應(yīng)用中,通常需要使用高精度的電源管理電路或其他電源穩(wěn)定技術(shù)來(lái)確保Vssa的穩(wěn)定性和可靠性,以確保模擬電路的正常工作。
需要注意的是,Vssa和VddA通常是相對(duì)于某個(gè)參考電位(通常是地線)而言的,它們之間的電壓差通常稱(chēng)為模擬電源電壓。
這個(gè)簡(jiǎn)單,就是CubuMX的
在 STM32 數(shù)據(jù)手冊(cè)中,寄存器的訪問(wèn)選項(xiàng)通常包括以下內(nèi)容:
讀/寫(xiě)權(quán)限:指示寄存器是否可讀、可寫(xiě)或既可讀又可寫(xiě)。
寄存器地址:指示寄存器在芯片內(nèi)存映射中的地址。
寄存器位域:對(duì)于一些特殊的寄存器,可能會(huì)將其分為幾個(gè)位域來(lái)表示不同的控制或狀態(tài)信息。
復(fù)位值:指示寄存器在復(fù)位時(shí)的初始值。
等待周期:指示在對(duì)該寄存器進(jìn)行讀/寫(xiě)操作時(shí)需要等待多長(zhǎng)時(shí)間才能獲得結(jié)果。在一些情況下,需要等待芯片內(nèi)部的一些操作完成后才能獲得正確的結(jié)果,因此需要等待周期。
等待周期是指訪問(wèn)某些寄存器需要等待芯片內(nèi)部操作完成的時(shí)間,通常稱(chēng)為訪問(wèn)延遲。在進(jìn)行某些特殊操作時(shí),需要等待周期才能確保數(shù)據(jù)的正確性。在進(jìn)行讀取操作時(shí),等待周期可能包括寄存器響應(yīng)時(shí)間、總線傳輸時(shí)間等等,具體時(shí)間可能會(huì)因?yàn)橄到y(tǒng)的配置和芯片的類(lèi)型而有所不同。
在微控制器中,有時(shí)需要對(duì)存儲(chǔ)器進(jìn)行不同粒度的讀寫(xiě)操作,字節(jié)(Byte)、半字(Half Word)和字(Word)是三種常見(jiàn)的數(shù)據(jù)粒度,它們分別表示存儲(chǔ)器中的不同位數(shù)。具體含義如下:
字節(jié)(Byte):是存儲(chǔ)器中的最小單元,通常表示為8位二進(jìn)制數(shù)。字節(jié)可存儲(chǔ)0-255的無(wú)符號(hào)整數(shù),或者-128到127的有符號(hào)整數(shù)。字節(jié)訪問(wèn)意味著每次訪問(wèn)一個(gè)字節(jié)。
半字(Half Word):是由兩個(gè)連續(xù)的字節(jié)組成,通常表示為16位二進(jìn)制數(shù)。半字可存儲(chǔ)0-65535的無(wú)符號(hào)整數(shù),或者-32768到32767的有符號(hào)整數(shù)。半字訪問(wèn)意味著每次訪問(wèn)兩個(gè)字節(jié)。
字(Word):是由四個(gè)連續(xù)的字節(jié)組成,通常表示為32位二進(jìn)制數(shù)。字可存儲(chǔ)0-4294967295的無(wú)符號(hào)整數(shù),或者-2147483648到2147483647的有符號(hào)整數(shù)。字訪問(wèn)意味著每次訪問(wèn)四個(gè)字節(jié)。
在STM32微控制器中,為了支持不同粒度的讀寫(xiě)操作,一些寄存器和存儲(chǔ)器區(qū)域提供了不同的訪問(wèn)選項(xiàng),例如:
8位字節(jié)訪問(wèn)(BYTE):每次訪問(wèn)8位(1個(gè)字節(jié))的數(shù)據(jù)。
16位半字訪問(wèn)(HALFWORD):每次訪問(wèn)16位(2個(gè)字節(jié))的數(shù)據(jù)。
32位字訪問(wèn)(WORD):每次訪問(wèn)32位(4個(gè)字節(jié))的數(shù)據(jù)。
在 STM32 微控制器中,系統(tǒng)時(shí)鐘和外設(shè)時(shí)鐘都是由一個(gè)基礎(chǔ)時(shí)鐘源衍生出來(lái)的,對(duì)于 STM32 系列微控制器而言,通常都是使用內(nèi)部的 RC 振蕩器或者外部的晶體振蕩器作為基礎(chǔ)時(shí)鐘源。
時(shí)鐘中斷寄存器是一類(lèi)特殊的寄存器,用于配置 STM32 微控制器中的時(shí)鐘中斷。時(shí)鐘中斷是指在系統(tǒng)時(shí)鐘或者外設(shè)時(shí)鐘到達(dá)某個(gè)特定時(shí)間或者計(jì)數(shù)值時(shí)產(chǎn)生的一種中斷信號(hào),用于觸發(fā)某些特定的操作或者執(zhí)行周期性的任務(wù)。
STM32 微控制器中的時(shí)鐘中斷寄存器通常包括以下內(nèi)容:
時(shí)鐘控制寄存器:用于配置時(shí)鐘的各種參數(shù),例如時(shí)鐘源選擇、時(shí)鐘分頻系數(shù)、時(shí)鐘計(jì)數(shù)器等等。
中斷控制寄存器:用于配置時(shí)鐘中斷的觸發(fā)條件和中斷優(yōu)先級(jí)等參數(shù)。
中斷狀態(tài)寄存器:用于記錄當(dāng)前是否有時(shí)鐘中斷發(fā)生,并且可以清除中斷標(biāo)志位。
在 STM32 微控制器中,不同的系列和型號(hào)會(huì)有不同的時(shí)鐘中斷寄存器,具體的使用方法和配置參數(shù)需要根據(jù)具體的型號(hào)和應(yīng)用場(chǎng)景進(jìn)行選擇和調(diào)整。
復(fù)位電路
時(shí)鐘樹(shù)在面試的時(shí)候也會(huì)問(wèn),這個(gè)其實(shí)就是多看看就好了
在HSE時(shí)鐘上面的晶振如何接
在MX上面生成調(diào)試的時(shí)候,需要選擇這個(gè)
會(huì)有默認(rèn)的引腳來(lái)啟用
可以選擇一個(gè)IIC的
下面是具體的一些功能,可以去設(shè)置,在代碼中有體現(xiàn)
IIC默認(rèn)開(kāi)啟的是這兩個(gè)引腳
有時(shí)候引腳之間是互相沖突的
可以試試UART
硬件外設(shè)就直接打開(kāi)
這些是串口的常見(jiàn)設(shè)置
你可以點(diǎn)右邊來(lái)設(shè)置精確的功能
在這里被設(shè)置
當(dāng)然DMA如果要開(kāi)啟的時(shí)候也是可以的
時(shí)鐘
這是一些設(shè)置
為每個(gè)外設(shè)生成H,C
也可以選取LL低級(jí)性能庫(kù)
第一次找到這個(gè)功能,好像是打開(kāi)回調(diào)
代碼在之間
這個(gè)就是生成的函數(shù)
里面的中斷函數(shù)
IO腳的設(shè)置自己看嘛
4部分
01控制
速度控制,說(shuō)了100遍
也可以選擇JTAG
默認(rèn)復(fù)位的功能
一次用4個(gè)線,不配了
引腳的配置
自己看
輸入模式
在 STM32 微控制器中,APB2(Advanced Peripheral Bus 2)是一個(gè)高速外設(shè)總線,它連接了一些重要的外設(shè)模塊,例如定時(shí)器、串行通信接口、通用串行總線控制器等等。APB2 的時(shí)鐘頻率可以通過(guò)時(shí)鐘樹(shù)的分頻器進(jìn)行配置,因此可以實(shí)現(xiàn)不同外設(shè)模塊之間的時(shí)序控制和數(shù)據(jù)交換。
STM32 APB2 外設(shè)包括但不限于以下幾個(gè):
定時(shí)器:STM32 微控制器中有多種不同類(lèi)型的定時(shí)器,包括基本定時(shí)器、通用定時(shí)器、高級(jí)定時(shí)器等等,這些定時(shí)器可以用于產(chǎn)生各種精度和周期的定時(shí)器中斷,同時(shí)還支持 PWM 信號(hào)輸出、脈沖計(jì)數(shù)等功能。
串行通信接口:STM32微控制器中支持多種不同的串行通信協(xié)議,包括 UART、SPI、I2C等等,這些外設(shè)模塊可以實(shí)現(xiàn)與其他設(shè)備的數(shù)據(jù)通信和控制。
通用串行總線控制器:STM32 微控制器中的通用串行總線控制器(USB OTG FS)是一種高速的通用串行總線接口,可以實(shí)現(xiàn)與 USB 設(shè)備的通信和數(shù)據(jù)傳輸。
ADC:STM32 微控制器中的 ADC(模數(shù)轉(zhuǎn)換器)可以用于采集模擬信號(hào)并將其轉(zhuǎn)換為數(shù)字信號(hào),提供多種不同的采樣率和分辨率選擇。
DMA:STM32 微控制器中的 DMA(直接存儲(chǔ)器訪問(wèn))模塊可以實(shí)現(xiàn)高效的數(shù)據(jù)傳輸和數(shù)據(jù)存儲(chǔ),同時(shí)也可以降低 CPU 的負(fù)載,提高系統(tǒng)性能。
在STM32中,APB2是高速外設(shè)總線,例如SPI、I2S、USART、ADC等,其時(shí)鐘頻率通常比APB1和AHB總線更高。在每個(gè)APB2時(shí)鐘上采樣指的是在APB2時(shí)鐘周期內(nèi)對(duì)某個(gè)外設(shè)進(jìn)行多次采樣以提高采樣精度和減小采樣誤差的技術(shù)。
例如,在使用STM32的ADC(模數(shù)轉(zhuǎn)換器)時(shí),可以選擇在每個(gè)APB2時(shí)鐘上采樣來(lái)提高轉(zhuǎn)換精度。這樣做的好處是可以將ADC的采樣周期與APB2總線的時(shí)鐘同步,提高ADC采樣率,減小噪聲和抖動(dòng)對(duì)采樣的影響,從而提高系統(tǒng)的性能和穩(wěn)定性。
在STM32中,IRQ是指中斷請(qǐng)求(Interrupt Request)。它是一種特殊的處理器信號(hào),用于通知CPU有重要的事件需要立即處理。當(dāng)一個(gè)中斷事件被觸發(fā)時(shí),它會(huì)向處理器發(fā)出IRQ信號(hào),將處理器從正常的程序執(zhí)行中打斷,轉(zhuǎn)而執(zhí)行預(yù)定義的中斷服務(wù)程序(ISR)來(lái)處理中斷事件。
STM32芯片具有許多外設(shè)(例如定時(shí)器、串口、ADC等),這些外設(shè)可以通過(guò)配置相應(yīng)的中斷請(qǐng)求(IRQ)來(lái)實(shí)現(xiàn)異步事件的處理。當(dāng)外設(shè)產(chǎn)生了預(yù)定義的事件(例如定時(shí)器計(jì)數(shù)器溢出、串口接收數(shù)據(jù)等)時(shí),它會(huì)自動(dòng)向中斷控制器發(fā)出IRQ信號(hào),觸發(fā)中斷請(qǐng)求,并使得CPU暫時(shí)停止執(zhí)行正在運(yùn)行的程序,轉(zhuǎn)而執(zhí)行相應(yīng)的中斷服務(wù)程序來(lái)處理該事件。
在STM32中,IRQ信號(hào)由中斷控制器(NVIC,Nested Vector Interrupt Controller)進(jìn)行管理和分配,它可以對(duì)外設(shè)產(chǎn)生的不同類(lèi)型的中斷請(qǐng)求進(jìn)行優(yōu)先級(jí)排序和處理。
異步編程是一種編程模型,它不依賴于線程的同步和阻塞等機(jī)制,而是通過(guò)回調(diào)函數(shù)、事件驅(qū)動(dòng)等方式來(lái)實(shí)現(xiàn)代碼的非阻塞執(zhí)行,從而提高系統(tǒng)的并發(fā)性能和響應(yīng)速度。
異步編程通常涉及到異步操作和異步實(shí)踐兩個(gè)概念。
異步操作指的是一種不會(huì)阻塞當(dāng)前線程的操作,例如IO操作、網(wǎng)絡(luò)請(qǐng)求等。異步操作一般是通過(guò)異步函數(shù)或異步API來(lái)實(shí)現(xiàn)的,它們通常會(huì)在后臺(tái)啟動(dòng)一個(gè)或多個(gè)線程或進(jìn)程來(lái)處理請(qǐng)求,從而避免當(dāng)前線程被阻塞。異步操作通常會(huì)在完成后觸發(fā)一個(gè)事件或回調(diào)函數(shù),通知應(yīng)用程序異步操作已經(jīng)完成,并將操作結(jié)果傳遞給應(yīng)用程序。
異步實(shí)踐指的是使用異步編程模型來(lái)優(yōu)化系統(tǒng)性能和響應(yīng)速度的一系列技術(shù)和方法。異步實(shí)踐的核心思想是將那些可能導(dǎo)致阻塞的操作(例如IO操作、數(shù)據(jù)庫(kù)訪問(wèn)等)轉(zhuǎn)換為異步操作,以保證系統(tǒng)的高并發(fā)性能和響應(yīng)速度。異步實(shí)踐還包括一些常見(jiàn)的技術(shù)和方法,例如使用事件驅(qū)動(dòng)、異步回調(diào)、異步消息隊(duì)列等,來(lái)實(shí)現(xiàn)代碼的異步執(zhí)行和解耦合。
在嵌入式開(kāi)發(fā)中,異步實(shí)踐也非常重要。例如,使用STM32等微控制器進(jìn)行嵌入式開(kāi)發(fā)時(shí),可以使用異步編程模型和異步實(shí)踐技術(shù)來(lái)實(shí)現(xiàn)對(duì)外設(shè)的異步控制和數(shù)據(jù)采集等功能,從而提高系統(tǒng)的性能和可靠性。
1.使用異步函數(shù)或異步API:嵌入式系統(tǒng)中的許多操作都是耗時(shí)的,例如IO操作、網(wǎng)絡(luò)通信等,如果使用同步方式進(jìn)行處理,會(huì)導(dǎo)致當(dāng)前線程被阻塞,影響系統(tǒng)的響應(yīng)速度。因此,在嵌入式系統(tǒng)中,通常使用異步函數(shù)或異步API來(lái)實(shí)現(xiàn)這些操作。異步函數(shù)或API會(huì)在后臺(tái)啟動(dòng)一個(gè)或多個(gè)線程或任務(wù)來(lái)處理請(qǐng)求,從而避免當(dāng)前線程被阻塞,同時(shí)也可以提高系統(tǒng)的并發(fā)性能和響應(yīng)速度。
2.使用中斷機(jī)制:嵌入式系統(tǒng)中,許多操作都是通過(guò)中斷機(jī)制來(lái)實(shí)現(xiàn)的,例如定時(shí)器中斷、外部中斷等。使用中斷機(jī)制可以使得系統(tǒng)不必等待某些操作的完成,而是在該操作完成時(shí)自動(dòng)觸發(fā)中斷處理程序,從而實(shí)現(xiàn)異步處理。
3.使用事件驅(qū)動(dòng)模型:事件驅(qū)動(dòng)模型是一種基于事件和回調(diào)函數(shù)的編程模型,它通過(guò)監(jiān)聽(tīng)特定的事件來(lái)觸發(fā)對(duì)應(yīng)的回調(diào)函數(shù)。在嵌入式系統(tǒng)中,事件驅(qū)動(dòng)模型可以用來(lái)實(shí)現(xiàn)異步操作的回調(diào)函數(shù)。例如,在處理串口通信時(shí),可以使用事件驅(qū)動(dòng)模型監(jiān)聽(tīng)串口接收數(shù)據(jù)的事件,并在數(shù)據(jù)到達(dá)時(shí)觸發(fā)對(duì)應(yīng)的回調(diào)函數(shù)進(jìn)行數(shù)據(jù)處理。
4.使用消息隊(duì)列:消息隊(duì)列是一種將消息異步傳遞給消費(fèi)者的機(jī)制。在嵌入式系統(tǒng)中,可以使用消息隊(duì)列來(lái)實(shí)現(xiàn)異步任務(wù)的處理。例如,在處理圖像識(shí)別時(shí),可以使用消息隊(duì)列來(lái)異步處理圖像數(shù)據(jù),從而避免阻塞當(dāng)前任務(wù)的執(zhí)行。
引腳的開(kāi)漏模式是指在輸出電平時(shí),將該引腳連接的晶體管的源極或發(fā)射極與地相連,使得該引腳的輸出電平只能為低電平(0V)或高阻態(tài)(電阻很大,相當(dāng)于沒(méi)有連接)。開(kāi)漏模式的引腳通常被稱(chēng)為開(kāi)漏輸出引腳。
在開(kāi)漏模式下,輸出引腳不會(huì)直接提供高電平的輸出,而是通過(guò)連接一個(gè)上拉電阻或使用內(nèi)部上拉電阻來(lái)實(shí)現(xiàn)。上拉電阻的值通常很大,因此在輸出高電平時(shí),輸出電平可能不穩(wěn)定,容易受到外部干擾的影響。
開(kāi)漏模式的引腳通常用于控制外部電路中的開(kāi)關(guān)元件(例如晶體管、繼電器等),以及驅(qū)動(dòng)I2C總線等外部設(shè)備。在這些場(chǎng)景中,開(kāi)漏模式的引腳可以通過(guò)控制開(kāi)關(guān)元件的導(dǎo)通和斷開(kāi)來(lái)實(shí)現(xiàn)對(duì)外部設(shè)備的控制,同時(shí)也可以避免由于外部設(shè)備的反向電流等問(wèn)題對(duì)系統(tǒng)的損害。
需要注意的是,開(kāi)漏模式的引腳在輸出高電平時(shí)不能直接驅(qū)動(dòng)負(fù)載,需要通過(guò)使用外部上拉電阻或使用內(nèi)部上拉電阻來(lái)實(shí)現(xiàn),同時(shí)在設(shè)計(jì)電路時(shí)需要考慮到該引腳的輸出電流和負(fù)載電流的匹配,以避免對(duì)系統(tǒng)的損害。
引腳的推挽模式是指在輸出電平時(shí),將該引腳連接的晶體管的源極或發(fā)射極與電源相連,使得該引腳的輸出電平可以為高電平(電源電壓)或低電平(0V)。推挽模式的引腳通常被稱(chēng)為推挽輸出引腳。
在推挽模式下,輸出引腳可以直接提供高電平和低電平的輸出,并且輸出電流通常比較大,可以直接驅(qū)動(dòng)一定的負(fù)載電流。
推挽模式的引腳通常用于控制外部電路中的驅(qū)動(dòng)元件(例如LED、直流電機(jī)等),以及驅(qū)動(dòng)SPI總線等外部設(shè)備。在這些場(chǎng)景中,推挽模式的引腳可以通過(guò)控制驅(qū)動(dòng)元件的導(dǎo)通和斷開(kāi)來(lái)實(shí)現(xiàn)對(duì)外部設(shè)備的控制,同時(shí)也可以提供較大的輸出電流以驅(qū)動(dòng)負(fù)載電流。
需要注意的是,在推挽模式下,引腳的輸出電平不能為高阻態(tài),需要確保連接的晶體管在輸出低電平時(shí)處于關(guān)閉狀態(tài),否則可能導(dǎo)致電路不穩(wěn)定或電路損壞。
相同點(diǎn):
都可以作為引腳的輸出模式,輸出高電平和低電平的電壓信號(hào);
都可以用來(lái)控制外部電路中的驅(qū)動(dòng)元件,例如LED、直流電機(jī)等。
不同點(diǎn):
開(kāi)漏模式的引腳輸出電平只能為低電平或高阻態(tài),需要通過(guò)上拉電阻來(lái)實(shí)現(xiàn)高電平的輸出;推挽模式的引腳輸出電平可以為低電平或高電平;
推挽模式的引腳具有較大的輸出電流能力,可以直接驅(qū)動(dòng)負(fù)載電流,而開(kāi)漏模式的引腳需要通過(guò)上拉電阻來(lái)驅(qū)動(dòng)負(fù)載電流;
開(kāi)漏模式的引腳通常用于控制外部電路中的開(kāi)關(guān)元件(例如晶體管、繼電器等),以及驅(qū)動(dòng)I2C總線等外部設(shè)備;而推挽模式的引腳通常用于控制外部電路中的驅(qū)動(dòng)元件(例如LED、直流電機(jī)等),以及驅(qū)動(dòng)SPI總線等外部設(shè)備。
推挽模式的引腳適合需要較大輸出電流的場(chǎng)景,例如驅(qū)動(dòng)LED、直流電機(jī)等負(fù)載,同時(shí)也適合驅(qū)動(dòng)SPI總線等外部設(shè)備;
開(kāi)漏模式的引腳適合需要通過(guò)控制開(kāi)關(guān)元件的導(dǎo)通和斷開(kāi)來(lái)實(shí)現(xiàn)控制的場(chǎng)景,例如驅(qū)動(dòng)I2C總線等外部設(shè)備。
當(dāng)外設(shè)模塊需要從CPU讀取數(shù)據(jù)時(shí),它需要按照APB2總線時(shí)鐘的節(jié)奏來(lái)發(fā)送讀取請(qǐng)求,并在每個(gè)APB2時(shí)鐘周期中傳輸一個(gè)數(shù)據(jù)位,直到所有數(shù)據(jù)都被讀取完畢為止。
施密特觸發(fā)輸入是一種常見(jiàn)的數(shù)字電路輸入技術(shù),也被稱(chēng)為施密特觸發(fā)器輸入或雙穩(wěn)態(tài)輸入。施密特觸發(fā)輸入通過(guò)特殊的電路設(shè)計(jì),能夠使輸入信號(hào)的干擾和抖動(dòng)不會(huì)輕易導(dǎo)致輸出信號(hào)的誤判或不穩(wěn)定。
施密特觸發(fā)輸入的基本原理是在輸入信號(hào)的電壓上下閾值范圍內(nèi),輸出信號(hào)維持穩(wěn)定的高或低電平;而當(dāng)輸入信號(hào)超過(guò)一定的閾值范圍時(shí),輸出信號(hào)則發(fā)生明顯的翻轉(zhuǎn),并維持到輸入信號(hào)回到另一個(gè)閾值范圍時(shí)才再次翻轉(zhuǎn)。這種特性可以有效地防止輸入信號(hào)的干擾和抖動(dòng)導(dǎo)致輸出信號(hào)的誤判或不穩(wěn)定。
施密特觸發(fā)輸入常見(jiàn)的應(yīng)用場(chǎng)景包括數(shù)字信號(hào)的輸入、信號(hào)的去抖動(dòng)處理、信號(hào)的濾波處理等。在數(shù)字電路的設(shè)計(jì)和實(shí)現(xiàn)中,施密特觸發(fā)輸入可以提高電路的抗干擾能力和穩(wěn)定性,從而提高數(shù)字系統(tǒng)的性能和可靠性。
P-MOS
P-MOS是一種由p型半導(dǎo)體材料制成的MOSFET晶體管,其控制方式是通過(guò)在柵極和源極之間施加負(fù)電壓來(lái)控制晶體管的導(dǎo)通狀態(tài)。當(dāng)柵極電壓低于源極電壓時(shí),P-MOS導(dǎo)通;當(dāng)柵極電壓高于源極電壓時(shí),P-MOS截止。P-MOS的導(dǎo)通電阻相對(duì)較大,通常用于高電平驅(qū)動(dòng)電路中。
N-MOS
N-MOS是一種由n型半導(dǎo)體材料制成的MOSFET晶體管,其控制方式是通過(guò)在柵極和源極之間施加正電壓來(lái)控制晶體管的導(dǎo)通狀態(tài)。當(dāng)柵極電壓高于源極電壓時(shí),N-MOS導(dǎo)通;當(dāng)柵極電壓低于源極電壓時(shí),N-MOS截止。N-MOS的導(dǎo)通電阻相對(duì)較小,通常用于低電平驅(qū)動(dòng)電路中。
弱上拉是指在輸入端口(比如微控制器的GPIO口)上通過(guò)加入一個(gè)大約為10kΩ的電阻,從而使該輸入端口與VCC(正電源)之間形成一個(gè)電阻分壓網(wǎng)絡(luò),從而使輸入端口的電壓在沒(méi)有外部信號(hào)的情況下趨向于高電平,即被上拉到VCC電平。
弱上拉的作用在于,當(dāng)沒(méi)有外部信號(hào)輸入時(shí),輸入端口會(huì)被保持在一個(gè)已知的狀態(tài),從而有效地避免了輸入端口因?yàn)橥獠啃盘?hào)干擾而導(dǎo)致的錯(cuò)誤輸入。同時(shí),在需要對(duì)輸入端口進(jìn)行讀取的時(shí)候,由于弱上拉電阻的存在,輸入端口的狀態(tài)可以更容易地被檢測(cè)到。
我們其實(shí)就是操作IO的輸出和輸入,各種功能到底怎么樣的配置?
這么多的定時(shí)器,讓我來(lái)給大家寫(xiě)一寫(xiě)
STM32定時(shí)器的輸入捕獲功能可以用來(lái)測(cè)量外部信號(hào)的時(shí)間間隔、頻率和脈寬等信息,常用于測(cè)量脈沖信號(hào)、編碼器信號(hào)、PWM信號(hào)等。
具體實(shí)現(xiàn)步驟如下:
配置定時(shí)器為輸入捕獲模式。
配置定時(shí)器的輸入捕獲通道,選擇輸入捕獲邊沿(上升沿或下降沿)觸發(fā)測(cè)量。
在輸入捕獲中斷服務(wù)函數(shù)中讀取捕獲寄存器的值,計(jì)算出測(cè)量值。
根據(jù)需要,可以通過(guò)中斷或DMA方式進(jìn)行多次測(cè)量,并對(duì)測(cè)量結(jié)果進(jìn)行平均值計(jì)算等處理。
下面是一個(gè)基于STM32 HAL庫(kù)的輸入捕獲示例代碼,以測(cè)量外部脈沖信號(hào)的周期和脈寬為例:
#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定時(shí)器的通道1進(jìn)行輸入捕獲,并開(kāi)啟了中斷模式(HAL_TIM_IC_Start_IT函數(shù))。在輸入捕獲中斷服務(wù)函數(shù)中,計(jì)算出上一次和本次捕獲的時(shí)間差,根據(jù)時(shí)間差的正負(fù)值來(lái)區(qū)分計(jì)算周期還是脈寬,最終得到測(cè)量結(jié)果。
STM32定時(shí)器的輸出比較功能可以用來(lái)生成PWM波形、產(chǎn)生觸發(fā)信號(hào)、實(shí)現(xiàn)周期性的定時(shí)器中斷等。其實(shí)現(xiàn)步驟如下:
配置定時(shí)器為輸出比較模式,并選擇輸出比較通道。
配置定時(shí)器的時(shí)基參數(shù),包括計(jì)數(shù)器的時(shí)鐘頻率、計(jì)數(shù)器的計(jì)數(shù)范圍等。
配置輸出比較模式下的通道參數(shù),包括輸出模式(比較輸出或PWM輸出)、比較值等。
啟動(dòng)定時(shí)器,使其開(kāi)始計(jì)數(shù)并產(chǎn)生輸出信號(hào)。
下面是一個(gè)基于STM32 HAL庫(kù)的輸出比較示例代碼,以生成50%占空比、1kHz的PWM信號(hào)為例:
#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定時(shí)器的互補(bǔ)輸出功能可以用來(lái)實(shí)現(xiàn)半橋或全橋逆變器、電機(jī)驅(qū)動(dòng)器等應(yīng)用。它通過(guò)在同一個(gè)定時(shí)器中同時(shí)配置兩個(gè)輸出比較通道,一個(gè)通道輸出高電平,另一個(gè)通道輸出低電平,以實(shí)現(xiàn)互補(bǔ)輸出的功能。
下面是一個(gè)基于STM32HAL庫(kù)的互補(bǔ)輸出示例代碼,以實(shí)現(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定時(shí)器的剎車(chē)輸入是用于實(shí)現(xiàn)電機(jī)或馬達(dá)控制器的緊急停止或剎車(chē)功能。當(dāng)剎車(chē)輸入信號(hào)被觸發(fā)時(shí),定時(shí)器立即停止計(jì)數(shù),并且輸出保持在一個(gè)預(yù)定義的狀態(tài)(例如輸出低電平或高電平)。在應(yīng)用中,剎車(chē)輸入通常是由硬件電路(如電機(jī)控制器)提供的。
STM32定時(shí)器的剎車(chē)輸入通常與定時(shí)器的輸入捕獲或輸出比較功能結(jié)合使用。例如,在一個(gè)三相電機(jī)驅(qū)動(dòng)器中,定時(shí)器的輸入捕獲功能用于捕獲電機(jī)轉(zhuǎn)速,輸出比較功能用于產(chǎn)生PWM波形驅(qū)動(dòng)電機(jī),而剎車(chē)輸入則用于實(shí)現(xiàn)急停功能。
下面是一個(gè)基于STM32 HAL庫(kù)的剎車(chē)輸入示例代碼:
#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定時(shí)器的外部觸發(fā)時(shí)鐘輸入是一種使定時(shí)器以外部信號(hào)作為計(jì)數(shù)時(shí)鐘的功能。它允許定時(shí)器在外部觸發(fā)信號(hào)到來(lái)時(shí)開(kāi)始計(jì)數(shù),并且不依賴于內(nèi)部時(shí)鐘。這種功能常用于需要精確時(shí)間測(cè)量或同步的應(yīng)用,如數(shù)據(jù)采集、PWM控制和通信接口等。
STM32定時(shí)器的外部觸發(fā)時(shí)鐘輸入可通過(guò)使用TIMx_ETR (外部觸發(fā)器)引腳來(lái)實(shí)現(xiàn)。在應(yīng)用中,可以選擇使用外部觸發(fā)器引腳(例如TIM1_ETR),然后使用寄存器配置定時(shí)器的觸發(fā)模式和觸發(fā)源。
下面是一個(gè)基于STM32 HAL庫(kù)的外部觸發(fā)時(shí)鐘輸入示例代碼:
#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定時(shí)器是一種用于計(jì)時(shí)和控制輸出信號(hào)的硬件模塊,它具有多種功能和操作模式。STM32定時(shí)器的原理是利用一個(gè)計(jì)數(shù)器(Counter)來(lái)計(jì)數(shù),當(dāng)計(jì)數(shù)器的值達(dá)到某個(gè)閾值時(shí),就會(huì)產(chǎn)生一個(gè)中斷或觸發(fā)一個(gè)事件。其中,計(jì)數(shù)器的計(jì)數(shù)基準(zhǔn)由定時(shí)器時(shí)鐘源(Timer Clock Source)提供,可以是內(nèi)部時(shí)鐘(例如APB1時(shí)鐘)或外部時(shí)鐘(例如外部晶振)。
STM32定時(shí)器的計(jì)數(shù)器可以通過(guò)多種方式進(jìn)行控制和配置,其中包括:
接著看看串口的功能
分頻器(Prescaler):通過(guò)分頻器可以將定時(shí)器時(shí)鐘源的頻率降低,從而改變計(jì)數(shù)器的計(jì)數(shù)速度。分頻器的分頻值由預(yù)分頻器寄存器(PSC)設(shè)置,它是一個(gè)16位寄存器。
自動(dòng)重載寄存器(Auto-reload Register):自動(dòng)重載寄存器(ARR)存儲(chǔ)定時(shí)器計(jì)數(shù)器的最大值。當(dāng)計(jì)數(shù)器的計(jì)數(shù)值達(dá)到自動(dòng)重載寄存器的值時(shí),計(jì)數(shù)器會(huì)重新從零開(kāi)始計(jì)數(shù)。這種方式通常用于周期性產(chǎn)生中斷或控制PWM波形的占空比。
捕獲寄存器(Capture Register):捕獲寄存器(CCR)用于存儲(chǔ)定時(shí)器計(jì)數(shù)器的當(dāng)前值。當(dāng)捕獲到一個(gè)特定事件時(shí),捕獲寄存器會(huì)自動(dòng)被更新。這種方式通常用于測(cè)量外部事件的持續(xù)時(shí)間或頻率,例如測(cè)量脈沖寬度或計(jì)算輸入信號(hào)的頻率。
比較寄存器(Compare Register):比較寄存器(CCR)用于存儲(chǔ)與計(jì)數(shù)器進(jìn)行比較的值。當(dāng)計(jì)數(shù)器的值達(dá)到比較寄存器的值時(shí),會(huì)觸發(fā)中斷或控制輸出信號(hào)的狀態(tài)。這種方式通常用于產(chǎn)生精確的定時(shí)事件或控制PWM波形的頻率和占空比。
TM32的UART模塊支持全雙工模式,其中數(shù)據(jù)可以在同一個(gè)UART通道上同時(shí)發(fā)送和接收。
要使用STM32的UART模塊進(jìn)行全雙工通信,您需要進(jìn)行以下設(shè)置:
配置UART模塊的時(shí)鐘和波特率,使其能夠與外部設(shè)備通信。
配置UART模塊的發(fā)送和接收引腳,以便將數(shù)據(jù)發(fā)送到外部設(shè)備并從外部設(shè)備接收數(shù)據(jù)。
配置UART模塊的工作模式為全雙工模式,這可以通過(guò)將UART模塊的USART_InitTypeDef結(jié)構(gòu)體中的Mode字段設(shè)置為USART_MODE_TX_RX來(lái)實(shí)現(xiàn)。
在程序中編寫(xiě)發(fā)送和接收函數(shù),以便發(fā)送和接收數(shù)據(jù)。
以下是一個(gè)使用STM32的UART模塊進(jìn)行全雙工通信的示例代碼:
#include "stm32f10x.h" #includeUSART_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):在單工模式下,串口只能在一個(gè)方向上傳輸數(shù)據(jù),即數(shù)據(jù)只能單向發(fā)送或接收。在單工模式下,無(wú)法同時(shí)發(fā)送和接收數(shù)據(jù)。這種模式的應(yīng)用場(chǎng)景較為有限,通常只用于簡(jiǎn)單的數(shù)據(jù)采集或監(jiān)測(cè)任務(wù)。
半雙工模式(Half Duplex Mode):在半雙工模式下,串口可以在兩個(gè)方向上傳輸數(shù)據(jù),但不能同時(shí)進(jìn)行。也就是說(shuō),數(shù)據(jù)可以在發(fā)送和接收之間切換,但不能同時(shí)進(jìn)行。這種模式廣泛應(yīng)用于需要雙向通信的應(yīng)用場(chǎng)景,例如工業(yè)自動(dòng)化和機(jī)器人控制。
全雙工模式(Full Duplex Mode):在全雙工模式下,串口可以在兩個(gè)方向同時(shí)傳輸數(shù)據(jù),也就是說(shuō),可以同時(shí)發(fā)送和接收數(shù)據(jù)。這種模式的應(yīng)用場(chǎng)景最為廣泛,通常用于數(shù)據(jù)通信、網(wǎng)絡(luò)通信等領(lǐng)域。
不同串口模式的異同在于其能否同時(shí)進(jìn)行數(shù)據(jù)的發(fā)送和接收。單工模式只能單向傳輸數(shù)據(jù),半雙工模式可以雙向傳輸數(shù)據(jù)但不能同時(shí)進(jìn)行,全雙工模式可以同時(shí)進(jìn)行數(shù)據(jù)的雙向傳輸。因此,在實(shí)際應(yīng)用中,需要根據(jù)具體的場(chǎng)景和需求選擇適合的串口模式。
SPI全雙工模式:在SPI全雙工模式下,數(shù)據(jù)可以同時(shí)在主機(jī)和從機(jī)之間傳輸。主機(jī)通過(guò)發(fā)送時(shí)鐘信號(hào)來(lái)控制數(shù)據(jù)傳輸,每次傳輸一個(gè)字節(jié)或者一個(gè)字(16位)。SPI全雙工模式是最常用的SPI模式,應(yīng)用于數(shù)據(jù)傳輸速度要求較高、需要雙向數(shù)據(jù)傳輸?shù)膱?chǎng)景。
SPI半雙工模式:在SPI半雙工模式下,數(shù)據(jù)只能在主機(jī)和從機(jī)之間單向傳輸。主機(jī)先發(fā)送數(shù)據(jù),然后從機(jī)接收數(shù)據(jù),或者從機(jī)先發(fā)送數(shù)據(jù),然后主機(jī)接收數(shù)據(jù)。SPI半雙工模式應(yīng)用于一些只需要單向數(shù)據(jù)傳輸?shù)膱?chǎng)景,例如LED顯示、IO擴(kuò)展等。
SPI主機(jī)模式:在SPI主機(jī)模式下,主機(jī)控制SPI通信的時(shí)序和數(shù)據(jù)傳輸,從機(jī)被動(dòng)接受并響應(yīng)主機(jī)的控制。SPI主機(jī)模式常用于控制多個(gè)SPI從機(jī)的場(chǎng)景。
SPI從機(jī)模式:在SPI從機(jī)模式下,從機(jī)被動(dòng)接受來(lái)自主機(jī)的控制和數(shù)據(jù)傳輸。SPI從機(jī)模式應(yīng)用于一些只需要單個(gè)從機(jī)的場(chǎng)景。
不同SPI模式的異同在于其能否同時(shí)進(jìn)行雙向數(shù)據(jù)傳輸,以及數(shù)據(jù)傳輸時(shí)的時(shí)序和控制方式。
SPI全雙工模式和半雙工模式的主要區(qū)別在于雙向傳輸?shù)哪芰?,而SPI主機(jī)模式和從機(jī)模式的主要區(qū)別在于SPI通信的控制者是主機(jī)還是從機(jī)。
SPI(Serial Peripheral Interface,串行外圍設(shè)備接口)是一種簡(jiǎn)單的、高速的串行通信協(xié)議,用于在微控制器和外部設(shè)備之間傳輸數(shù)據(jù)。SPI協(xié)議是一種同步協(xié)議,數(shù)據(jù)在時(shí)鐘信號(hào)的控制下進(jìn)行傳輸。
SPI協(xié)議的基本通信原理是:
在SPI通信中,需要至少兩個(gè)設(shè)備,一個(gè)作為主設(shè)備,另一個(gè)或多個(gè)作為從設(shè)備。主設(shè)備負(fù)責(zé)控制SPI通信的時(shí)序和數(shù)據(jù)傳輸,從設(shè)備被動(dòng)接受并響應(yīng)主設(shè)備的控制。
SPI通信中有四條信號(hào)線:SCK、MOSI、MISO和SS。SCK是時(shí)鐘信號(hào)線,由主設(shè)備產(chǎn)生;MOSI是主設(shè)備發(fā)送數(shù)據(jù)到從設(shè)備的信號(hào)線;MISO是從設(shè)備發(fā)送數(shù)據(jù)到主設(shè)備的信號(hào)線;SS是片選信號(hào)線,用于選擇從設(shè)備。在多個(gè)從設(shè)備的情況下,每個(gè)從設(shè)備都需要有一個(gè)獨(dú)立的片選信號(hào)線。
在SPI通信中,主設(shè)備產(chǎn)生時(shí)鐘信號(hào),每個(gè)時(shí)鐘周期傳輸一個(gè)比特位,總線的數(shù)據(jù)傳輸是由主設(shè)備控制的。主設(shè)備先選擇一個(gè)從設(shè)備,即在對(duì)應(yīng)的片選信號(hào)線拉低,然后向從設(shè)備發(fā)送數(shù)據(jù)。從設(shè)備在接收到數(shù)據(jù)后,根據(jù)協(xié)議進(jìn)行響應(yīng),并將響應(yīng)數(shù)據(jù)發(fā)送給主設(shè)備。主設(shè)備接收完從設(shè)備的響應(yīng)數(shù)據(jù)后,選擇下一個(gè)從設(shè)備或結(jié)束通信。
SPI協(xié)議的優(yōu)點(diǎn)是傳輸速度快、控制簡(jiǎn)單、通信穩(wěn)定可靠。SPI通信速度可以達(dá)到幾十MHz,具有很高的實(shí)時(shí)性和實(shí)時(shí)控制性能。
三瓜倆棗的價(jià)格還給個(gè)USB
USB OTG(On-The-Go)控制器:USB OTG控制器可以支持主機(jī)和設(shè)備兩種USB模式,因此可以在連接不同USB設(shè)備時(shí)自動(dòng)識(shí)別主機(jī)和設(shè)備角色,并切換到相應(yīng)的模式。USB OTG控制器支持USB 2.0標(biāo)準(zhǔn),能夠?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主機(jī)設(shè)備。在這種模式下,微控制器可以作為USB設(shè)備與主機(jī)進(jìn)行通信,如傳輸數(shù)據(jù)、控制外圍設(shè)備等。USB設(shè)備接口支持USB 2.0標(biāo)準(zhǔn),能夠?qū)崿F(xiàn)高速、全速和低速的數(shù)據(jù)傳輸。
USB引導(dǎo)加載器:STM32F103系列微控制器還支持通過(guò)USB引導(dǎo)加載器(USB bootloader)對(duì)程序進(jìn)行燒錄,這種方式不需要額外的燒錄器件,只需通過(guò)USB接口即可進(jìn)行程序下載。這種方式便于生產(chǎn)線上的批量燒錄和固件更新。
USB DMA(Direct Memory Access)控制器:STM32F103系列微控制器還支持USB DMA控制器,可以實(shí)現(xiàn)高效的USB數(shù)據(jù)傳輸。DMA控制器能夠直接將USB數(shù)據(jù)傳輸?shù)絻?nèi)存中,從而減少CPU的負(fù)擔(dān),提高數(shù)據(jù)傳輸效率。
完事了家人們
SDIO是一種標(biāo)準(zhǔn)的接口協(xié)議,它可以用于SD卡,MMC(MultiMediaCard)卡等存儲(chǔ)卡的數(shù)據(jù)交換。STM32F103的SDIO接口支持SD卡的SD1.0、SD1.1、SD2.0和SD3.0標(biāo)準(zhǔn),最高傳輸速度可達(dá)到48Mbps。
SDIO接口的主要功能包括:
初始化:配置SDIO時(shí)鐘、總線寬度、傳輸模式、數(shù)據(jù)超時(shí)等參數(shù)。
SD卡識(shí)別:通過(guò)發(fā)送CMD0命令使SD卡進(jìn)入Idle狀態(tài),并發(fā)送CMD8命令獲取SD卡的電壓范圍和支持的接口版本。
卡信息讀?。和ㄟ^(guò)發(fā)送CMD9命令讀取SD卡的CSD(Card Specific Data)寄存器和CID(Card Identification)寄存器,獲取SD卡的制造商信息、容量、傳輸速率等信息。
數(shù)據(jù)讀寫(xiě):通過(guò)發(fā)送CMD17和CMD18命令讀取SD卡的數(shù)據(jù)塊,通過(guò)發(fā)送CMD24和CMD25命令寫(xiě)入數(shù)據(jù)塊。
卡狀態(tài)監(jiān)測(cè):通過(guò)發(fā)送CMD13命令查詢SD卡的狀態(tài),包括卡是否準(zhǔn)備好、當(dāng)前傳輸狀態(tài)、錯(cuò)誤狀態(tài)等。
DMA傳輸:STM32F103的SDIO接口支持DMA傳輸,可以減少CPU的負(fù)擔(dān),提高數(shù)據(jù)傳輸效率。
最后兩個(gè),打完收工:
誰(shuí)懂啊,家人們
輸入和輸出
定時(shí)器這塊沒(méi)有完全吃透,準(zhǔn)備先寫(xiě)51或者是MSP430的時(shí)鐘系統(tǒng)。
這個(gè)就是定時(shí)器的數(shù)據(jù)手冊(cè),不知道為什么倒著寫(xiě)
①CK_PSC是定時(shí)器時(shí)鐘TIMxCLK,經(jīng)APB1預(yù)分頻器后分頻提供。
②定時(shí)器時(shí)鐘經(jīng)過(guò)PSC 預(yù)分頻器之后,即CK_CNT,用來(lái)驅(qū)動(dòng)計(jì)數(shù)器計(jì)數(shù)。
③計(jì)數(shù)器CNT 是一個(gè)16 位的計(jì)數(shù)器,向上,向下,向上/下計(jì)數(shù)模式,最大計(jì)數(shù)值為65535。當(dāng)計(jì)數(shù)達(dá)到自動(dòng)重裝載寄存器的時(shí)候產(chǎn)生更新事件,并清零從頭開(kāi)始計(jì)數(shù)。
④自動(dòng)重裝載寄存器ARR 是一個(gè)16位的寄存器,這里面裝著計(jì)數(shù)器能計(jì)數(shù)的最大數(shù)值。當(dāng)計(jì)數(shù)到這個(gè)值的時(shí)候,如果使能了中斷的話,定時(shí)器就產(chǎn)生溢出中斷。
計(jì)數(shù)器信號(hào)
其中CK_CNT時(shí)鐘就類(lèi)似心跳,CNT計(jì)數(shù)器就類(lèi)似心跳次數(shù)。要實(shí)現(xiàn)60秒定時(shí),CK_CNT是1s,我們?cè)O(shè)置CNT計(jì)數(shù)器向上計(jì)數(shù)開(kāi)啟中斷,因?yàn)橹挥幸绯鰰r(shí),也就是計(jì)數(shù)到65535時(shí)才會(huì)有中斷,那么我們?cè)O(shè)置CNT計(jì)數(shù)器為65535-60=65475,開(kāi)始計(jì)時(shí),那么60秒后就會(huì)產(chǎn)生中斷。
設(shè)置自動(dòng)重裝載寄存器ARR也為65475,當(dāng)CNT計(jì)數(shù)器溢出時(shí),自動(dòng)重裝載寄存器ARR就會(huì)自動(dòng)裝載到CNT計(jì)數(shù)器中,就能實(shí)現(xiàn)自動(dòng)循環(huán)定時(shí)60秒。經(jīng)過(guò)上面分析,精確定時(shí)的關(guān)鍵在于CK_CNT的頻率,而CK_CNT是由定時(shí)器時(shí)鐘分頻而來(lái)的。
注:為什么需要中間對(duì)齊模式:
在永磁同步電機(jī)的控制中,需要對(duì)電機(jī)的三相定子施加一定的電壓,才能控制電機(jī)轉(zhuǎn)動(dòng)。現(xiàn)在用的較多的是SVPWM(SVPWM的具體原理會(huì)在后面另寫(xiě)一篇博客說(shuō)明),要想產(chǎn)生SVPWM波形,需要控制的三相電壓呈如下形式,即A、B、C三相的電壓是中間對(duì)齊的,這就需要用到stm32定時(shí)器的中間對(duì)齊模式了。
審核編輯:劉清
-
單片機(jī)
+關(guān)注
關(guān)注
6044文章
44629瀏覽量
639033 -
ARM
+關(guān)注
關(guān)注
134文章
9180瀏覽量
369477 -
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121304 -
STM32
+關(guān)注
關(guān)注
2273文章
10926瀏覽量
357813 -
電源系統(tǒng)
+關(guān)注
關(guān)注
3文章
628瀏覽量
37921
原文標(biāo)題:萬(wàn)字長(zhǎng)文解讀STM32-1
文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論