版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六章STM32神舟I號編程提高篇(寄存器版本 通用輸入/輸出 GPIO GPIO管 STM32的GPIO 在STM32的IO 程01個LED 程 LED 程 LED 程04LED 時 STM32 STM32 程01STM3232MHZ 程02STM3240MHZ 程03STM3272MHZ 獨立按 STM32 程01STM32 程02STM32- 串口通信的收與 的TTL 于NPN和PNP RS-232與TTL STM32舟I的USB的TTL 程01$ 程 - 3 - 程04 - 程 1- 程 1- 程 1- 第六 STM32神舟I號編程提高篇(寄存器版本通用輸入/輸出管腳特性vSTM32F103RBT6總共51個通用輸入/輸出(GPIO)每個I/O端口位可以自由編I/O端口寄存器可按32位字被(不允許半字或字節(jié)GPIO應(yīng)用領(lǐng)域驅(qū)動LED控制片外器件或片外器件通檢測靜態(tài)輸管腳分配
1:端口AGPIO管腳描管腳名類通用輸入/輸出PA0管腳名類通用輸入/輸出PB0到管腳名類通用輸入/輸出PC0到管腳名類通用輸入/輸出PD0到管腳名類通用輸入/輸出PE0管腳名類通用輸入/輸出PF0到管腳名類通用輸入/輸出PG0到管腳名類復(fù)GPIO管腳硬件電路原理剖I/OARMI/O都是通用的,稱GPIO(GeneralPurposeInput/Output。在STM32中,每個GPIO端口包16個管腳,如PA端口是PA0~PA15。GPIO模塊支持多種可編程輸入/輸出管腳,GPIO模塊包可編程控制GPIO中------包括中斷發(fā) 邊沿觸發(fā)(上升沿、下降沿、雙邊沿觸發(fā) 電平觸發(fā)(高電平觸發(fā)、低電平觸發(fā)輸入/輸出管腳最大可承受5V電可通過編程控制GPIO 弱上拉或弱下-----2mA、4mA、8mA驅(qū)動,STM32管腳驅(qū)動最大是GPIO管腳可以被配置為多種工作模式,配置不同的模式實際就是的驅(qū)動電路有不電路分析時高阻態(tài)可做開路理解。你可以把它看作輸出(輸入電阻非常大。他的極限可以認(rèn)為懸空。也就是說理論上高阻態(tài)不是懸空,它是對地或?qū)﹄娫措娮铇O大的狀態(tài)。而實際應(yīng)用上與引腳的懸空幾乎是一樣的。如上圖所示,為GPIO管腳在高阻輸入模式下的等效結(jié)構(gòu)示意圖,表示管腳;這是一個管腳的情況,其它管腳的結(jié)構(gòu)也是同樣的,輸入模式的結(jié)構(gòu)比較簡單,就一個帶有觸發(fā)輸入(Sitt-triggeredinput)的三態(tài)緩沖器(U1),并具有很高的阻前電平狀態(tài)讀到總線上(InternalBus。輸入輸出端不僅能呈現(xiàn)0、1兩個信息狀態(tài),而且還能產(chǎn)生一種高阻抗?fàn)顟B(tài),即好像它們的輸推挽輸出可以提高輸出功率,能夠更好驅(qū)動外部的設(shè)備;推挽輸出的原理:在功率放大器號。如上圖所示,為GPIO管腳在推挽輸出模式下的等效結(jié)構(gòu)示意圖。U1是輸出鎖存器,執(zhí)行GPIO管腳寫操作時,在寫脈沖(WritePulse)的作用下,數(shù)據(jù)被鎖存到Q和/Q。T1和T2CMOS反相器,T1導(dǎo)通T2導(dǎo)通時都表現(xiàn)出較低的阻抗T1T2不會同時導(dǎo)通或同時關(guān)閉,最后形成的是推挽輸出。在推挽輸出模式下,GPIO還具有回讀功能,實現(xiàn)回讀功能的是一個簡單的三態(tài)門U2。注意:執(zhí)行回讀功能時,讀到的是管腳的輸出鎖存狀態(tài),而不是外部管腳Pin的狀態(tài)。推挽電路是兩個參數(shù)相同的三極管或MOSE以推挽方式存在于電路中各負(fù)責(zé)正負(fù)半周的波形放大任務(wù),電路工作時,兩只對稱的功率開關(guān)管每次只有一個導(dǎo)通,所以導(dǎo)通損耗小、效率高。輸出既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流。推拉式輸出級既提高電路的負(fù)載能力,又提高開關(guān)速度。推挽放大器的輸出級有兩個“(兩組放大元件),一個“臂”的電流增加時,另一個開漏輸出就是不輸出電壓,低電平時接地,高電平時不接地。如果外接上拉電阻,則在輸一直默認(rèn)是輸出高電平的。TTL/CMOS電平輸出等。如上圖所示,為GPIO管腳在開漏輸出模式下的等效結(jié)構(gòu)示意圖。開漏輸出和推挽輸出相比結(jié)構(gòu)基本相同,但只有下拉晶體管T1而沒有上拉晶體管。同樣,T1實際上也是多組可編程選擇的晶體管。開漏輸出的實際作用就是一個開關(guān),輸出“1”時斷開、輸出“0”時連接到ND(有一定內(nèi)阻。回讀功能:讀到的仍是輸出鎖存器的狀態(tài),而不是外部管腳Pn的狀態(tài)。因此開漏輸出模式是不能用來輸入的。開漏輸出的優(yōu)點是IC僅需很小的驅(qū)動電流就可以了,因為它主要是利用外部電路的驅(qū)動能力,這樣可以減少IC的驅(qū)動,并且外部需要什么樣的電壓,就上拉到相應(yīng)的電壓,需要多大的電流,也可以通過改變上拉電阻來調(diào)節(jié)電流,所以開漏輸出是非常靈活的一種輸出。鉗位二極管(用來保護(hù)GPIO管腳GPIO具有鉗位保護(hù)二極管,如下圖所示。其作用是防止從外部管腳Pin輸入的電壓過高或者過低。VDD3.3VPin輸入的信號(假設(shè)任何輸入信號都有D10.6V的壓降),則二極管D1導(dǎo)通,這樣就會把多于的電流引到VDD,而真正輸入到的信號電壓不會超過3.9V(3.3v+0.6v=3.9v。同理,如果從Pin輸入的信號電壓比GND還低,則由于二極管D2的作用,會把實際輸入的信號電壓鉗制在-0.6V左右。假設(shè)VDD=3.3V,GPIO設(shè)置在開漏模式下,外接10kΩ上拉電阻連接到5V電源,這正是鉗位二極管在起作用。雖然輸出電壓達(dá)不到滿幅的5V,但對于實際的數(shù)字邏輯通常3.5V以上就算是高電平了。如果確實想進(jìn)一步提高輸出電壓,一種簡單的做法是先在GPIO管腳上串聯(lián)一只二極1N4148T1關(guān)閉,在Pin處得到的電壓是3.3+VD1+VD3=4.5V,電壓提升效果明顯;向管腳寫“0”時,T1導(dǎo)通,在Pin處得到的電壓是VD3=0.6V,仍屬低電平。以上這節(jié)就是主要介紹管腳的基本驅(qū)動原理,下面開始剖析具體的 腳STM32的GPIO管腳深入分析上我們介紹管腳實的硬件原,以及一腳被配置不同的模式際是不同的驅(qū)動電路,這些驅(qū)動電路可以適用于不同的場合。STM23的每個GPIO引腳都可以由軟件配置成輸出(推挽或開漏(帶或不帶上拉或下拉或復(fù)用的外設(shè)功能端口。多數(shù)GPIO(ADC功能的管腳之外,其他的GPIO引腳都有大電流通過能力,這些具體如下8種模式:1)輸入浮空(這個輸入模式,輸入電平必須由外部電路確定,要根據(jù)具體電路,加外部上拉電阻或下拉電阻,可以做按鍵識別)2)輸入上拉(打開IO上拉電阻3)輸入下拉(打開IO下拉電阻4)模擬輸入(應(yīng)用ADC模擬輸入5)開漏輸出(輸出端相當(dāng)于三極管的集電極.要得到高電平狀態(tài)需要上拉電阻才行適合于做電流型的驅(qū)動,其吸收電流的能力相對強(20ma以內(nèi)).能驅(qū)動大電流和大電壓,LED就使用這種模式。)6推挽式輸出(可以輸出高,低電平,連接數(shù)字器件。推挽式輸出輸出電阻小,帶負(fù)載能力強)7)推挽式復(fù)用功能(復(fù)用是指該引腳打開remap功能8)開漏復(fù)用功能(復(fù)用是指該引腳打開remap功能每個IO口可以自由編程,單IO口寄存器必須要按32位bit被。STM32的很多IO5V兼容的,這些IO5V電平的外設(shè)連接的時候很有優(yōu)勢IO口是容的),我們打開STM32F103RBT的手冊,看到21頁,對FT有詳細(xì)的解釋:STM32的每個O端口都有7(這里要注意的是關(guān)于硬件管腳的信息可以通過手冊找到資料,有關(guān)控制某個管腳寄存器的說明需要參考《STM32F10xxx;我們可以從手冊截圖的看到7個控制GPIO管腳的寄存器:他們分別是兩個端口配置寄存器,一個端口有0~15總共16個管腳;兩個寄存器分別描述輸入和輸出的,還有一個端口設(shè)置/清除寄存器來負(fù)責(zé)管腳是輸出高電平還是低電平,一個端口清除寄存器和端口配置鎖定寄存器。在需要的情況下,I/O引腳的外設(shè)功能可以通過一個特定的操作鎖定,以避免意外的寫入I/O寄存器,這里我們僅介紹常用的幾個寄存器,來完LEDSTM32IO控制寄存器的作用:STM32的CRL和CRH寄存器主要是用來IO管腳的方向和速率以及何種驅(qū)動模式STM32的ODR寄存器是用來控制IO口的輸出高電平還是低電平STM32的IDR寄存器主要是用來IO口當(dāng)前的輸入狀態(tài)(高低電平)的STM32BSRRIO端某一位直接進(jìn)行設(shè)置和清除操作,它所對應(yīng)的那個引腳位不產(chǎn)生影響;如果該寄存器某位為1,則清除對應(yīng)的引腳位。STM32LCKRLOCK序列后,下面開始分析常用的兩個32位配置寄存器GPIOx_CRL和GPIOx_CRH,CRL和CRH控制著每個IO口的模式及輸出速率,我們下面來介紹一下兩個寄存器,接下來我們看看端口低配置寄存器CRL的描述,如下圖所示:0X44444444(40100,從上圖可以看到,復(fù)位值其實就是配置端口為浮空輸入模式。從上圖還可以得出:STM32CRLIO端口(A~G)8IOCRL4CNF,低兩0X3表示推挽輸出模式(做輸出口用,50M速率0X8表示上/下拉輸入模式(做輸用、0XB表示復(fù)用輸出(使用IO口的第二功能STM32的IO口位配置表如下表可以看到CNFX是上面CRL寄存器里的配置位,這里配置位的不同,就會產(chǎn)生不同STM32輸出模式配置如下表這里CRL寄存器的MODE配置位的選項,不同的配置就會產(chǎn)生不同的速CRH的作用和CRL完全一樣,只是CRL控制的是低8位輸出口,而CRH控制的是8位輸出口,大家可以自己看STM32手冊,我們在這里CRH給個實例,比如我們要設(shè)置PORTB的12位為上拉輸入,13位為推挽輸出。代碼如下:GPIOB->CRH&=0XFF00FFFF;//2個位原來的設(shè)置,同時也不影響其他位的設(shè)置GPIOB->CRH|=0X00380000;//PB12輸入,PB13輸出通過這3句話的配置,我們就設(shè)置了PB12為上拉輸入,PB13為推挽IDR是一個GPIOx_IDR的端口輸入數(shù)據(jù)寄存器的簡稱(ODR是輸入數(shù)據(jù)寄存器的簡稱,要想知道某個IO口的狀態(tài),就要讀這個寄存器,再從讀出的寄存器值分析出某個管腳位的狀態(tài),就可以知道這個管腳的狀態(tài)了;IDR寄存器只用了低16位。該寄存器為只讀16位的形式讀出。該寄存器各位的描述如下圖所示:ODRODR對應(yīng)寄存器位置1即對應(yīng)的GPIO管腳就會輸出高電平。該寄存器也只用了低16位,并且該寄存器可讀可寫,如果讀的話,從該寄存器讀出來的數(shù)據(jù)都是0,所以讀是沒有意義的;只有寫是有效的,GPIOx_IDR是端口的輸入數(shù)據(jù)寄存器,GPIOx_ODR是端口的輸出寄存器,我腳的輸入輸出模式是通過GPIOx_CRLGPIOx_CRH兩個寄存器來配置的,但是每個端口的16個引腳它們有的可能是輸出模式,有的是輸入模式,甚至一會輸出一會輸入,而GPIOx_IDR和GPIOx_ODR兩個寄存器是以字模式(讀一次就是2個字節(jié),一個字等于2個字節(jié))而不能以bit模式(bit模式表示一次一個bit位,一個字節(jié)等于8個bit,一個字等于16個bit),GPIOx_IDR只能讀,而GPIOx_ODR可以讀寫。關(guān)于GPIO的輸出模式下幾種速度的區(qū)別:2MHz、10MHz、50MHz;這個又可以理解為輸出驅(qū)動電路的不同響應(yīng)速度(在I/O口的輸出部分安排了多個響應(yīng)速度不同的輸出驅(qū)動電路,用戶可以根據(jù)自己的需要選擇合適的驅(qū)動電路,通過選擇速度來選擇不同的輸出驅(qū)動電路模塊,達(dá)到最佳的噪聲控制和降低功耗的目的。那為什么要幾種速率呢?如果選擇了不合適的速率會有什么影響呢?管腳的速度就好比是信號收發(fā)的頻率,速度快就表示信號收發(fā)的頻率高;如果信號頻率為10MHz,而你配置了2MHz的帶寬,那么就會丟失很多數(shù)據(jù),很多數(shù)據(jù)點截取不到,這個10MHz的方波很可能就變成了正弦波。這個就好比是公路的設(shè)計時速,汽車速度低于設(shè)計時速時,可以平穩(wěn)的運行,如果超過設(shè)計時速就會顛簸,甚至翻車。所以管腳的輸入輸出速率可以理解為,輸出驅(qū)動電路的帶寬,即一個驅(qū)動電路可以不失真地通過信號的最大頻率;如果一個信號的頻率超過了驅(qū)動電路的響應(yīng)速度,就有可能信號失真。帶寬速度高的驅(qū)動器耗電大、噪聲也大,帶寬低的驅(qū)動器耗電小、噪聲也小;比如:高頻的驅(qū)動電路,噪聲也高,當(dāng)不需要高的輸出頻率時,請選用低頻驅(qū)動電路,這樣非常有利于提高系統(tǒng)的EMI性能。當(dāng)然如果要輸出較高頻率的信號,但卻選用了較低頻率的驅(qū)動模塊,很可能會得到失真的輸出信號。關(guān)鍵是GPIO的引腳速度跟應(yīng)用匹配,比如:USART串口,若最大波特率只需115.2k,1M等于1000k,那用2MHz的速度就夠了,既省電也噪聲小,STM32最低的速率是2MHz,已經(jīng)可以滿足要求了。I2C接口,若使用400k波特率,也可以選用2M的速度夠了;當(dāng)然若想把余量留大些,可以選用10M的GPIO引腳速度。SPI18M9M50MGPIO的引腳速度,我們這里一定要使得GPIO的速度大于外部應(yīng)用的速度,這好像就是在高速上跑車,而不是在田埂上開。高速上跑車,車可以開最快的速度,而不怕翻車??赡苁菐讉€比特(bit,所以波特率跟比特率是有區(qū)別的。的有效位(bi)數(shù)來表示,其單位為每秒比特數(shù)bi/s(bp)、每秒千比特數(shù)(Kbps)或每秒兆比特數(shù)(Mbps)來表示(此處K和M分別為1000和1000000)。=在STM32中如何配置片內(nèi)外設(shè)使用的IO端口首先,一個外設(shè)在使用前,必須先配置和激活啟動該外設(shè)的時鐘,比如GPIO端口B,那么就要激活GPIOB的時鐘,比如GPIOA,那么使用PA2管腳前,必須要前激活GPIOA端時鐘被啟動之后,再根據(jù)這個具體功能,對這個外設(shè)進(jìn)行相應(yīng)的設(shè)置和配置,這樣的好處是可以降低STM32的功耗,因為需要用到的外設(shè)才被激活,激活的外設(shè)會消耗芯片的比較多的功耗;不需要使用的外設(shè)無需初始化,這樣設(shè)計可以降低的功耗;好處尤其體現(xiàn)在類似手持設(shè)備,功耗比較小,使得電池更加耐用。那么如何配置管腳采用哪種模式呢?這里粗略總結(jié)對應(yīng)到外設(shè)的輸入輸出功能基本有種情況
管腳輸出:需要根據(jù)電路的配置選擇對應(yīng)的管腳為復(fù)用功能的推挽輸出或復(fù)用功能的開漏輸出。管腳輸入:則根據(jù)電路的配置可以選擇浮空輸入、帶上拉輸入或帶下拉輸入 對應(yīng)的管腳:配置管腳為模擬輸入值得注意的是,這里如果把端口配置成復(fù)用輸出功能,則該引腳與它當(dāng)前連的信號電路斷開,和復(fù)用功能信號電路連接,所以將管腳配置成復(fù)用輸出功能后,如果只激活了該引腳的GPIO端口的時鐘,而忘記把復(fù)用功能的時鐘激活,那么它的輸出將不確定,這樣會產(chǎn)生異常的現(xiàn)象。例程01單個LED點燈閃爍程LED燈的正極接的是3.3V電源,所以我們編程讓LED負(fù)極拉低即GPIO引腳端B的管腳2拉低,即PB2拉低,那么LED燈就會變亮,相關(guān)電路圖如下圖所示注意到,這里采用GPIO管腳的低電平點燈,原因是:處理器的GPIOLED的一端固定接到GND地上,那么對于處理器的GPIO管腳點燈時,就必須輸出高電平,這樣增加處理器的功耗。同時,大家要注意,在設(shè)計LED燈限流時,串接LED的右邊。一般,我們不會放在右邊,主要是LED燈,人手可能會去觸摸到,這樣可能會將上的靜電引導(dǎo)板件上,如果將電阻放在左邊,靜電經(jīng)過電阻后,會消弱很多,以致不會一下子因為靜電就將處理器燒毀。一般的LED燈需要15~20毫安的電流才可以點亮,我們這里是3.3V的電壓,經(jīng)過1K歐姆的限流電阻,用3.3V除以1000歐姆,理論值是33毫安的電流,足以點亮LED燈了。當(dāng)然如果電流如果過大,就會使得經(jīng)過的電流變下,LED燈可能點不亮或者比較暗;如果電阻過小,就會導(dǎo)致電流過大,可能燒掉LED燈,所以這個限流電阻選取也是有個范圍的。關(guān)鍵代碼相關(guān)代碼如下圖程序 intmain(void)//main是程序{/*APB2GPIOB*/RCC->APB2ENR|=RCC_APB2Periph_GPIOB; /*--GPIOCRLConfiguration設(shè)置IO端口低8位的模式(輸入還是輸出 /*--GPIOCRHConfiguration設(shè)置IO端口高8位的模式(輸入還是輸出 GPIOB->CRL&= GPIOB->CRL|= while{GPIOB->BRR=}}的時候,LED燈就會亮起來。 APB2ENR寄存器是APB2總線上的外設(shè)時鐘使能寄存器,其各位的描述如下圖:寄存器APB2ENR各位描我們要使能的是PORTB的時鐘使能位,大家可以從上表看得到在bit3這個位,只需要將這個位置1就可以使能PORTB的時鐘了,大家可以跟進(jìn)去的這句代碼,就能看到具體是設(shè)置的是這個RCC寄存器了 這句代碼8化成二進(jìn)制是1000剛好是bit3的這個位,然后對這個APB2ENR的端口時鐘置位 這句代碼相當(dāng)于:RCC->APB2ENR|0x00000008APB2ENR寄存器的bit3這個位(0開始,32位寄存器,bit3實際是在4位)1,剛好是GPIO端口B的時鐘位,那么GPIOB的時鐘就被使能了。 對GPIOB_BRR這個寄存器進(jìn)行賦值,我們看下圖對GPIOB_BRR的BR2位進(jìn)行置1操作,看寄存器說明可以知道,對BR2置1后,GPIOB_ODR寄存器的ODR2位就為0了,使得PB2管腳輸出低電平,燈被點亮(前面分析過,LED燈同樣,我們分析一下代碼:GPIOB->BSRR=GPIO_Pin_2;下面看下GPIOB_BSRR寄存因為GPIO_Pin_2是等于0x0004,所以GPIOB_BSRR寄存器的BS2被置1,可以看到說明該位1后,使GPIOB_ODR寄存器ODR2位就1了,PB2管腳輸出高電平,燈滅(前面分析過,LED燈是低電平點亮,高電平熄滅,具體原因請見前面的原理圖分析。其中Delay(0x2FFFFF)是延時函數(shù),所以在這個while循環(huán)里,LED燈亮一段時間后,就熄滅一段時間,周而復(fù)始,交替進(jìn)行。整段代碼就都分析完了,至于代碼中許多define#definePERIPH_BASE #defineAPB2PERIPH_BASE #define #define 關(guān)于這個寄存器的詳細(xì)說明大家可以看《STM32F10xxx參考手冊》的第7章例程02LED雙燈閃爍實LED燈的正極接3.3V電源,所以我們LED負(fù)極拉GPIO引腳端口APin2PIN3拉低,即PF6PF7;那么LED燈就會PA2PA3管腳拉高時,LED就會滅掉;亮和滅各經(jīng)過一段延時,就會變成閃爍的樣子,這里我們代碼,并且按下【復(fù)位】鍵,在神舟I號板上找到LED1LED3,可以這2燈不停的閃爍 intmain(void)//main是程序{/*APB2GPIOA*/RCC->APB2ENR|=RCC_APB2Periph_GPIOA; /*--GPIOCRLConfiguration設(shè)置IO端口低8位的模式(輸入還是輸出 /*--GPIOCRHConfiguration設(shè)置IO端口高8位的模式(輸入還是輸出)---*/GPIOA->CRL&= GPIOA->CRL|= /*設(shè)置GPIOA的PA2和PA3配置為通用推挽模式輸出50MHZ*/while{GPIOA->BRR=GPIO_Pin_2;GPIOA->BRR=GPIOA->BSRR=GPIO_Pin_2;GPIOA->BSRR=}}這里和上面程序不同之處是上面使用的是PA端口,這里使用的PA端口,并且PA端口的2個管腳來控制LED的亮滅例程 LED三個燈同時亮同時LEDPA2、PA3、PB2三個管腳拉高時,LED就會滅掉;亮3個LED燈不停的閃爍。 intmain(void)//main是程序{RCC->APB2ENR|=RCC_APB2Periph_GPIOA; /*--GPIOCRLConfiguration設(shè)置IO端口低8位的模式(輸入還是輸出 /*--GPIOCRHConfiguration設(shè)置IO端口高8位的模式(輸入還是輸出 GPIOA->CRL GPIOA->CRL|= /*設(shè)置GPIOA的PA2和PA3配置為通用推挽模式輸出50MHZ*/GPIOB->CRL GPIOB->CRL /*GPIOBPB250MHZwhile{GPIOA->BRR=GPIO_Pin_2;GPIOB->BRR=GPIOA->BSRR=GPIO_Pin_2;}}這里和上面程序不同之處是這里使用LED1、LED2和LED3三個管腳來同時控制燈的一亮一滅例程04LED流水燈程在神舟I號STM32開發(fā)板中,一共有三個LED指示燈,其中一個是電源指示燈,上電就點燈的;另外三個LED是由三個GPIO管腳控制,當(dāng)GPIO管腳輸出低電平時,對應(yīng)的LED燈亮;當(dāng)GPIO管腳輸出高電平時,對應(yīng)的LED燈滅。下圖為LED原理圖,其中GPIO管腳上串的電阻,主要起限流作用。防止電流過大損壞LED和GPIO管腳:代碼,并且按下【復(fù)位】鍵,在神舟I號板上找到E1、E2、E3三個燈,可以看到這三個燈輪流閃爍,流水燈。 intmain(void)//main是程序{RCC->APB2ENR|=RCC_APB2Periph_GPIOA; /*--GPIOCRLConfiguration設(shè)置IO端口低8位的模式(輸入還是輸出 /*--GPIOCRHConfiguration設(shè)置IO端口高8位的模式(輸入還是輸出 GPIOA->CRL GPIOA->CRL|= /*設(shè)置GPIOA的PA2和PA3配置為通用推挽模式輸出50MHZ*/GPIOB->CRL GPIOB->CRL /*GPIOBPB2配置為通用推挽模式輸出50MHZwhile{GPIOA->BSRR=/*LED1滅/*延時/*LED2滅/*延時GPIOA->BSRR=/*LED3滅/*/*對BRR設(shè)置為1,則GPIO輸出為0,LED燈亮*/GPIOA->BRR= /*LED1亮 /* /*LED2亮 /*延時*/GPIOA->BRR=GPIO_Pin_3; /*LED1亮*/ /*延時}}程序主要設(shè)計思路就是先將所有LED燈逐個經(jīng)過延時后熄滅,然后再逐個被點亮,如此循環(huán),形LED流水燈。時什么是時鐘從CPU的時鐘說起計算機是一個十分復(fù)雜的電子設(shè)備。它由各種集成電路和電子器件組成,每一塊集成電路工作,就必須有一個指揮,對各部分的工作進(jìn)行協(xié)調(diào)。各個元件的動作就是在這個指揮下按不念如時現(xiàn)誤就使統(tǒng)故,甚成機那夠繼續(xù)。計算機的“時鐘”等同于普通的時鐘,它實際上是由晶體振蕩它們被送入CPU中,再形成CPU時鐘。不同的CPU,其外部時鐘和CPU時鐘的關(guān)系是不同的,下表列出了幾種不同CPU外部時鐘和CPU時鐘的關(guān)系CPU時鐘周期通常為節(jié)拍脈沖或T周期,它是處理操作的最基本的單位說它只要一個節(jié)拍電位,在節(jié)拍電位又包含若干個節(jié)拍脈沖(時鐘周期。節(jié)拍電位表示一這些時間間隔可以相等,也可以不等。指令周期是取出并執(zhí)行一條指令的時指周期常常若干個CP周期,CU周期也為機周期,由CPU次內(nèi)存所花費的時間較長,因此通常用內(nèi)存中一個指令字的最短時間來規(guī)定CPU周期。這(通常為取指需要一個CPU周期時間。而一個CPU周期時間又包含若干個時鐘周期(通常為節(jié)拍脈沖或T周期,它是處理操作的最基本的單位。這些時鐘周期的總和則規(guī)定了一個CPU周期的時間寬度。STM32的時鐘系統(tǒng)時鐘的選擇是在啟動時進(jìn)行,復(fù)位時8MHZ的RC振蕩器被選為默認(rèn)的CPU時鐘,隨后可以選擇外部的、具失效的4-16MHZ時鐘;當(dāng)檢測到外部時鐘失效時,它將被,系統(tǒng)將自動地切換到的RC振蕩器。STM32HSI、HSE、LSI、LSE、PLL,它們都是時鐘所提供HSI是高速時鐘,RC振蕩器,頻率默認(rèn)為8MHz,可以從STM32時鐘樹中看 是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率范圍為4MHz~16MHz,時鐘樹的截圖如下選擇驅(qū)動RTC(RTC用于從停機/待機模式下自動喚醒系統(tǒng)為2~16倍,但是其輸出頻率最大不得超過72MHz,時鐘樹的截圖如下:STM32的時鐘深入分析眾所周知,微控制器(處理器)的運行必須要依賴周期性的時鐘脈沖來驅(qū)動——往往由在一些傳統(tǒng)的8位單片機諸如51,AVR,PIC等單片機,其也具備自身的一個時鐘樹系改的狀態(tài)(假設(shè)單片機處于正常工作的狀態(tài)。比如51單片機使型的12MHz晶振作為時鐘源,則外設(shè)如IO口、定時器、串口等設(shè)備的驅(qū)動時鐘速率便已經(jīng)是固定的,用戶無法將而STM32率不再有固定的關(guān)系,下面來詳細(xì)解析STM32微控制器的時鐘樹。下圖是STM32微控制下表是結(jié)合圖表明出來的標(biāo)釋1低速振蕩器2外部低速振蕩器3外部高速振蕩器(HSE,3-4高速振蕩器5PLL輸入選擇6RTC時鐘7PLL1分頻數(shù)寄存8PLL1倍頻寄存9系統(tǒng)時鐘選擇USB分頻AHB分頻寄存APB1分頻寄存AHB總APB1外設(shè)總APB2分頻寄存APB2外設(shè)總ADC預(yù)分頻寄存ADC外PLL2分頻數(shù)寄存PLL2倍頻寄存PLL時鐘源選擇寄存獨立看門狗設(shè)(GPIO3——5——7——21——8——9——11——對此條時鐘路徑做如下解析對于3,首先是外部的3-25MHz(前文已假設(shè)為8MHz)輸入對于7,設(shè)置外部晶振的分頻數(shù)(假設(shè)1分頻;對于8,設(shè)置PLL倍頻數(shù)(假設(shè)9倍頻;對于11,設(shè)置AHB總線分頻數(shù)(假設(shè)1分頻;對于13,時鐘到達(dá)AHB總線對于3,首先是外部的3-25MHz(前文已假設(shè)為8MHz)輸入;對于7,設(shè)置外部晶振的分頻數(shù)(假設(shè)1分頻;對于8,設(shè)置PLL倍頻數(shù)(假設(shè)9倍頻;對于11,設(shè)置AHB總線分頻數(shù)(假設(shè)1分頻;對于16,時鐘到達(dá)APB2總線;現(xiàn)在來計算一下 設(shè)備的最大驅(qū)動時鐘速率(各個條件已在上述要點中假設(shè)38MHz,由○5——○21PLL的時鐘源為經(jīng)過分頻后的外部1PLL的時鐘源為:8MHz18MHz。8、9PLL9PLL倍頻后的時鐘輸出選擇為系統(tǒng)時鐘,則得出系統(tǒng)時鐘為8MHz*9=72MHz。時鐘到達(dá)AHB預(yù)分頻器,由11知時鐘經(jīng)過AHB預(yù)分頻器之后的速率仍為72MHz時鐘到達(dá)APB2預(yù)分頻器,由15經(jīng)過APB2預(yù)分頻器后速率仍為72MHz時鐘到達(dá)APB2例程01STM3232MHZ頻率下跑點燈程序讓點燈程序在時鐘主頻32MHz下面運行,LED燈的正極接的是3.3V電源,所以我們編LED負(fù)極拉低GPIO引腳端口B的管腳2拉低,即PB2拉低,那么LED燈就會調(diào)試說明關(guān)鍵代碼 intmain(void)//main{/****21{unsignedcharsws=0;//將RCC_CR寄存器的值右移17位,等待HSERDY就緒,即外部時鐘就while(!(RCC-RCC->CFGR=0x00000400; 1001:PLL11倍頻輸 到STM32最大72MHZ工作頻率*///本例程希望設(shè)置成32MHZ的工作頻率,我們在這里嘗試一=while(!(RCC->CR>>25));//寄存器CR的PLLRDY位,等待PLL時鐘就緒RCC->CFGR|=1<<1; //將時鐘切換寄存器配置成用PLL輸出作為系統(tǒng)時鐘while(sws!=0x2) //等待CFGR寄存器的2,3位為10,系統(tǒng)正式切換到了PLL輸出作為時{//將CFGR寄存器右移2位,將2,3位SWS狀態(tài)移出來,見《STM32F10XXX參考手冊》54頁sws=RCC-sws&=0x3;}/**21/*APB2GPIOB*/RCC->APB2ENR|=RCC_APB2Periph_GPIOB; /*--GPIOCRLConfiguration設(shè)置IO端口低8位的模式(輸入還是輸出 /*--GPIOCRHConfiguration設(shè)置IO端口高8位的模式(輸入還是輸出 GPIOB->CRL&= GPIOB->CRL|= while{GPIOB->BRR=}/**程序總共2部分之第2部分點燈的配置結(jié)束 }這個例程主要是體現(xiàn)在如何設(shè)置時鐘,點燈的代碼和原理圖都在通用輸入/輸出 章節(jié)詳細(xì)說明了STM32的時鐘源有幾種,有的RC,也有外部的晶振,該選擇哪種,代碼里通過語句:RCC->CR|=0X00010000;使能外部的晶振,那么CR這個寄存器全稱叫做STM23的時鐘控制寄存器,在《STM32F10xxx60頁可以看到RCC_CR寄存器:RCC->CR|0X00010000160x0001000017位為1,其他31個位都為0,寄存器是從0開始,就是16位置HSEON置位就是把外部的高速時鐘使能,CPU所需要的時鐘是從外部獲??;然后接下繼續(xù)看另外一句代碼:while(!(RCC->CR>>17))while循環(huán)里,如果1,while就會一直循環(huán),如果為0的話while就會繼續(xù)執(zhí)行;while循環(huán)里還有!取反的操作,所以這句代碼的意while循環(huán)CR17位變1才往下執(zhí)行,那么看下17位是什么,翻到《STM32F10xxx參考手冊》的60頁:接下來,就是操作一個叫做RCC_CFGR寄存器,這個寄存器主要負(fù)責(zé)時鐘的倍(8M4432M了,所以倍,這個寄存器主要負(fù)責(zé)配置STM32總線上的一些時鐘參數(shù),比如時鐘切換狀態(tài)(可以知道目前哪個時鐘作為系統(tǒng)時鐘,比的時鐘,也有外部的,這個寄存器還負(fù)責(zé)STM32時鐘總線的配置,比如AHB時鐘總線,APB1時鐘總線,APB2時鐘總線是怎么分頻(有幾種分頻方式,例如不分頻,2分頻,4分頻,8分頻,16分頻等;還有ADC模數(shù)轉(zhuǎn)換的分頻;USB的分頻等;可以看到這個寄存器完成了許多的功能,下面來分析我們?nèi)绾尾僮鬟@個寄存器的:不設(shè)置,默認(rèn)HCLK是不分頻的,我們在這里只是提醒大家,做個配置師范:第3句代碼是左移16位后置1,表示HSE時鐘作為PLL輸入時鐘,HSE就是外部晶振第4句代碼表示將時鐘切換到外部時鐘,都設(shè)置好之后,通知STM32的可以將系統(tǒng)的可以從下圖看到,RCC_CFGR寄存器里的PLLSRC負(fù)責(zé)切換是HIS提供時鐘,還是外部HSE晶振提供時鐘,上面程序代碼選擇的是外部的HSE提供時鐘;緊接著,RCC_CFGR寄存器里PLLMUL,程序代碼里配置的是4倍頻,如果這里外部晶振8MHz的,4倍頻后32MHz的頻率(STM32最高72MHzRCC_CFGR寄存器里的SW負(fù)責(zé)HIS、PLLCLK、HSE三個時鐘來源取其中一個,程序里選擇的是PLLCLK,這個來自HSE外部晶振然后4倍頻的時鐘做為整個STM32的主時鐘。上圖上面已經(jīng)經(jīng)過詳細(xì)分析了,接下來就是一個while(sws!=0x2)循while(sws!={sws=RCC-sws&=}RCC_CFGR2位后,在0x3相當(dāng)于與上二11,最低兩位是1,其他都是0;這樣的意思就是把SWS這個系統(tǒng)時鐘切換狀態(tài)的值單獨截取出來,然后用while(sws!=0x2)語句一直等待SWS的值為0x2,0x2化成二進(jìn)制是10,就是PLL輸出作為系統(tǒng)時鐘,下圖可以知道:HSEPLL,因為我們可最后代碼配置好了,就開始點燈程序,具體細(xì)節(jié)請見代碼,因為上一章節(jié)已經(jīng)有詳細(xì)分析。例程 STM3240MHZ頻率下跑點燈程序讓點燈程序在時鐘主頻40MHz下面運行,其他不變,同上個例程一樣,唯一的改變就是把32MHz40MHz了。調(diào)試說明關(guān)鍵代碼RCC_CFGR寄存器的第18~21PLLMUL,當(dāng)外部晶振是8MHz關(guān)鍵代碼的改變與上面一模一樣,唯一的改變就是將RCC->CFGR|2<<18;變成了RCC->CFGR|3<<18;例程 STM3272MHZ頻率下跑點燈程序讓點燈程序在時鐘主頻72MHz下面運行,其他不變,同上個例程一樣,唯一的改變就是把40MHz72MHz了。調(diào)試說明關(guān)鍵代碼RCC_CFGR寄存器的第18~21PLLMUL,當(dāng)外部晶振是8MHzRCC->CFGR|7<<18;;16進(jìn)制的7化成二進(jìn)0111PLL設(shè)置成9倍頻輸出,8MHz乘以9倍頻就是72MHz。關(guān)鍵代碼的改變與上面幾乎一模一樣,改變的是將RCC->CFGR|=3<<18;變成注意:48M和72M之間是2等待周期;增加了LASH兩個時鐘周期的延時,CPU的頻,fash的運行頻率低所以cpu要從flash中取指令當(dāng)然要有個等待的時間了。怎么協(xié)調(diào):corex內(nèi)核“它的緩沖區(qū)沒有指令了,它就會去fash中預(yù)取,當(dāng)corex內(nèi)核肯定不是當(dāng)緩沖區(qū)中沒有指令了才去取指令,而是它認(rèn)為被cpu譯碼后剩余的預(yù)取指令少到一定程度后就去預(yù)取指令。關(guān)于LASH資料請見《STM32F10xxx閃存編程手冊》在該手冊上可以找到:具體看例程“07.STM32 獨立按鍵按鍵的分類目前,按鍵有多種形式。有機械接觸式,電容式,輕觸式等按制作工藝分硬板按鍵:帶彈簧的按鍵焊接在印刷電路板軟板鍵盤:以導(dǎo)電橡膠作為接觸材料放在以聚脂薄膜作為基底的印刷電所形成的按鍵按工藝原理分可將鍵盤分編碼鍵盤和編碼鍵盤編碼鍵盤鍵盤路內(nèi)包含硬件編當(dāng)按下某—個鍵后,鍵盤電路能直接提供與該鍵相對應(yīng)的編碼信息,例如ASCII碼。非編碼鍵盤的鍵盤電路中只有較簡單的硬件,采用軟件來識別按下鍵的位置,并提供與按下鍵相對應(yīng)的中間代碼送主機,然后由軟件將中間代碼轉(zhuǎn)換成相應(yīng)的字符編碼,例如ASCII碼;非編碼鍵鍵盤又分為獨立鍵盤和行列式(又稱矩陣式)鍵盤。按鍵屬性鍵盤實際上就是一組按鍵,在單片機電路中,通常用到的按鍵都是機械彈性開關(guān),當(dāng)開關(guān)閉合時,線路導(dǎo)通,開關(guān)斷開時,線路斷開,下圖是幾種單片機系統(tǒng)常見的按鍵:單片機的輸入控制用小彈性按鍵較好,單片機檢測按鍵的原理是:單片機的I/O口I/OI/O口賦一高電平,然后讓單片機不I/OI/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應(yīng)的指令。放的瞬間會有抖動現(xiàn)象出現(xiàn),這是因為通常的按鍵所用開關(guān)為機械彈性開關(guān),當(dāng)機械觸點斷開、5~l0ms。為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。通常我們手動按下鍵然后立即釋放,這個動作中穩(wěn)定閉合的時間超過20ms。因此單片機在檢測鍵盤是消抖是為了避免在按鍵按下或是抬起時電平劇烈抖動帶來的影響。按鍵的消抖,可用硬件或軟件兩種方法,硬件的去抖主要是用的去抖動電路,也有的去抖動;另外一種方式就是用軟件延時的方法就能很容易解決抖動問題,而沒有必要再添加多余的硬件電路。所以軟件消抖適合按鍵比較多的情況,而硬件消抖適合按鍵比較少的情況。如果按鍵較多,就用軟件方法去抖,即檢測出鍵閉合后執(zhí)行一個延時程序,5ms~10ms的延時,讓前沿抖動后再一次檢測鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。當(dāng)檢測到按鍵釋放后,也要給5ms~10ms的延時,待后沿抖動后才能轉(zhuǎn)入該鍵的處理程序,這樣就靠軟件模擬整個按鍵的過程,控制只取最穩(wěn)定的那個按鍵狀態(tài)。實現(xiàn)方法:一般來說,軟件消抖的方法是不斷檢測按鍵值,直到按鍵值穩(wěn)定。假設(shè)檢測到按鍵按下之后,為了避免檢測到很多的抖動,可以先延時5ms~10ms,再次檢測,如果按(因為如果不避開抖動的話,會有很多次按鍵輸入信號出現(xiàn),通過去抖,模擬人的按下的過程和時間,按下和松開按鍵實際也占用了20ms以上的時間,記錄正確的按鍵次數(shù)。STM32的位帶操作什么是位帶操還記得51單片機嗎?單片機51中也有位的操作,以一位(BIT)為數(shù)據(jù)對象的操作;51P12位獨立操作,P1.2=0P1.2=1P1口的第三個腳(bit2)0(輸出低電平)1(輸出高電平而現(xiàn)在STM32的位段、位帶別名區(qū)這些就是為了實現(xiàn)這樣的功能,可以在SRAM、外設(shè)空間實現(xiàn)對這些區(qū)域的某一位的單獨直接操作為什么要用位帶操作這里不得不提一個事情就是STM32的區(qū)域只能是32位的字,不能是字節(jié)或者半STM32GPIO51bit(一用一種新型的方式來解決這個問題,設(shè)計一個辦法來解決用一次32bit的這樣的操作達(dá)到51單片機那種只一個bit的效果。如何設(shè)計位帶操作的從編程者這個角度來說,我們操作的對象是一個一個的bit位,而對于STM32來說,它內(nèi)只能是32位bit每次的。如果要實現(xiàn)這個技術(shù),必須要做一個,也就是從1個bit到32個bit,就是用STM32的一次(32個bit)來代表編程者認(rèn)為的1個那STM32是如何解決的呢?它是在支持位帶操作的地方,取個別名區(qū)空間,而這個別名區(qū)空間可以讓一次32位來進(jìn)行,對這個別名進(jìn)行操作就相當(dāng)于對SRAM或者I/O存儲空間中的位(1個寄存器里的位1bit,1bit最后對應(yīng)32個位,因為STM32只能是32位去)進(jìn)行操作。為1個字);我們對這個別名區(qū)空間開始的某一字操作,置0或置1,就等于它的SRAM或I/O相應(yīng)的某地址的某一位的操作。STM32中位帶操作的具體部署情況是序支持位帶操作的兩個內(nèi)存區(qū)的范對應(yīng)的別名區(qū)空間范10x2000_0000-SRAM所對應(yīng)的別名32MB0x2200_0000-2片上外社區(qū)所對應(yīng)的別名區(qū)32MB空間0x4200_0000-下面是空間圖例如:SRAM區(qū)中的最低1MB空間中的0x2000_0000的8個bit,分別對應(yīng)如下地別名空Bit對應(yīng)的別名空432個432個432個432個432個432個432個432個就是說STM32的寄存器的任意一個位,都其實對應(yīng)的是別名區(qū)的32個位。如何用代碼與位帶操作掛STM32中,一個寄存器是32位的,32bit中的任bit所對應(yīng)的別名空間到底該如何呢?首先分為兩種情況,一種是在SRAM,一種是在FLASH是從0x4200_0000開始。假如在SRAM中的一個寄存器的地址是A,寄存器A中的第n個bit位。那么該如何計算呢?我們知道SRAM中別名區(qū)的起始地址是0x2200_0000對應(yīng)SRAM中實際寄存器地址0x2000_0000,SRAM中每1個bit,都會對應(yīng)別名區(qū)中的32個bit,那么實際地址的公式應(yīng)該如下:0x2200_0000+(SRAM0x2000_0000bit數(shù))*因為0x2200_0000這個地址每增加1,實際上就是增加8bit(一個地址對應(yīng)一個字節(jié)寄存1bit32bit,所以就4,地址本身18bit,8bit乘以4倍剛好是32bit。那么接下來SRAM0x2000_0000的bit數(shù)”該如何計算呢?bit,nbit位還必須加上一個n,好了,最后整理整個換算公式如下,F(xiàn)LASH與SRAMSRAM:0x22000000+((A‐0x20000000)*8+n)*4舉例說明比如我要如下寄存器GPIOB_BSRR中的第14bit位BS13,注意因為寄存器是0開始計數(shù)到31截止,所以第14bit相當(dāng)于是第13。移地址是0x10,的第14bit位的BS13。那么通過公式FLASH:0x420000000x4200_0000((0x40010c00-0x40000000)*812)*4=在這里我們就不具體計算了,SRAM也是同如何將理念轉(zhuǎn)化成代SRAM:0x22000000+((A‐0x20000000)*8+n)*4FLASH:0x42000000可以看0x2200_00000x4200_0000都共同有x200_0000這個數(shù)值;乘8相當(dāng)于再加上外面的那個乘以4,總共是乘以32,而n是乘以4;乘以32相當(dāng)于是數(shù)值向左移5位,乘以4相當(dāng)于向左邊移2位。嘗試將如下公#define這樣就可以用BITBAND(addr,bitnum)來表示寄存器里的任何一個bit位,大概原理講到例程01STM32按鍵點燈(無防抖通過連上PA0管腳的按鍵,學(xué)會如何從PA0管腳讀入一個輸入,如何配置GPIO口成輸入狀PA0獲取到輸入的數(shù)據(jù),STM32LED燈的狀態(tài)進(jìn)行取反。按鍵KEY1(SW3)是一端連接了GND,一端連接了PA8管腳;當(dāng)按鍵按下時,PA0管腳的電平值調(diào)試說明,關(guān)鍵代碼intmain(void)//main{unsignedintkey_up //LED初始化配置 //初始化控制按鍵的PA0端while{
// //If(KEY0==key_up=}}STM32的GPIO管腳要到按鍵按下,那么它需要被配置成輸入模式,之前有討論GPIO管腳的幾種模式,我們接下來還是復(fù)下,我們看看端口低配置寄存器CRH0X44444444(40100,從上圖可以看到,復(fù)位值其實就是配置端口為浮空輸入模式。從上圖還可以得出:STM32CRHIO端口(A~G)8IOCRH4CNF,低兩0X3表示推挽輸出模式(做輸出口用,50M速率0X8表示上/下拉輸入模式(做輸用、0XB表示復(fù)用輸出(使用IO口的第二功能STM32的IO口位配置表如下表可以看到CNFX是上面CRH寄存器里的配置位,這里配置位的不同,就會產(chǎn)生不同STM32輸出模式配置如下表這里CRH寄存器的MODE配置位的選項,不同的配置就會產(chǎn)生不同的速CRH的作用和CRL完全一樣,只是CRL控制的是低8位輸出口,而CRH控制的是8位輸出口,大家可以自己看STM32手冊,我們在這里CRL首先看下代碼:RCC_init();這里實現(xiàn)的是初始化配置時鐘頻率為72MHZ,之前的時鐘章節(jié)已經(jīng)將過了,具體細(xì)節(jié)可以看上一章的內(nèi)容,有詳細(xì)的介紹。下面看下連接按鍵的GPIO管腳的具體設(shè)置,這個函數(shù)里有3void{RCC->APB2ENR| GPIOA->CRL&= //PA0設(shè)置成輸入,PA0在按鍵原理圖默認(rèn)被上拉}RCC->APB2ENR|RCC_APB2Periph_GPIOAPORTA的時鐘,接下來開始使用PA0管腳,所以要先初始化PA端口的時鐘,才可以使用,下面看下原理圖:可以看到PA0默認(rèn)是被上拉到3.3V高電平的,GPIOA->CRL&=0XFFFFFFF0;這句代碼是PA0GPIO_CRL寄存4位清0,然GPIOA->CRL|0X00000008這句話GPIO_CRH寄存器的前4位賦值0x8,化成二進(jìn)制就是1000,通過查表:可以知道將GPIOA_CRL寄存器的A0管腳配置成1000,即上拉/下拉輸入模式,配置好A0管腳之后,如何才能知道按鍵按下呢?這時就需要時刻查看和A0管腳是否有電平的變化,那就要知道A0的管腳的電平值,而且還要不停的去檢測它是否有變化,因為我們希望當(dāng)按鍵按下的時候,我們能以最快的反映速度獲取到這一動作。ifKEY0==0)來判斷按鍵是否按下了,KEY0PA0,如果按鍵按PA0被拉GND變成低電平PA0就等0KEY0等0。那么KEY0如何反映到PA8的值的呢?接下來繼續(xù)分析代碼 BIT_ADDR(addr, MEM_ADDR(BITBAND(addr, 代碼(1):上面有講解,這個BITBAND(addr,bitnum)最后得出的是某寄存器里的某個bit位所代碼(2):unsignedlong*32位的長的地址的指針,或者說是32位的一個地址;然后*((volatileunsignedlong*)(addr))這個表示這個地址,長達(dá)32bitMEM_ADDR(addr)把從addr地址開始的連續(xù)32bit里的代碼(3):BIT_ADDR(addr,bitnum)表示某寄存器的地址,對應(yīng)的某bit 的空間的值,也就是說取出某寄存器的某bit位的值代碼(4):把PA的某個管腳,與BIT_ADDR進(jìn)行綁定關(guān)代碼(5)KEY0設(shè)置成PA0,使得KEY0能取到GPIOA_IDR寄存器1位也就是的這樣,這個例程的關(guān)鍵是是否取到了A0的值,取到了值之后,再進(jìn)行相關(guān)的操作,這個是大家可以自己定義的,在這個例程中,按一下按鍵,我們就將LED燈取反,原來是亮的就變成滅的,原來是滅的就變成亮的。例程 STM32按鍵點燈-增加了防抖的代示例簡介其他都與上個例程相同,唯一不同的就是增加了防抖代碼,在這里是用軟件調(diào)試說明按下PA0管腳所連的按鍵(按鈕1),每按一次,LED燈會由亮變滅,或者又滅變亮,關(guān)鍵代碼原理圖還是同上個例程一樣int //main是程序{unsignedintkey_up //LED初始化配置while{
key_up!key_up;}}代碼Delay(0xfffff)BUG就是如果長時間按著按鍵不動,while就如何去解決這個問題,按一次鍵就只亮一次,無論一次按多長時間。串口通信的收與發(fā)什么是串口通信串口通信是指外設(shè)和計算機間,通過數(shù)據(jù)信號線、地線、控制線等,按位進(jìn)行傳輸數(shù)據(jù)的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,但其傳輸速度比并行傳輸?shù)汀4谑怯嬎銠C上一種非常通用的設(shè)備通信協(xié)議。大多數(shù)計算機(不包括筆記本電腦包含兩個基于RS-232于獲取設(shè)備的數(shù)據(jù))。當(dāng)年51單片機內(nèi)置串,被認(rèn)為是微控制器發(fā)展史上的重大事件,因為當(dāng)時的串口是唯一一個微控制器與PC交互的接口。MCU微控制器經(jīng)過這么多年的發(fā)展,串口仍然串口通信的屬性通信存在的問否低(18根線的并行收發(fā)要節(jié)約成本(就好像大非常廣;如果你學(xué)的鳥語,那就只能跟鳥通信,沒有人能聽懂。串口到底有幾個標(biāo)準(zhǔn)?(經(jīng)常聽說有3線、5線串口傳統(tǒng)的串行接口標(biāo)準(zhǔn)有22根線,采用標(biāo)準(zhǔn)25芯D型插頭座(DB25),后來使用簡化為9D型插座(DB9),現(xiàn)在25芯插頭座已很少采用。RS-23225針的,所9針的,所謂全功能串口就是所有的針腳定義都使用上串口信號都做上去了。但是國內(nèi)的技術(shù)發(fā)現(xiàn),其實RS-232串口最主要使用的就是2,3線,另外的接口如果不使用的話,也不會出現(xiàn)很大的問題,所以,就在9針的基礎(chǔ)上做精簡,所以就有所謂的2,3,4,5,6,8線的串口出來了。2線串口只有RXD,TXD兩根基本的收發(fā)信號線;3線串口除了RXD和TXD,還GND;4~9線只是TXDRXD基礎(chǔ)上增加了相應(yīng)的控制信號線,依據(jù)實際需要進(jìn)行設(shè)計。串口的速度與距1520kb/s。RS-232是為點對點(即只用一對收、發(fā)設(shè)備)通訊而設(shè)計的,其驅(qū)動器負(fù)載為3~7kΩ。所以RS-232適合本地設(shè)備之間的通信。從串口通信衍生出422與485的通信方RS-232、RS-422與RS-485都是串行數(shù)據(jù)接口標(biāo)準(zhǔn),最初都是由電子工業(yè)(EIA)制訂并發(fā)布的,RS-232在1962年發(fā)布,命名為EIA-232-E,作為工業(yè)標(biāo)準(zhǔn),以保證不同廠RS-422由RS-232發(fā)展而來,它是為彌補RS-232之不足而。為改進(jìn)RS-232通信距離短、速率低的缺點,RS-422定義了一種平衡通口,將傳輸速率提高到10Mb/s,傳4000英尺(100kb/s時,并允許在一條平衡總線上連接最多10準(zhǔn)突保護(hù)特性,擴展了總線共模范圍,后命名為TIA/EIA-485-A標(biāo)準(zhǔn)。由于EIA建議標(biāo)準(zhǔn)都是以“RS”作為前綴,所以在通訊工業(yè)領(lǐng)域,仍然將上述標(biāo)準(zhǔn)以RS作前綴稱謂。RS-232、RS-422與RS-485標(biāo)準(zhǔn)只對接口的電氣特性做出規(guī)定,而不涉及接插件、電纜或協(xié)議,在此基礎(chǔ)上用戶可以建立自己的通信協(xié)議。因此在界的應(yīng)用,許多廠家都建立了一套通信協(xié)議,或公開或廠家獨家使用。如機廠家中的Sony與松下對機的RS-422控制協(xié)議是有差異的,服務(wù)器上的控制協(xié)議則了,如Louth、Odetis協(xié)議是公開的ProLINKProfile上的。串口的通信方式(串口屬于串行通信并行通信和串行通信51單片機與外界通信的基本方式有兩種:并行通信和串行通信,并行通信是指利用位地順序發(fā)送或接收。并行通信和串行通信的示意圖如下圖在每一條傳輸線傳輸速率相同時,并行通信的傳輸速度比和串行通信快。然而當(dāng)傳輸距離收錯誤,而且距離越長布線成本越高。所以并行通信目前主要用在短距離通信,比如處理器與外部的fah以及外部RAM以及各個功能模塊之間的通信。串行通信以其通信速率快和成本優(yōu)點成為了遠(yuǎn)距離通信的首選。RS232C串口,以及差分串行總線像RS485串口、USB接口、CAN接口、IEEE-1394接口、以太網(wǎng)接口、SA接口和PCIE接口等都屬于串行通信的范疇。下圖左側(cè)為每根數(shù)據(jù)線的數(shù)據(jù)同時到達(dá)接收方,被正確采樣的最理想情況;右側(cè)的圖為每根數(shù)據(jù)線的數(shù)據(jù)不能同時到達(dá)接收方而產(chǎn)生接收錯誤情形。串行通信又分為兩種方式:異步通信與同步通信A、異步通信及其協(xié)異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔不固定可以是任意長的,通信雙方必須使用約定的相同的一些規(guī)則(也叫通信協(xié)議。常見的傳送一個字符的或05、6、7、8等,構(gòu)成一個字符。一般采用ASCII0~255,8位表示。首先傳送最低位。(不是必須)奇偶校驗是有校驗位也是可以的。數(shù)據(jù)位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗)或奇數(shù)(奇校驗),以此來校驗數(shù)據(jù)傳送的正確性。01100000,那么對于偶0。1位、1.5位、2位的高電平。由于數(shù)⑤空閑位處于邏輯“1”狀態(tài),表示當(dāng)前線沒有數(shù)據(jù)傳送B、同步通信是指數(shù)據(jù)傳送是以一個幀(數(shù)據(jù)塊或一組字符)為傳輸單位,每個幀中包含有在程符間間,符時如圖所示同步通信的特點可以概括為1以數(shù)據(jù)塊為單位傳送信息12323 符CRC等三部分組成同步字符位于幀結(jié)構(gòu)開頭,用于確認(rèn)數(shù)據(jù)字符的開始數(shù)據(jù)字符在同步字符之后,字符個數(shù)不受限制,由所需傳輸?shù)臄?shù)據(jù)塊長度決校驗字符有 個,位于幀結(jié)構(gòu)末尾,用于接收端對接收到的數(shù)據(jù)字符的正確性的驗由于連續(xù)傳輸一個數(shù)據(jù)塊,故收發(fā)雙方時鐘必須相當(dāng)一致,否則時鐘漂移會造成接收要求高,電路結(jié)構(gòu)復(fù)雜。所有的串行接口電路都是以并行數(shù)據(jù)形式與CPU接口、而以串行數(shù)據(jù)形式與外部邏輯串口是如何解決干擾以及校驗的問什么是數(shù)據(jù)校驗?通俗的說,就是為保證數(shù)據(jù)的完整性,用一種指定的算法對原始數(shù)據(jù)計就說明數(shù)據(jù)是完整的。為了理解數(shù)據(jù)校驗,什么是最簡單的校驗?zāi)??最簡單的校驗就是把原始?shù)據(jù)和待比較數(shù)據(jù)低的。只適用于簡單的數(shù)據(jù)量極小的通信。串口通信使用的是奇偶校驗方法,具體實現(xiàn)方法是在數(shù)據(jù)和傳輸中,字節(jié)中額外增加有一模式就是一次發(fā)送8位的數(shù)據(jù)通訊,增加一位第9位用于放校驗值。奇偶校驗是一種校驗代碼傳輸正確性的方法。根據(jù)被傳輸?shù)囊唤M二進(jìn)制代碼的數(shù)位中“1”的個數(shù)是奇數(shù)或偶數(shù)來進(jìn)行校驗。采用奇數(shù)的稱為奇校驗,反之,稱為偶校驗。采用何種校驗是事先規(guī)定好的。通常專門設(shè)置一個奇偶校驗位,用它使這組代碼中“1”的個數(shù)為奇數(shù)或偶數(shù)。若用奇校驗,則當(dāng)接收端收到這組代碼時,校驗“1”的個數(shù)是否為奇數(shù),從而確定傳輸代碼的正確性。奇偶校驗?zāi)軌驒z測出信息傳輸過程中的部分誤碼(1位誤碼能檢出,2位及2位以上誤碼不能檢出,同時,它不能糾錯。在發(fā)現(xiàn)錯誤后,只能要求重發(fā)。但由于其實現(xiàn)簡單,仍得到了廣泛使用。什么是單片機的TTL電平?單片機是一種數(shù)字集成,數(shù)字電路中只有兩種電平:高電平和低電平;高電平和低平是通過單片機的管腳進(jìn)行輸入和輸出的,我們只要記住一句話,單片機管腳不是輸入就是輸出,不是高電平就是低電平。為了讓大家在初學(xué)的時候?qū)﹄娖教匦杂幸粋€清晰的認(rèn)識,我們暫且定義單片機輸出與輸入為TTL電平,其中高電平為+5V,低電平為OV。計算機的串口出來的為RS-232C電平,其中高電平為-5V—-12V,低電平為+5V—+12V。這里要強調(diào)的是,RS-232C電平為負(fù)邏輯電平,機之間要通信時,需要加電平轉(zhuǎn)換,我們在神舟51單片機實驗板上所加的電平轉(zhuǎn)換芯片是MAX3232(在串口DB9座附近)。初學(xué)者在學(xué)習(xí)時先掌握上面這點就夠了,若有請大家再看下面的知識點——常用邏輯電平。知識點:常用邏輯電常用的邏輯電平 TTL、CMOS、LVTTL、ECL、PECL、GTL、RS-232、RS-422、RS-485LVDS等。其中TTLCMOS的邏輯電平按典型電壓可分為四類:5V系列(5VTTL5VCMOS)、3.3V,2.5V1.8V5V的TTL和5V的CMOS是通用的邏輯電平。3.3V及以下的邏輯電平被稱為低電壓邏輯LVTTL2.5V1.8V那為什么TTL電平信號用的最多呢原因1:這是因為大部分?jǐn)?shù)字電路器件都用這個電平標(biāo)準(zhǔn)。就好像我們,國際通相互能交流。所以使得越來越多的電路器件使用這個電平標(biāo)準(zhǔn)。TTL電平數(shù)據(jù)表示通常采用二進(jìn)制,+5V等同于邏輯1,OV等同于邏輯O,這被稱為TTL(晶體管一晶體管邏輯電平信號系統(tǒng),這是計算機處理器控制的設(shè)備各部分之問通信的標(biāo)準(zhǔn)技術(shù)。TTL電平信號對于計算機處理器控制的設(shè)備的數(shù)據(jù)傳輸是很理想的,首先計算機處理器控制的設(shè)備的數(shù)據(jù)傳輸對于電源的要求不高,熱損耗也較低,另外TTL電平信號直接與集成電路連接而不需要價格昂貴的線路驅(qū)動器以及電路。原因2TTL電平的特點適合設(shè)備內(nèi)數(shù)據(jù)高速的傳輸。TTL的通信大多數(shù)情況是采用并行數(shù)據(jù)傳輸方式,但電平最高為+5V,電壓相對比較低,所以傳輸過程中會有電壓損耗和壓降,導(dǎo)致TTL的傳輸距離是有限的,一般只適合近距離傳輸;而且并行數(shù)據(jù)傳輸對于超過10英尺的距離就可能會有同步偏差,傳輸距離太遠(yuǎn),有可能造成數(shù)據(jù)不同步;所以TTL電平符近距離(在或者計算機進(jìn)行高速數(shù)據(jù)交互高速的并行傳輸,在數(shù)字電路要求數(shù)據(jù)處理速度高的時代來說,選擇TTL這個標(biāo)準(zhǔn)是正確的,可靠的。CMOS電平最高可達(dá)12V,CMOS電路輸出高電平在3V~12V之間,而輸出低電平接近0伏。源電壓可以在較大范圍內(nèi)變化,因而對電源的要求不像TTL集成電路那樣嚴(yán)格。TTL電路和CMOS電路的邏輯電平關(guān)系如下CMOS是場效應(yīng)管構(gòu)成,TTL為雙極晶體管構(gòu)成;因為TTL和COMS的高低電平的值不一樣,所以互相連接時需要電平的轉(zhuǎn)換。TTL電路是電流控制器件,而comsTTL電路的速度快,傳輸延遲時間短(5-10ns),但是功耗大;COMS電路的速度慢,傳輸延遲時間長(25-50ns),但功耗低,COMS電路本身的功耗與輸入信號的脈沖頻率有關(guān),頻率越高,集越熱,這是正常現(xiàn)象。路那樣嚴(yán)格。所以,用TTL電平在條件允許下他們就可以兼容。要注意到他們的驅(qū)動能力是不一樣的,CMOS的驅(qū)動能力會大一些,有時候TTL的低電平觸發(fā)不了CMOS電路,有的高電平會損壞TTL電路,在兼容性上需注意CMOS的高低電平之間相差比較大、性強,TTL則相差小,能力差CMOS的工作頻率較TTL略低TTL電平臨界值CMOS電平臨界值(設(shè)電源電壓為+5V)常用邏輯的特點如下74LS系列 輸入 輸出74HC系列 CMOS輸入:CMOS輸出:74HCT系列: CMOS輸入:TTL 輸出:CMOSCD4000系列:CMOS輸入:CMOS輸出:CMOS通常情況下,單片機、ARM、DSP、FPGA等各個器件之間引腳能否直接相連要參考以下方法進(jìn)行判斷:一般來說,壓的是可以相連的,不過最好還是好好查看技術(shù)手冊上的VIL(邏輯電平0的輸入電壓)、VIH(邏輯電平1的輸入電壓)、VOL(邏輯電平0的輸出電壓)、VOH(邏輯電平1的輸出電壓)的值,看是否能夠匹配。有些情況在一般應(yīng)用中沒有問題,雖然參數(shù)上有點不夠匹配,但還是在管腳的最大和最小值范圍之內(nèi),不過有可能在某些情況下可能就不夠穩(wěn)定,所以我們在設(shè)計電路的時候要盡量保持匹配,這樣是最佳的設(shè)計。關(guān)于NPN和PNP的三極管基礎(chǔ)知識?如果某一天,天氣很旱,江水沒有了,也就是大的水流那邊是空的。管理員這時候打開了小閥門,盡管小閥門還是一如既往地沖擊大閥門,并使之開啟,但因為沒有水流的存在,所以,并沒有水流出來。這就是三極管中的截止區(qū)。飽和區(qū)是一樣的,因為此時江水達(dá)到了很大很大的程度,管理員開的閥門大小已經(jīng)沒用了。那么NPN與PNP的三極管到底有些什么區(qū)別呢NPNB→E(小水流)C→E(大水流),E極電位最低,且正常放大時通常C極電位最高, VC>VB>VE半導(dǎo)體三極管也稱為晶體三極管,可以說它是電子電路中最重要的器件。它最主要的功能是電流放大和開關(guān)作用。接下來的一些使用中會用到。RS-232電平與TTL電平的轉(zhuǎn)換關(guān)于RS-232電平與TTL電平的特性面已經(jīng)講過,本節(jié)主要講解使用較多的計算機RS-232電平與單片機TTL電平之間的轉(zhuǎn)換方式。MAX232等可實現(xiàn)RS-232電平到TTL電平的轉(zhuǎn)換,但是現(xiàn)在用的較多還有MAX202,HIN232等,它們同時集成了RS-232電平和TTL電平之間的互轉(zhuǎn)。為豐富大家的知識,下面首先講解在沒有MAX3232這種現(xiàn)成電平轉(zhuǎn)換時,如何用二極管、三極管、電阻、電容等分立元件搭建一個簡單的RS-232電平與TTL電平之間的轉(zhuǎn)換電路。RS232TTL集成 都是由最基本電子元件組成,如電阻、電容、二極管、三極管等元件,為了方便用戶使用,制造商把這些具有一定功能的分立元件封裝到一個內(nèi),這樣就制成了我們使用的各種。學(xué)會本電路后,我們也就基本搞清了MAX232 的大致結(jié)構(gòu)。MAX232是把TTL電平從OV~5V轉(zhuǎn)換到3V~15V或-3V~-15V之間。如下圖所示:若發(fā)送低電平O,首先TXD(TTL低電平)發(fā)送數(shù)據(jù)時,TXD上是低電平,這時Q3(具體請看上節(jié)三極管的描述)PCRXD由空閑時的低電平變高電平,滿足條件。發(fā)送高電平l時,TXD為高電平,Q3截止,由于PCRXD高阻,而PCTXD平時是3~15V(RS232的高電平就是負(fù)的電壓,這點是要注意的,高電平并不是正電壓),通過D1和R7將其拉低PCRXD至-3~15V,此時計算機接收到的就是1。下面再反過來,PC發(fā)送信號,由單PCTXD為低電平-3~-15V時,Q4截止,單片機端的RXD被R9拉到5V高電平;當(dāng)PCTXD變高時,Q4導(dǎo)通RXD被Q4拉到低電平,這樣便實現(xiàn)的雙向轉(zhuǎn)換,這是一個很好的電路,值得大家學(xué)習(xí)。MAX232實現(xiàn)RS-232電平與TTL電平轉(zhuǎn)MAX232是公司生產(chǎn)的、包含 和驅(qū)動器的IC芯片,它的有一個電源電壓變換器,可以把輸入的+5V電源電壓變換成為RS-232輸出電平所需的+10V電壓。所以,采用此接口的串行通信系統(tǒng)只需單一的+5V電源就可以了。對于沒有+12V電源的場合,其適應(yīng)性更強,加之其價格適中,硬件接口簡單,所以被廣泛采用。MAX232實物和其引腳結(jié)構(gòu)和連接如下圖所示在上中上半部分電容ClC2C3C4及V+V-是電變換電路部分。在實際應(yīng)用中,器件源噪聲很敏感,因此VCC必須地加去耦C5其值為O.luF。按手冊中介紹,電容Cl,C2,C3,C4應(yīng)取1.OuF/16V的電解電容,經(jīng)大驗及實際應(yīng)4個電容都可以選用O.luF的非極性瓷片電容代替lOuF/16V的電解電容,在具體設(shè)計電路時,這4個電容要盡量靠近MAX232,以提高能力。T1INT2IN可直接連接TTL/CMOS電平的stm32主的串口發(fā)送端TXD;R1out,R2out可直接連接TTL/CMOS電平的stm32主的串行接收端RXD;Tlout,T2out可直PCRS232RXDR1INR2INPCRS232串口的發(fā)送端TXD?,F(xiàn)從MAX232中發(fā)送、接收中任選一路作為接口。要注意其發(fā)送、接T1INTXDPCRS232RXDT1outR1outRXDPCRS232TXDR1IN小引腳。串口波特率的理解在信息傳輸通道中,攜帶數(shù)據(jù)信息的信號單元叫碼元,每秒鐘通過信道傳輸?shù)拇a元數(shù)稱為碼元傳輸速率,簡稱波特率。波特率是指數(shù)據(jù)信號對載波的調(diào)制速率,它用單位時間內(nèi)載波調(diào)制狀態(tài)改變的次數(shù)來表示(也就是每秒調(diào)制了符號數(shù)),其單位是波特(Baud,symbol/s)。波特率是傳輸通道頻寬的指標(biāo)。它是對信號傳輸速率的一種度量。但是波特率有時候會同比特率,實際上后者是對信息傳輸速率(傳信率)的度量。當(dāng)1波特等于1比特的時候,波特率與比特率才相等;但是如果18比特的時候,那么每秒鐘發(fā)送的比特率是波特率的9倍,波特率可以被理解為單位時間內(nèi)傳輸碼元符號的個數(shù)(傳符號率),通過不同的調(diào)制方法可以在一個碼元上負(fù)載多個比特信息。所以,如果用公式表示,比特率在數(shù)值上和波特率有這樣的關(guān)系:波特率與比特率的關(guān)系為:比特率=波特率X單個調(diào)制狀態(tài)對應(yīng)的二進(jìn)制位數(shù)。單片機或計算機在串口通信時的速率用波特率表示,它定義為每秒傳輸二進(jìn)制代11bps(位/秒)240每個字符格式包含10位(1個起始位、1個停止位、8個數(shù)據(jù)位),這時的波特率為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026福建同安第一中學(xué)附屬學(xué)校校園招聘備考題庫附答案
- 2026福建省遴選公務(wù)員403人參考題庫附答案
- 2026福建福州市司法局行政復(fù)議輔助人員招聘3人參考題庫附答案
- 2026貴州貴陽市某國有企業(yè)招聘2人考試備考題庫附答案
- 2026青海海西州格爾木市公安局招聘警務(wù)輔助人員46人參考題庫附答案
- 中共臺州市路橋區(qū)委全面深化改革委員會辦公室關(guān)于公開選聘工作人員1人備考題庫附答案
- 常州市武進(jìn)區(qū)前黃實驗學(xué)校招聘考試備考題庫附答案
- 河南省科學(xué)院碳基復(fù)合材料研究院科研輔助人員招聘備考題庫附答案
- 紀(jì)檢監(jiān)察基礎(chǔ)知識
- 紀(jì)檢監(jiān)察培訓(xùn)課件匯編
- 監(jiān)獄干警給犯人授課課件
- 腰椎常見病變課件
- 甲狀腺乳腺外科診療規(guī)范
- 退換貨方案及措施
- 2025年華龍證券招聘考試題庫
- 森林撫育等服務(wù)采購項目方案投標(biāo)文件(技術(shù)文件)
- 隧道人員管理辦法
- 材料力學(xué)性能檢驗工安全教育培訓(xùn)手冊
- 健康經(jīng)濟學(xué)課件
- 2025年上海國資國企招聘筆試備考題庫(帶答案詳解)
- 小說影視化改編的深度解析
評論
0/150
提交評論