一、STM32F1和F4的區別?
解答:
參看:STM32開發 – STM32初識
內核不同:F1是Cortex-M3內核,F4是Cortex-M4內核;
主頻不同:F1主頻72MHz,F4主頻168MHz;
浮點運算:F1無浮點運算單位,F4有;
功能性能:F4外設比F1豐富且功能更強大,比如GPIO翻轉速率、上下拉電阻配置、ADC精度等;
內存大?。篎1內部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詳解
四、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;
(2)CPHA:(Clock Phase),時鐘相位:
相位,對應著數據采樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,
0對應著第一個邊沿,1對應著第二個邊沿。對于:
CPHA=0,表示第一個邊沿:
對于CPOL=0,idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;
對于CPOL=1,idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;
CPHA=1,表示第二個邊沿:
對于CPOL=0,idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;
對于CPOL=1,idle時候的是高電平,第一個邊沿就是從低變到高,所以是上升沿;
問題三:該如何確定使用哪種模式?
(1)先確認從機需求的 SCLK 極性,不工作時是在低電位還是高電位,由此確認 CPOL 為 0 或 1??丛韴D,我們設置串行同步時鐘的空閑狀態為高電平所以我們選擇 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開發 – 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發送數據格式?
解答:
參看:STM32開發 – CAN總線詳解
八、DMA
問題一:DMA介紹?
問題一:DMA傳輸模式有幾種?
解答:
參看:STM32開發 – DMA詳解
一個比較重要的函數,獲取當前剩余數據量大小,根據設置的接收buff大小減去當前剩余數據量 ,得到當前接收數據大小。
九、中斷
問題一:描述一下中斷的處理流程?
問題二:STM32的中斷控制器支持多少個外部中斷?
解答:
參看:STM32開發 – 外部中斷詳解
十、STM32有幾個時鐘源?
解答:
參看:STM32開發 – 時鐘系統詳解
十一、RTOS的任務是怎么寫的?如何切出這個任務?
解答:
一個任務,也稱作一個線程。
并非是每一任務按優先級順序輪流執行的,而是高優先級的任務獨占運行,除非其主動放棄執行,否則低優先級任務不能搶占,同時高優先級可以把放出去給低優先級任務使用的CPU占用權搶回來。所以ucos的任務間要注意插入等待延時,以便ucos切出去讓低優先級任務執行。
十二、UCOSII中任務間的通信方式有哪幾種?
解答:
在UCOSII中,是使用信號量、郵箱(消息郵箱)和消息隊列這些被稱作事件的中間環節來實現任務間的通信的,還有全局變量。
應用實例:互斥信號量
郵箱(消息郵箱):
消息隊列:
應用場景:
十三、項目使用了自定義協議,是什么結構?
解答:
了解過Modbus協議。
十四、uCOSII和Linux的差異?
解答:
μC/OS-II是專門為計算機的嵌入式應用設計的,μC/OS-II 具有執行效率高、占用空間小、實時性能優良和可擴展性強等特點, 最小內核可編譯至 2KB。μC/OS-II 已經移植到了幾乎所有知名的CPU 上。
十五、Git提交代碼
問題:Git提交代碼過程?
解答:
1、顯示工作路徑下已修改的文件:
2、進入修改文件目錄:
3、顯示與上次提交版本文件的不同:
4、把當前所有修改添加到下次提交中:
5、添加相關功能說明,(第一次提交使用這個)
其中還要注明:
7、請勿修改已發布的提交記錄! (以后提交使用這個)
命令模式下:
十六、ucosii和ucosiii和freeRTOS比較
問題一:三者比較?
解答:
ucosii和freeRTOS比較:
ucosii和ucosiii比較:
十七、低功耗模式
問題一:低功耗模式有幾種?喚醒方式是什么?
解答:
十八、物聯網的架構
問題一:物聯網的架構分為幾層?每一層都負責哪些功能?
解答:
分三層,物聯網從架構上面可以分為感知層、網絡層和應用層,
十九、內存管理
問題一:UCOS中內存管理的方法有哪些?
解答:
系統通過與內存分區相關聯的內存控制塊來對內存分區進行管理。
動態內存管理函數有:
二十、Ucos中任務的狀態有哪幾種?畫出任務狀態之間的關系圖?
解答:
有5種狀態:
UCOSII任務的5個狀態轉換關系:
二十一、ADC
問題一:簡述STM32的ADC系統的功能特性?
解答:
參看:STM32開發 – ADC詳解
二十二、系統時鐘
問題一:簡述設置系統時鐘的基本流程?
解答:
二十三、HardFault_Handler處理
問題一:造成原因?
問題二:處理方式?
解答:
參看:STM32開發 – HardFault_Handler處理
二十四、TTS語音合成方法
問題一:sim7600 TTS語音使用什么方法?
解答:
(1)使用unicode編碼合成聲音
二十五、定時器
問題一:已知STM32的系統時鐘為72MHz,如何設置相關寄存器,實現20ms定時?
解答:
參看:STM32開發 – Systick定時器
其中:
如果需要20ms則,可以通一設置一個全局變量,然后定初值得為20,這樣,每個systick中斷一次,這個全局變量減1,減到0,即systick中斷20次,時間為:1ms*20=20ms。從而實現20ms的定時。
二十六、優先級
問題一:如果是兩個優先級相同的任務怎么運行?
解答:
使獲得信號量任務的優先級在使用共享資源期間暫時提升到所有任務最高優先級的高一個級別上,以使該任務不被其他任務所打斷,從而能盡快地使用完共享資源并釋放信號量,然后在釋放信號量之后,再恢復該任務原來的優先級別。
二十七、狀態機
問題一:使用的什么狀態機?
解答:
參看:STM32開發 – 狀態機與狀態切換邏輯
有限狀態機,(英語:Finite-state machine, FSM),又稱有限狀態自動機,簡稱狀態機。
假設狀態機的狀態轉換由下表所示:
實現:(使用switch語句)
二十八、器件選型
問題一:STM32F407 VS STM32F103 主要功能及資源對比?
解答:
參看:STM32F407 VS STM32F103 主要功能及資源對比
審核編輯:湯梓紅
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
直接存儲器存取(DMA) 用來提供在外設和存儲器之間或者存儲器和存儲器之間的高速數據傳輸。無須CPU干預,數據可以通過DMA快速地移動,這就節省了CPU的資源來做其他操作。
DMA_Mode_Circular 循環模式DMA_Mode_Normal 正常緩存模式應用場景:GPS、藍牙,都是用的循環采集,DMA_Mode_Circular模式。
(1)初始化中斷,設置觸發方式是上升沿/下降沿/雙沿觸發。(2)觸發中斷,進入中斷服務函數
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_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler
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。
UCOS有一個任務調度機制,根據任務的優先級進行調度。
一個是硬件中斷, 那么系統會將當前任務有關變量入棧,然后執行中斷服務程序,執行完成后出棧返回.
另一個是任務之間的切換,使用的方法就是任務調度,每一個任務有自己的棧,順度也是一樣的入棧,然后執行另一個程序,然后出線返回。
信號量:
參看:ucosII 信號量使用總結(舉例講解)
信號量用于:
1.控制共享資源的使用權(滿足互斥條件)
2.標志某時間的發生
3.使2個任務的行為同步
作為互斥條件,信號量初始化為1。
實現目標:調用串口發送命令,必須等待返回“OK”字符過后,才能發送下一條命令。每個任務都有可能使用到此發送函數,不能出現沖突!
概念:
(1)消息隊列實際上就是郵箱陣列。
(2)任務和中斷都可以將一則消息放入隊列中,任務可以從消息隊列中獲取消息。
(3)先進入隊列的消息先傳給任務(FIFO)。
(4)每個消息隊列有一張等待消息任務的等待列表,如果消息列中沒有消息,則等待消息的任務就被掛起,直到消息到來。
串口接收程序中的接收緩沖區。
儲存外部事件。
結構為:幀頭(SDTC)+幀長度+指令+流水號+數據+CRC校驗。
linux 免費,安全,穩定,應用范圍廣,在嵌入式上,服務器上,家用機,都有廣泛應用。
μC/OS-II Linux 都適合用在嵌入式上。但μC/OS-II 是專為嵌入式而設計,這樣的結果是,運行效率更高,占用資源更少。
linux 都可以用作服務器上,使用率高。linux 雖然不是專門針對服務器而開發,但其源碼公開,完全可以修改,使得兩者差異不大,最主要的發行版redhat linux 就是在服務器上用得很多的系統。
$ git status
$cd -
$ git diff
$ git add .
$ git commit -s
Fuction: 修改代碼的功能
Ticket: 對應Bug號
注意:每一個文件夾下都要重新提一次。
6、查看提交代碼
$ tig .
$git commit --amend
:x ( 寫入文件并退出)
8、推送到服務器
$ git push origin HEAD:refs/for/master
(1)freeRTOS只支持TCP/IP, uCOSii則有大量外延支持,比如FS, USB, GUI, CAN等的支持。(我們用于tbox要用到CAN,所以選擇uCOSii)
(2)freeRTOS 是在商業上免費應用。uCOSii在商業上的應用是要付錢的。
(3)任務間通訊freeRTOS只支持隊列, 信號量, 互斥量。uCOSii除這些外,還支持事件標志組,郵箱。
(4)理論上講,freeRTOS 可以管理超過64個任務,而uCOSii只能管理64個。
那么從μC/OS-II到μC/OS-III有哪些不同的地方呢?增加了什么,我們看改動還是很大的。一個是原來只有0~63個優先級,而且優先級不能重復,現在允許幾個任務使用同一個優先級,在同一個優先級里面,支持時間片調度法;第二個是允許用戶在程序運行中動態配置實時操作系統內核資源,比如,任務、任務棧、信號量、事件標志組、消息隊列、消息數、互斥型信號量、存儲塊劃分和定時器,可以在程序運行中變更。這樣,用戶可以避免在程序編譯過程中出現資源不夠分配的問題。在資源復用上,也做了一些改進。μC/OS-II中,最多任務數有64個,到了版本2.82以后是256個,μC/OS-III中,用戶可以由任意多的任務、任意多的信號量、互斥型信號量、事件標志、消息列表、定時器和任意分配的存儲塊容量,僅受限于用戶CPU可以使用的RAM量。這個也是一個很大的擴展。(問:邵老師,它的這個數是啟動時就固定的,還是啟動后隨便定?)它是配置的時候可以自由定義的,只有你的RAM足夠大的話。第四點是增加了很多功能,功能總是越來越多的,大伙可以看一下的。原來這些功能在μC/OS-II里面是沒有的。
(1)感知層:負責信息采集和物物之間的信息傳輸,信息采集的技術包括傳感器、條碼和二維碼、 RFID射頻技術、音視頻等多媒體信息,信息傳輸包括遠近距離數據傳輸技術、自組織組網技術、協同信息處理技術、信息采集中間件技術等傳感器網絡。感知層是實現物聯網全面感知的核心能力,是物聯網中包括關鍵技術、標準化方面、產業化方面亟待突破的部分,關鍵在于具備更精確、更全面的感知能力,并解決低功耗、小型化和低成本的問題。
(2)網絡層:是利用無線和有線網絡對采集的數據進行編碼、認證和傳輸,廣泛覆蓋的移動通信網絡是實現物聯網的基礎設施,是物聯網三層中標準化程度昀高、產業化能力昀強、昀成熟的部分,關鍵在于為物聯網應用特征進行優化和改進,形成協同感知的網絡。
(3)應用層:提供豐富的基于物聯網的應用,是物聯網發展的根本目標,將物聯網技術與行業信息化需求相結合,實現廣泛智能化應用的解決方案集,關鍵在于行業融合、信息資源的開發利用、低成本高質量的解決方案、信息安全的保障以及有效的商業模式的開發。
創建動態內存分區函數OSMemCreate();
請求獲得內存塊函數OSMemGet();
釋放內存塊函數OSMemPut();
睡眠狀態、就緒狀態、運行狀態、等待狀態(等待某一事件發生)和中斷服務狀態。
(1)12bit分辨率(2)自動校準(3)可編程數據對齊(轉換結果支持左對齊或右對齊方式存儲在16位數據寄存器)(4)單次和連續轉換模式
(1)打開HSE,等待就緒后,設置Flash等待操作。(2)設置AHB,APB1,APB2分頻系數,確定他們各自和系統時鐘的關系。(3)設置CFGR寄存器確定PLL的時鐘來源和倍頻系數(HSE外部8M*9倍=72MHz)。(4)使能PLL,將系統時鐘源切換到PLL.
(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)
參看:Cortex-M3和Cortex-M4 Fault異常應用之一 ----- 基礎知識
AT+CTTS=1,”
6B228FCE4F7F75288BED97F3540862107CFB7EDF”
內容是“歡迎使用語音合成系統”,模塊收發中文短信就是unicode編碼,所以很容易將短信朗讀出來;
(2)直接輸入文本,普通字符采用ASIIC碼,漢字采用GBK編碼。
AT+CTTS=2,”歡迎使用語音合成系統”
通過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
參看:有限狀態機FSM詳解及其實現
//橫著寫
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;
}
}
-
內核
+關注
關注
3文章
1363瀏覽量
40228 -
STM32
+關注
關注
2266文章
10873瀏覽量
354837 -
函數
+關注
關注
3文章
4307瀏覽量
62433 -
GPIO
+關注
關注
16文章
1196瀏覽量
51919 -
stm32f1
+關注
關注
1文章
56瀏覽量
12185
原文標題:解答:
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論