嵌入式基礎(三)基礎外設
1.什么是UART?與USART有什么區別???
(1)什么是UART
通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART。是一種異步全雙工串行通信協議,它將要傳輸的資料在串行通信與并行通信之間加以轉換。作為把并行輸入信號轉成串行輸出信號的芯片,UART通常被集成于其他通訊接口的連結上,它不是像SPI和I2C這樣的通信協議,而是微控制器中獨立的物理電路或獨立的IC。UART工作原理是將數據的二進制位一位一位的進行傳輸。
硬件連接
硬件連接比較簡單,僅需要3條線,注意連接時兩個設備UART電平,如電平范圍不一致請做電平轉換后再連接,如下圖所示:
- TX:發送數據端,要接對面設備的RX。
- RX:接收數據端,要接對面設備的TX。
- GND:保證兩設備共地,有統一的參考平面。
通信協議
UART作為異步串口通信協議的一種,工作原理是將數據的字節一位接一位地傳輸。協議如下:
空閑位:
UART協議規定,當總線處于空閑狀態時信號線的狀態為1即高電平。
起始位:
開始進行數據傳輸時發送方要先發出一個低電平0來表示傳輸字符的開始。因為空閑位一直是高電平所以開始第一次通訊時先發送一個明顯區別于空閑狀態的信號即為低電平。
數據位:
起始位之后就是要傳輸的數據,數據可以是5,6,7,8位,構成一個字符,一般都是8位。先發送最低位LSB,再發送最高位MSB(小端模式)。
奇偶校驗位:
數據位傳送完成后,要進行奇偶校驗,校驗位其實是調整個數,串口校驗分幾種方式
- 無校驗(No Parity)
- 奇校驗(Odd Parity):如果數據位中1的數目是偶數,則校驗位為1才能滿足1的個數為奇數,如果1的數目是奇數,校驗位為0。
- 偶校驗(Even Parity):如果數據為中1的數目是偶數,則校驗位為0才能滿足1的個數為偶數,如果1的數目是奇數,校驗位為1。
- Mark Parity:校驗位始終為1。
- Space Parity:校驗位始終為0。
停止位:
數據結束標志,可以是1位,1.5位,2位的高電平。
波特率:
異步通信以一個字符為傳輸單位,通信中兩個字符間的時間間隔多少是不固定的,然而在同一個字符中的兩個相鄰位間的時間間隔是固定的。數據傳輸速率使用波特率來表示,單位bps(bits per second)。常見的波特率9600bps,115200bps等等,其他標準的波特率是1200,2400,4800,19200,38400,57600。舉個例子,如果串口波特率設置為9600bps,那么傳輸一個比特需要的時間是:1 / 9600 ≈ 104.2us。
二、UART和USART的區別
特點 | UART | USART |
通信方式 | 只支持異步通信 | 可支持異步和同步通信 |
全雙工通信 | 可以進行全雙工數據傳輸 | 可以進行全雙工數據傳輸 |
功能 | 通常只包括發送和接收功能 | 包括發送、接收、同步和異步等多種功能 |
數據線 | 一般只有兩個數據線 | 在同步通信模式下需要多個數據線和時鐘線 |
適用場景 | 適用于簡單的低速異步通信應用 | 適用于更復雜的通信需求,包括同步和異步通信等 |
2.什么是I2C, I2C時序圖?`??
一、I2C協議簡介
I2C(Inter-Integrated Circuit)是一種串行通信總線協議,用于在集成電路(IC)之間進行通信。它由兩根線組成:串行數據線(SDA)和串行時鐘線(SCL)。I2C總線采用主從結構,可以支持多個設備在同一條總線上進行通信。
I2C通信的特點包括簡單、靈活和可靠,適用于連接多個低速設備。每個設備都有一個唯一的地址,主設備通過發送地址將數據傳輸給從設備,從設備接收并響應這些數據。
二、I2C總線結構
I2C總線在物理連接上非常簡單,分別由SDA(串行數據線)和SCL(串行時鐘線)及上拉電阻組成。通信原理是通過對SCL和SDA線高低電平時序的控制,來產生I2C總線協議所需要的信號進行數據的傳遞。在總線空閑狀態時,這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。
三、I2C時序圖
開始條件:在時鐘線保持高電平時,數據線從高電平轉為低電平,即檢測到一個下降沿,會形成一個開始條件;
停止條件:時鐘保持高電平時,數據線從低電平轉為高電平形成一個停止條件。
進行數據傳輸前也就是緊跟開始條件后,我們要傳送地址字節,前7位是從設備地址(這也是為什么一個主機理論上最多能接127個從機,2^7-1),第八位是讀/寫標志位。每8bit傳輸完成,第九位是應答位。如果是主設備發送數據,就是從設備應答,如果是主設備讀取數據,就是主設備應答。
3.請說明總線接口USRT、I2C、USB的異同點(串/并、速度、全/半雙工、總線拓撲等)????
下面是USRT、I2C和USB總線接口的異同點比較表:
特性 | USRT | I2C | USB |
類型 | 串行 | 串行 | 串行 |
速度 | 快 - 高達幾GHz | 中等 - 最高可達400kHz | 可變 - 低速、全速、高速、超速 |
傳輸協議 | 可使用多種協議,如UART、SPI等 | 特定I2C協議 | 特定USB協議 |
通信線數 | 3根或更多 | 2根 | 4根至更多 |
拓撲 | 點對點或多點 | 主從結構 | 主從結構 |
協議復雜性 | 中等 | 簡單 | 復雜 |
主/從設備 | 可能有多個主設備和從設備 | 一個主設備和多個從設備 | 一個主設備和多個從設備 |
半雙工/全雙工 | 全雙工 | 半雙工 | 全雙工或半雙工 |
應用 | 通常用于遠距離通信,如RS-485 | 適用于短距離通信,如傳感器與微控制器之間 | 廣泛應用于外設連接、存儲設備等 |
4.什么是SPI,SPI的特性????
1、什么是SPI
SPI是串行外設接口(Serial Peripheral Interface)的縮寫,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便,正是出于這種簡單易用的特性,越來越多的芯片集成了這種通信協議,主要應用在 EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間。
2、SPI模式
SPI分為主、從兩種模式,一個SPI通訊系統需要包含一個(且只能是一個)主設備,一個或多個從設備。
提供時鐘的為主設備(Master),接收時鐘的設備為從設備(Slave),SPI接口的讀寫操作,都是由主設備發起。當存在多個從設備時,通過各自的片選信號進行管理。
SPI是全雙工且SPI沒有定義速度限制,一般的實現通常能達到甚至超過10 Mbps
3、SPI信號線
SPI接口一般使用四條信號線通信:
SDI(數據輸入),SDO(數據輸出),SCK(時鐘),CS(片選)
- MISO: 主設備輸入/從設備輸出引腳。該引腳在從模式下發送數據,在主模式下接收數據。
- MOSI: 主設備輸出/從設備輸入引腳。該引腳在主模式下發送數據,在從模式下接收數據。
- SCLK:串行時鐘信號,由主設備產生。
- CS/SS:從設備片選信號,由主設備控制。它的功能是用來作為"片選引腳",也就是選擇指定的從設備,讓主設備可以單獨地與特定從設備通訊,避免數據線上的沖突。
4、SPI設備選擇
SPI是單主設備( single-master )通信協議,這意味著總線中的只有一支中心設備能發起通信。
- 當SPI主設備想讀/寫[從設備]時:
- 它首先拉低[從設備]對應的SS線(SS是低電平有效)
- 接著開始發送工作脈沖到時鐘線上,在相應的脈沖時間上,[主設備]把信號發到MOSI實現"寫",同時可對MISO采樣而實現"讀"
6、SPI通信的四種模式
SPI的四種模式,簡單地講就是設置SCLK時鐘信號線的那種信號為有效信號
它們的區別是定義了在時鐘脈沖的哪條邊沿轉換(toggles)輸出信號,哪條邊沿采樣輸入信號,還有時鐘脈沖的穩定電平值(就是時鐘信號無效時是高還是低)。每種模式由一對參數刻畫,它們稱為時鐘極(clock polarity)CPOL與時鐘期(clock phase)CPHA。
- SPI通信有4種不同的操作模式,不同的從設備可能在出廠是就是配置為某種模式,這是不能改變的
- 但我們的通信雙方必須是工作在同一模式下
- 所以我們可以對我們的主設備的SPI模式進行配置,通過CPOL(時鐘極性)和CPHA(時鐘相位)來控制我們主設備的通信模式
具體如下:
1. 時鐘極性(CPOL)定義了時鐘空閑狀態電平:
- CPOL=0,表示當SCLK=0時處于空閑態,所以有效狀態就是SCLK處于高電平時**(高有效)**
- CPOL=1,表示當SCLK=1時處于空閑態,所以有效狀態就是SCLK處于低電平時**(低有效)**
2. 時鐘相位(CPHA)定義數據的采集時間。
- CPHA=0,在時鐘的第1個跳變沿(上升沿或下降沿)進行數據采樣。在第2個邊沿發送數據**(1采2發)**
- CPHA=1,在時鐘的第2個跳變沿(上升沿或下降沿)進行數據采樣。在第1個邊沿發送數據**(1發2采)**
具體如下:
- Mode0:CPOL=0,CPHA=0:此時空閑態時,SCLK處于低電平;數據采樣是在第1個邊沿,也就是SCLK由低電平到高電平的跳變;所以數據采樣是在上升沿,數據發送是在下降沿。
- Mode1:CPOL=0,CPHA=1:此時空閑態時,SCLK處于低電平;數據發送是在第1個邊沿,也就是SCLK由低電平到高電平的跳變;所以數據采樣是在下降沿,數據發送是在上升沿。
- Mode2:CPOL=1,CPHA=0:此時空閑態時,SCLK處于高電平;數據采樣是在第1個邊沿,也就是SCLK由高電平到低電平的跳變;所以數據采集是在下降沿,數據發送是在上升沿。
- Mode3:CPOL=1,CPHA=1:此時空閑態時,SCLK處于高電平;數據發送是在第1個邊沿,也就是SCLK由高電平到低電平的跳變;所以數據采集是在上升沿,數據發送是在下降沿。
注:數據采樣=準備數據
CPOL=0:高有效,0到1,即上升沿是第一個邊沿
CPOL=1:低有效,1到0,即下降沿是第一個邊沿
5.什么是GPIO???
GPIO 是 General Purpose Input/Output(通用輸入/輸出)的縮寫,它是一種在計算機系統中用于與外部設備進行數字信號交互的通用接口。每個 GPIO 引腳可以被配置為輸入或輸出,并且可以通過編程來讀取或寫入數字信號。
6.如何使用TIM定時器實現定時中斷和PWM輸出?????
- 初始化 TIM 定時器:使用適當的配置和預分頻器設置來初始化 TIM 定時器。選擇合適的計數模式,例如向上計數模式或向下計數模式,以及所需的計數器值。
- 配置定時中斷:使能定時器中斷功能,并設置適當的中斷優先級。確保定時器溢出時會觸發中斷。
- 配置 PWM 輸出通道:選擇一個或多個輸出通道來作為 PWM 輸出。配置這些通道的工作模式為 PWM 模式,并設置相應的占空比(PWM 的高電平時間與周期時間的比例)。根據您的需求配置 PWM 周期和占空比的值。
- 啟動定時器:調用啟動定時器的函數,開始定時器的計數。
- 在定時中斷服務函數中編寫代碼:在定時中斷服務函數中編寫處理程序,用于處理定時中斷的邏輯。您可以在此函數中執行所需的操作,例如更新 PWM 的占空比、改變輸出狀態等
#include "stm32xxxx.h" ?// 包含特定型號的 STM32 頭文件
#include "stm32xxxx_hal.h" ?// 包含 STM32 HAL 庫頭文件
TIM_HandleTypeDef htim2; ?// 定義一個 TIM_HandleTypeDef 結構體變量用于配置 TIM2
void SystemClock_Config(void) {
??// 在這里配置系統時鐘
}
void TIM2_Init(void) {
??TIM_MasterConfigTypeDef sMasterConfig;
??TIM_OC_InitTypeDef sConfigOC;
??TIM_HandleTypeDef htim;
??// 啟用 TIM2 時鐘
??__HAL_RCC_TIM2_CLK_ENABLE();
??// 配置 TIM2
??htim2.Instance = TIM2;
??htim2.Init.Prescaler = 0;
??htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
??htim2.Init.Period = 1000;
??htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
??// 初始化 TIM2
??HAL_TIM_PWM_Init(&htim2);
??// 設置 PWM 輸出
??sConfigOC.OCMode = TIM_OCMODE_PWM1;
??sConfigOC.Pulse = 500; ?// 設置占空比,取值范圍為 0 - 1000(0%-100%)
??sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
??sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
??HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); ?// 配置 TIM2 的通道 1
??// 配置 TIM2 的定時中斷
??HAL_TIM_Base_MspInit(&htim2);
??sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
??sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
??HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
??// 啟動定時器
??HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
??HAL_TIM_Base_Start_IT(&htim2);
}
void TIM2_IRQHandler(void) {
????// 處理定時中斷的邏輯
????// ...
????
????HAL_TIM_IRQHandler(&htim2);
}
int main(void) {
??HAL_Init();
??SystemClock_Config();
??TIM2_Init();
??while (1) {
????// 主循環中的其他任務
??}
}
7.外部中斷觸發模式有哪些?請分別描述它們的特點和應用場景。???
觸發模式 | 特點 | 應用場景 |
上升沿觸發 | 信號從低電平到高電平時觸發中斷 | 檢測按鈕按下或傳感器觸發等高電平信號變化的場合 |
下降沿觸發 | 信號從高電平到低電平時觸發中斷 | 檢測按鈕釋放或傳感器復位等低電平信號變化的場合 |
雙邊沿觸發 | 信號的上升沿和下降沿均觸發中斷 | 需要同時檢測上升沿和下降沿的場合,如通信協議的時鐘信號 |
電平觸發 | 信號維持相應電平期間持續觸發中斷 | 持續性信號的檢測,如通信協議的數據線 |
8.比較I2C和SPI接口的異同點,分別適用于哪些應用場景????
特點 | I2C | SPI |
數據線數量 | 2 根(一根用于數據傳輸,一根用于時鐘) | 多根(最少 4 根,通常包括數據線、時鐘線、片選線等) |
傳輸速率 | 低速,最高速率通常在幾百 kHz | 高速,速率可以達到幾 Mbps 或更高 |
設備連接方式 | 總線拓撲結構 | 點對點連接或主從模式 |
主從設備數量 | 高,支持多個主設備和從設備同時連接 | 通常只有一個主設備操作多個從設備 |
硬件復雜性 | 相對較低,只需要實現 I2C 控制器和設備 | 相對較高,需要實現 SPI 控制器和設備 |
適用場景 | - 傳感器、EEPROM、溫度傳感器等小規模設備 - 系統中設備數量多、通信速率要求不高的場景 | - 存儲器、FPGA、音頻編解碼器等需要高速數據傳輸的設備 - 系統中設備數量少、通信速率要求較高的場景 |
9.在STM32中如何配置和使用ADC模塊????
#include "stm32f4xx.h"
void ADC_Configuration(void) {
????GPIO_InitTypeDef ??????GPIO_InitStructure;
????ADC_InitTypeDef ???????ADC_InitStructure;
????// 使能 GPIO 時鐘
????RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
????// 使能 ADC1 時鐘
????RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
????// 配置 ADC 輸入引腳為模擬模式
????GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; ?????// 假設使用PA0作為ADC輸入引腳
????GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; ??// 模擬輸入模式
????GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 不使用上下拉電阻
????GPIO_Init(GPIOA, &GPIO_InitStructure);
????// ADC 配置
????ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ????// ADC 分辨率為 12 位
????ADC_InitStructure.ADC_ScanConvMode = DISABLE; ??????????????// 非掃描模式
????ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ????????// 非連續轉換模式
????ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 不使用外部觸發
????ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ?????// 右對齊輸出
????ADC_InitStructure.ADC_NbrOfConversion = 1; ?????????????????// 轉換的通道數為1
????ADC_Init(ADC1, &ADC_InitStructure);
????ADC_Cmd(ADC1, ENABLE); ???// 啟用 ADC1
????// 配置ADC轉換通道
????ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);
????// 啟動ADC校準
????ADC_GetCalibrationFactor(ADC1);
????while(ADC_GetCalibrationStatus(ADC1));
????// 啟動ADC轉換
????ADC_SoftwareStartConv(ADC1);
}
10.同步通信和異步通信????
同步通信:在同步通信中,發送方和接收方的時鐘是相互關聯的,數據的傳輸和接收是基于一個共同的時鐘信號進行同步的。發送方在每個時鐘周期內按照時鐘的節拍發送數據,接收方也按照同樣的時鐘節拍接收數據。雙方通過時鐘信號的同步來保證正確的數據傳輸。同步通信對時序要求較高,需要在通信雙方之間建立穩定的時鐘信號。
異步通信:在異步通信中,發送方和接收方沒有共同的時鐘信號進行同步。數據的傳輸和接收不依賴于特定的時鐘信號,而是通過特定的起始位和停止位來標識數據的傳輸開始和結束。每個數據幀都有自己的起始和停止位,這樣接收方可以通過檢測起始和停止位來識別每個數據幀。異步通信相對較為靈活,但需要額外的控制位來標識起始和停止。
區別:
- 時鐘同步:同步通信使用共同的時鐘信號進行同步,異步通信沒有共同的時鐘信號。
- 數據幀結構:同步通信將數據劃分為固定的時間片或時鐘周期,而異步通信在數據之間插入起始和停止位來界定數據幀的開始和結束。
- 時序要求:同步通信對時序要求較高,通信雙方需要保持嚴格的同步;而異步通信對時序要求較低,通信雙方無需精確同步。
- 靈活性:同步通信相對剛性,因為通信雙方必須始終保持同步;異步通信相對靈活,因為通信不依賴于特定的時鐘信號。