天天看點

【長文】STM32嵌入式面試知識點總結

作者:沃愛單片機

#頭條創作挑戰賽#

一、STM32F1和F4的差別?

解答:

參看:STM32開發 – STM32初識

核心不同:F1是Cortex-M3核心,F4是Cortex-M4核心;

主頻不同:F1主頻72MHz,F4主頻168MHz;

浮點運算:F1無浮點運算機關,F4有;

功能性能:F4外設比F1豐富且功能更強大,比如GPIO翻轉速率、上下拉電阻配置、ADC精度等;

記憶體大小:F1内部SRAM最大64K,F4有192K(112+64+16)。

二、介紹以下STM32啟動過程?

解答:

參看:STM32開發 – 啟動流程

通過Boot引腳設定,尋找初始位址

初始化棧指針 __initial_sp

指向複位程式 Reset_Hander

設定異常中斷 HardFault_Handler

設定系統時鐘 SystemInit

調用C庫函數 _main

三、介紹以下GPIO?

解答:

參看:STM32開發 – GPIO詳解

GPIO 8種工作模式(gpio_init.GPIO_Mode):

(1) GPIO_Mode_AIN 模拟輸入

(2) GPIO_Mode_IN_FLOATING 浮空輸入

(3) GPIO_Mode_IPD 下拉輸入

(4) GPIO_Mode_IPU 上拉輸入

(5) GPIO_Mode_Out_OD 開漏輸出

(6) GPIO_Mode_Out_PP 推挽輸出

(7) GPIO_Mode_AF_OD 複用開漏輸出

(8) GPIO_Mode_AF_PP 複用推挽輸出

APB2負責 AD,I/O,進階TIM,序列槽1。

APB1負責 DA,USB,SPI,I2C,CAN,序列槽2345,普通TIM,PWR

GPIO框圖剖析:

參看:STM32-GPIO詳解

【長文】STM32嵌入式面試知識點總結

四、UART

  • 問題一:串行通信方式介紹?

    同步通信:I2C 半雙工,SPI 全雙工

    異步通信:RS485 半雙工、RS232 全雙工

  • 問題二:序列槽配置?

    序列槽設定的一般步驟可以總結為如下幾個步驟:

    (1)序列槽時鐘使能,GPIO時鐘使能

    (2)序列槽複位

    (3)GPIO端口模式設定

    TX的GPIO工作模式為:GPIO_Mode_AF_PP;//複用推挽輸出

    RX的GPIO工作模式為:GPIO_Mode_IN_FLOATING;//浮空輸入

    (4)序列槽參數初始化

    主要包含:波特率設定(115200)、8個資料位、1個停止位、無奇偶校驗位、無硬體資料流控制、收發模式。

    (5)開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟)

    (6)使能序列槽

    (7)編寫中斷處理函數

  • 問題三:USART主要特點?

    (1)全雙工操作(互相獨立的接收資料和發送資料);

    (2)同步操作時,可主機時鐘同步,也可從機時鐘同步;

    (3)獨立的高精度波特率發生器,不占用定時/計數器;

    (4)支援5、6、7、8和9位資料位,1或2位停止位的串行資料桢結構;

    (5)由硬體支援的奇偶校驗位發生和檢驗;

    (6)資料溢出檢測;

    (7)幀錯誤檢測;

    (8)包括錯誤起始位的檢測噪聲濾波器和數字低通濾波器;

    (9)三個完全獨立的中斷,TX發送完成、TX發送資料寄存器空、RX接收完成;

    (10)支援多機通信模式;

    (11)支援倍速異步通信模式。

解答:

參看:STM32開發 – 序列槽詳解

應用場景:GPS、藍牙、4G子產品

五、I2C

  • 問題一:I2C 總線在傳送資料過程中共有三種類型信号?

    (1)開始信号:SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送資料。

    (2)結束信号:SCL 為高電平時,SDA 由低電平向高電平跳變,結束傳送資料。

    (3)應答信号:接收資料的 IC 在接收到 8bit 資料後,向發送資料的 IC 發出特定的低電平脈沖,表示已收到資料。CPU 向受控單元發出一個信号後,等待受控單元發出一個應答信号,CPU 接收到應答信号後,根據實際情況作出是否繼續傳遞信号的判斷。若未收到應答信号,由判斷為受控單元出現故障。

  • 問題二:I2C配置主機模式端口該怎麼配置?

    硬體模式:複用開漏輸出、既不上拉也不下拉。(快速模式:400 Kbit/s)

    軟體模拟:推挽輸出、配置上拉電阻。

  • 問題三:I2C仲裁機制?

    參看:S5PV210開發 – I2C 你知道多少?(三)

    I2C 仲裁機制,了解了 線“與”(Wired-AND),就一目了然了。

    簡單說,它遵循“低電平優先”的原則,即誰先發送低電平誰就會掌握對總線的控制權。

解答:

參看:STM32開發 – PMIC、I2C詳解

硬體模式: 是有通信速率設定的

/* STM32 I2C 快速模式 */

#define I2C_Speed 400000

/* 通信速率 */

I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;

軟體模拟: 沒有設定通信速率,該怎麼計算呢?

通過I2C總線位延遲函數 i2c_Delay:

static void i2c_Delay(void)
{
	uint8_t i;

	/* 
	 	下面的時間是通過安富萊AX-Pro邏輯分析儀測試得到的。
		CPU主頻72MHz時,在内部Flash運作, MDK工程不優化
		循環次數為10時,SCL頻率 = 205KHz 
		循環次數為7時,SCL頻率 = 347KHz, SCL高電平時間1.5us,SCL低電平時間2.87us 
	 	循環次數為5時,SCL頻率 = 421KHz, SCL高電平時間1.25us,SCL低電平時間2.375us 
        
    IAR工程編譯效率高,不能設定為7
	*/
	for (i = 0; i < 10; i++);
}           

應用場景:PMIC、加速度計、陀螺儀

六、SPI

  • 問題一:SPI需要幾根線?

    SPI 接口一般使用 4 條線通信:

    MISO 主裝置資料輸入,從裝置資料輸出。

    MOSI 主裝置資料輸出,從裝置資料輸入。

    SCLK 時鐘信号,由主裝置産生。

    CS 從裝置片選信号,由主裝置控制。

  • 問題二:SPI通信的四種模式?

    SPI 有四種工作模式,各個工作模式的不同在于 SCLK 不同, 具體工作由 CPOL,CPHA 決定。

    (1)CPOL: (Clock Polarity),時鐘極性:

    SPI的CPOL,表示當SCLK空閑idle的時候,其電平的值是低電平0還是高電平1:

    CPOL=0,時鐘空閑idle時候的電平是低電平,是以當SCLK有效的時候,就是高電平,就是所謂的active-high;

    CPOL=1,時鐘空閑idle時候的電平是高電平,是以當SCLK有效的時候,就是低電平,就是所謂的active-low;

【長文】STM32嵌入式面試知識點總結

(2)CPHA:(Clock Phase),時鐘相位:

相位,對應着資料采樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,

0對應着第一個邊沿,1對應着第二個邊沿。對于:

CPHA=0,表示第一個邊沿:

對于CPOL=0,idle時候的是低電平,第一個邊沿就是從低變到高,是以是上升沿;

對于CPOL=1,idle時候的是高電平,第一個邊沿就是從高變到低,是以是下降沿;

CPHA=1,表示第二個邊沿:

對于CPOL=0,idle時候的是低電平,第二個邊沿就是從高變到低,是以是下降沿;

對于CPOL=1,idle時候的是高電平,第一個邊沿就是從低變到高,是以是上升沿;

【長文】STM32嵌入式面試知識點總結
  • 問題三:該如何确定使用哪種模式?

    (1)先确認從機需求的 SCLK 極性,不工作時是在低電位還是高電位,由此确認 CPOL 為 0 或 1。

    看原理圖,我們設定串行同步時鐘的空閑狀态為高電平是以我們選擇 SPI_CPOL_High。

    也就是CPOL為1

    (2)再由slave晶片 datasheet 中的時序圖确認 slave 晶片是在 SCLK 的下降沿采集資料,還是在SCLK的上升沿。

    翻譯一下:

    W25Q32JV通過SPI相容總線通路,包括四個信号:串行時鐘(CLK),晶片選擇(/CS),串行資料輸入(DI)和串行資料輸出(DO)。标準SPI指令使用DI輸入引腳串行地将指令、位址或資料寫入CLK上升沿上的裝置。DO輸出引腳用于從CLK下降沿上的裝置讀取資料或狀态。支援模式0(0,0)和3(1,1)的SPI總線操作。模式0和

    模式3關注的是當SPI總線主端處于待機狀态,資料沒有被傳輸到串行Flash時CLK信号的正常狀态。對于模式0,在下降和上升時,CLK信号通常是低的

    邊緣/ CS。對于模式3,在/CS的下降和上升邊緣上CLK信号通常是高的。

    既然串行同步時鐘的空閑狀态為高電平,這裡我們選擇第二個跳變沿,是以選擇 SPI_CPHA_2Edge。

    也就是CPHA為1

    即,我們選擇的是模式3(1,1)。

【長文】STM32嵌入式面試知識點總結

解答:

參看:STM32開發 – W25Q32JV SPI FlASH詳解

參看:詳解SPI中的極性CPOL和相位CPHA

應用場景:SPI Flash,W25Q32 存儲器容量 32Mb (4M x 8),即4M byte

七、CAN

  • 問題一:CAN總結介紹一下?

    CAN控制器根據 CAN_L 和 CAN_H上 的電位差來判斷總線電平。總線電平分為顯性電平和隐性電平,二者比居其一。發送方通過使總線電平發生變化,将消息發送給接收方。

  • 問題二:CAN初始化配置步驟?

    (1)配置相關引腳的複用功能,使能CAN時鐘

    (2)設定CAN工作模式及波特率等(CAN初始化環回模式,波特率500Kbps )

    (3)設定濾波器

  • 問題三:CAN發送資料格式?

    CanTxMsg TxMessage;

    TxMessage.StdId=0x12; // 标準辨別符

    TxMessage.ExtId=0x12; // 設定擴充标示符

    TxMessage.IDE=CAN_Id_Standard; // 标準幀

    TxMessage.RTR=CAN_RTR_Data; // 資料幀

    TxMessage.DLC=len; // 要發送的資料長度 發送8個位元組

    for(i=0;i<len;i++)

    TxMessage.Data[i]=msg[i]; //資料

解答:

參看:STM32開發 – CAN總線詳解

八、DMA

  • 問題一:DMA介紹?

    直接存儲器存取(DMA) 用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速資料傳輸。無須CPU幹預,資料可以通過DMA快速地移動,這就節省了CPU的資源來做其他操作。

  • 問題一:DMA傳輸模式有幾種?

    DMA_Mode_Circular 循環模式

    DMA_Mode_Normal 正常緩存模式

    應用場景:GPS、藍牙,都是用的循環采集,DMA_Mode_Circular模式。

解答:

參看:STM32開發 – DMA詳解

一個比較重要的函數,擷取目前剩餘資料量大小,根據設定的接收buff大小減去目前剩餘資料量 ,得到目前接收資料大小。

九、中斷

  • 問題一:描述一下中斷的處理流程?

    (1)初始化中斷,設定觸發方式是上升沿/下降沿/雙沿觸發。

    (2)觸發中斷,進入中斷服務函數

  • 問題二:STM32的中斷控制器支援多少個外部中斷?

    STM32的中斷控制器支援19個外部中斷/事件請求:

    從圖上來看,GPIO 的管腳 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别對應中斷線 0 ~ 15。

    另外四個EXTI線的連接配接方式如下:

    ● EXTI線16連接配接到PVD輸出

    ● EXTI線17連接配接到RTC鬧鐘事件

    ● EXTI線18連接配接到USB喚醒事件

    ● EXTI線19連接配接到以太網喚醒事件(隻适用于互聯型産品)

    中斷服務函數清單:

    IO口外部中斷在中斷向量表中隻配置設定了7個中斷向量,也就是隻能使用7個中斷服務函數。

    EXTI0_IRQHandler

    EXTI1_IRQHandler

    EXTI2_IRQHandler

    EXTI3_IRQHandler

    EXTI4_IRQHandler

    EXTI9_5_IRQHandler

    EXTI15_10_IRQHandler

解答:

參看:STM32開發 – 外部中斷詳解

十、STM32有幾個時鐘源?

STM32 有5個時鐘源:HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部時鐘,RC振蕩器,頻率為8MHz,精度不高。

②、HSE是高速外部時鐘,可接石英/陶瓷諧振器,或者接外部時鐘源,頻率範圍為4MHz~16MHz。

③、LSI是低速内部時鐘,RC振蕩器,頻率為40kHz,提供低功耗時鐘。 

④、LSE是低速外部時鐘,接頻率為32.768kHz的石英晶體。

⑤、PLL為鎖相環倍頻輸出,其時鐘輸入源可選擇為HSI/2、HSE或者HSE/2。倍頻可選擇為2~16倍,但是其輸出頻率最大不得超過72MHz。

解答:

參看:STM32開發 – 時鐘系統詳解

十一、RTOS的任務是怎麼寫的?如何切出這個任務?

解答:

一個任務,也稱作一個線程。

UCOS有一個任務排程機制,根據任務的優先級進行排程。

一個是硬體中斷, 那麼系統會将目前任務有關變量入棧,然後執行中斷服務程式,執行完成後出棧傳回.

另一個是任務之間的切換,使用的方法就是任務排程,每一個任務有自己的棧,順度也是一樣的入棧,然後執行另一個程式,然後出線傳回。

并非是每一任務按優先級順序輪流執行的,而是高優先級的任務獨占運作,除非其主動放棄執行,否則低優先級任務不能搶占,同時高優先級可以把放出去給低優先級任務使用的CPU占用權搶回來。是以ucos的任務間要注意插入等待延時,以便ucos切出去讓低優先級任務執行。

十二、UCOSII中任務間的通信方式有哪幾種?

解答:

在UCOSII中,是使用信号量、郵箱(消息郵箱)和消息隊列這些被稱作事件的中間環節來實作任務間的通信的,還有全局變量。

信号量:

參看:ucosII 信号量使用總結(舉例講解)

信号量用于:

1.控制共享資源的使用權(滿足互斥條件)

2.标志某時間的發生

3.使2個任務的行為同步

應用執行個體:互斥信号量

作為互斥條件,信号量初始化為1。

實作目标:調用序列槽發送指令,必須等待傳回“OK”字元過後,才能發送下一條指令。每個任務都有可能使用到此發送函數,不能出現沖突!

郵箱(消息郵箱):

消息隊列:

概念:

(1)消息隊列實際上就是郵箱陣列。

(2)任務和中斷都可以将一則消息放入隊列中,任務可以從消息隊列中擷取消息。

(3)先進入隊列的消息先傳給任務(FIFO)。

(4)每個消息隊列有一張等待消息任務的等待清單,如果消息列中沒有消息,則等待消息的任務就被挂起,直到消息到來。

應用場景:

序列槽接收程式中的接收緩沖區。

儲存外部事件。

十三、項目使用了自定義協定,是什麼結構?

解答:

了解過Modbus協定。

結構為:幀頭(SDTC)+幀長度+指令+流水号+資料+CRC校驗。

十四、uCOSII和Linux的差異?

解答:

μC/OS-II是專門為計算機的嵌入式應用設計的,μC/OS-II 具有執行效率高、占用空間小、實時性能優良和可擴充性強等特點, 最小核心可編譯至 2KB 。μC/OS-II 已經移植到了幾乎所有知名的CPU 上。

linux 免費,安全,穩定,應用範圍廣,在嵌入式上,伺服器上,家用機,都有廣泛應用。

μC/OS-II Linux 都适合用在嵌入式上。但μC/OS-II 是專為嵌入式而設計,這樣的結果是,運作效率更高,占用資源更少。

linux 都可以用作伺服器上,使用率高。linux 雖然不是專門針對伺服器而開發,但其源碼公開,完全可以修改,使得兩者差異不大,最主要的發行版redhat linux 就是在伺服器上用得很多的系統。

十五、Git送出代碼

問題:Git送出代碼過程?

解答:

1、顯示工作路徑下已修改的檔案:

$ git status           

2、進入修改檔案目錄:

$cd -           

3、顯示與上次送出版本檔案的不同:

$ git diff           

4、把目前所有修改添加到下次送出中:

$ git add .           

5、添加相關功能說明,(第一次送出使用這個)

$ git commit -s           

其中還要注明:

Fuction: 修改代碼的功能

Ticket: 對應Bug号

注意: 每一個檔案夾下都要重新提一次。

6、檢視送出代碼

$ tig .           

7、請勿修改已釋出的送出記錄! (以後送出使用這個)

$git commit --amend           

指令模式下:

:x ( 寫入檔案并退出)

8、推送到伺服器

$ git push origin HEAD:refs/for/master           

十六、ucosii和ucosiii和freeRTOS比較

  • 問題一:三者比較?

解答:

ucosii和freeRTOS比較:

(1)freeRTOS隻支援TCP/IP, uCOSii則有大量外延支援,比如FS, USB, GUI, CAN等的支援。(我們用于tbox要用到CAN,是以選擇uCOSii)

(2)freeRTOS 是在商業上免費應用。uCOSii在商業上的應用是要付錢的。

(3)任務間通訊freeRTOS隻支援隊列, 信号量, 互斥量。 uCOSii除這些外,還支援事件标志組,郵箱。

(4)理論上講,freeRTOS 可以管理超過64個任務,而uCOSii隻能管理64個。

ucosii和ucosiii比較:

那麼從μC/OS-II到μC/OS-III有哪些不同的地方呢?增加了什麼,我們看改動還是很大的。一個是原來隻有0~63個優先級,而且優先級不能重複,現在允許幾個任務使用同一個優先級,在同一個優先級裡面,支援時間片排程法;第二個是允許使用者在程式運作中動态配置實時作業系統核心資源,比如,任務、任務棧、信号量、事件标志組、消息隊列、消息數、互斥型信号量、存儲塊劃分和定時器,可以在程式運作中變更。這樣,使用者可以避免在程式編譯過程中出現資源不夠配置設定的問題。在資源複用上,也做了一些改進。μC/OS-II中,最多任務數有64個,到了版本2.82以後是256個,μC/OS-III中,使用者可以由任意多的任務、任意多的信号量、互斥型信号量、事件标志、消息清單、定時器和任意配置設定的存儲塊容量,僅受限于使用者CPU可以使用的RAM量。這個也是一個很大的擴充。(問:邵老師,它的這個數是啟動時就固定的,還是啟動後随便定?)它是配置的時候可以自由定義的,隻有你的RAM足夠大的話。第四點是增加了很多功能,功能總是越來越多的,大夥可以看一下的。原來這些功能在μC/OS-II裡面是沒有的。

十七、低功耗模式

  • 問題一:低功耗模式有幾種?喚醒方式是什麼?

解答:

【長文】STM32嵌入式面試知識點總結

十八、物聯網的架構

  • 問題一:物聯網的架構分為幾層?每一層都負責哪些功能?

解答:

分三層,物聯網從架構上面可以分為感覺層、網絡層和應用層,

(1)感覺層: 負責資訊采集和物物之間的資訊傳輸,資訊采集的技術包括傳感器、條碼和二維碼、 RFID射頻技術、音視訊等多媒體資訊,資訊傳輸包括遠近距離資料傳輸技術、自組織組網技術、協同資訊處理技術、資訊采集中間件技術等傳感器網絡。感覺層是實作物聯網全面感覺的核心能力,是物聯網中包括關鍵技術、标準化方面、産業化方面亟待突破的部分,關鍵在于具備更精确、更全面的感覺能力,并解決低功耗、小型化和低成本的問題。

(2)網絡層: 是利用無線和有線網絡對采集的資料進行編碼、認證和傳輸,廣泛覆寫的移動通信網絡是實作物聯網的基礎設施,是物聯網三層中标準化程度昀高、産業化能力昀強、昀成熟的部分,關鍵在于為物聯網應用特征進行優化和改進,形成協同感覺的網絡。

(3)應用層: 提供豐富的基于物聯網的應用,是物聯網發展的根本目标,将物聯網技術與行業資訊化需求相結合,實作廣泛智能化應用的解決方案集,關鍵在于行業融合、資訊資源的開發利用、低成本高品質的解決方案、資訊安全的保障以及有效的商業模式的開發。

十九、記憶體管理

  • 問題一:UCOS中記憶體管理的方法有哪些?

解答:

系統通過與記憶體分區相關聯的記憶體控制塊來對記憶體分區進行管理。

動态記憶體管理函數有:

建立動态記憶體分區函數OSMemCreate();

請求獲得記憶體塊函數OSMemGet();

釋放記憶體塊函數OSMemPut();

二十、Ucos中任務的狀态有哪幾種?畫出任務狀态之間的關系圖?

解答:

有5種狀态:

睡眠狀态、就緒狀态、運作狀态、等待狀态(等待某一事件發生)和中斷服務狀态。

UCOSII任務的5個狀态轉換關系:

【長文】STM32嵌入式面試知識點總結

二十一、ADC

  • 問題一:簡述STM32的ADC系統的功能特性?

    (1)12bit分辨率

    (2)自動校準

    (3)可程式設計資料對齊(轉換結果支援左對齊或右對齊方式存儲在16位資料寄存器)

    (4)單次和連續轉換模式

解答:

參看:STM32開發 – ADC詳解

二十二、系統時鐘

  • 問題一:簡述設定系統時鐘的基本流程?

    (1)打開HSE,等待就緒後,設定Flash等待操作。

    (2)設定AHB,APB1,APB2分頻系數,确定他們各自和系統時鐘的關系。

    (3)設定CFGR寄存器确定PLL的時鐘來源和倍頻系數(HSE外部8M*9倍=72MHz)。

    (4)使能PLL,将系統時鐘源切換到PLL.

解答:

二十三、HardFault_Handler處理

  • 問題一:造成原因?

    (1)數組越界操作;

    (2)記憶體溢出,通路越界;

    (3)堆棧溢出,程式跑飛;

    (4)中斷處理錯誤;

  • 問題二:處理方式?

    (1)在startup_stm32f10x_cl.s裡找到HardFault_Handler的位址重映射,并重新編寫,讓其跳轉到HardFaultHandle函數。

    (2)列印檢視R0、R1、R2、R3、R12、LR、PC、PSR寄存器。

    (3) 檢視Fault狀态寄存器組(SCB->CFSR和SCB->HFSR)

解答:

參看:STM32開發 – HardFault_Handler處理

參看:Cortex-M3和Cortex-M4 Fault異常應用之一 ----- 基礎知識

二十四、TTS語音合成方法

  • 問題一:sim7600 TTS語音使用什麼方法?

解答:

(1)使用unicode編碼合成聲音

AT+CTTS=1,”6B228FCE4F7F75288BED97F3540862107CFB7EDF”

内容是“歡迎使用語音合成系統”,子產品收發中文短信就是unicode編碼,是以很容易将短信朗讀出來;

(2)直接輸入文本,普通字元采用ASIIC碼,漢字采用GBK編碼。

AT+CTTS=2,”歡迎使用語音合成系統”

二十五、定時器

  • 問題一:已知STM32的系統時鐘為72MHz,如何設定相關寄存器,實作20ms定時?

解答:

參看:STM32開發 – Systick定時器

通過SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC))//1ms定時器

其中:

uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
#define SYSCLK_FREQ_72MHz  72000000
#define OS_TICKS_PER_SEC       1000    /* Set the number of ticks in one second               

如果需要20ms則,可以通一設定一個全局變量,然後定初值得為20,這樣,每個systick中斷一次,這個全局變量減1,減到0,即systick中斷20次,時間為:1ms*20=20ms。進而實作20ms的定時。

二十六、優先級

  • 問題一:如果是兩個優先級相同的任務怎麼運作?

解答:

使獲得信号量任務的優先級在使用共享資源期間暫時提升到所有任務最高優先級的高一個級别上,以使該任務不被其他任務所打斷,進而能盡快地使用完共享資源并釋放信号量,然後在釋放信号量之後,再恢複該任務原來的優先級别。

二十七、狀态機

  • 問題一:使用的什麼狀态機?

解答:

參看:STM32開發 – 狀态機與狀态切換邏輯

有限狀态機,(英語:Finite-state machine, FSM),又稱有限狀态自動機,簡稱狀态機。

參看:有限狀态機FSM詳解及其實作

假設狀态機的狀态轉換由下表所示:

【長文】STM32嵌入式面試知識點總結

實作:(使用switch語句)

//橫着寫
void event0func(void)
{
    switch(cur_state)
    {
        case State0:
             action0;
             cur_state = State1;
        break;
         case State1:
             action1;
             cur_state = State2;
        break;
         case State2:
             action1;
             cur_state = State0;
        break;
        default:break;
    }
}
 
void event1func(void)
{
    switch(cur_state)
    {
        case State0:
             action4;
             cur_state = State1;
        break;
        default:break;
    }
}
 
void event2func(void)
{
    switch(cur_state)
    {
        case State0:
             action5;
             cur_state = State2;
        break;
         case State1:
             action6;
             cur_state = State0;
        break;
        default:break;
    }
}           

二十八、器件選型

  • 問題一:STM32F407 VS STM32F103 主要功能及資源對比?

解答:

參看:STM32F407 VS STM32F103 主要功能及資源對比

原文出處:https://juyou.blog.csdn.net/article/details/116021595

繼續閱讀