GPIO:通用輸入輸出埠
GPIO特點:
1.快速翻轉,每次翻轉最快只需要兩個時鐘週期(F1最高速度可以到50Mhz)
2.每個IO口都可以做中斷
3.支援8種工作模式
GPIO電氣特性:
STM32工作電壓範圍:2 V ≤ VDD ≤ 3.6 V
GPIO識別電壓範圍:
COMS埠:-0.3V ≤ VIL ≤ 1.164V(0);1.833V ≤ VIH ≤ 3.6V(1)
TTL埠:電平TF,5V
GPIO輸出電流:單個IO最大25mA,總最大150mA,如果大於要考慮擴流方案:接三極體、MOS管、繼電器
STM32引腳型別:電源引腳、晶振引腳、復位引腳、下載引腳、BOOT引腳、GPIO引腳
IO引腳分佈特點:按組存在、組數視晶片而定、每組最多16個IO引腳
施密特觸發器:整形電路,非標準方波->方波
GPIO暫存器介紹
F1系列:
CRL、CRH:配置工作模式,輸出速度
IDR:輸入資料,用於判斷IO引腳電平
ODR:輸出資料,用於設定IO引腳輸出電平
BSRR:ODR暫存器的值
F4/F7/H7系列:
MODER:設定模式
OTYPER:輸出型別
OSPEEDR:輸出速度
PUPDR:上下拉電阻
IDR:輸入資料
ODR:輸出資料
BSRR:ODR暫存器值
建議使用BSRR暫存器控制輸出
使用ODR,在讀和修改訪問之間產生中斷時,可能會發生風險;BSRR則無風險。
設定通用外設驅動模型(四步法)
1,初始化:時鐘設定、引數設定、IO設定、中斷設定(開中斷、設NVIC)
2,讀函式(可選):從外設讀取資料
3,寫函式(可選):往外設寫入資料
4,中斷服務函式(可選):根據中斷標誌,處理外設各種中斷事務
GPIO配置步驟:
1,使能時鐘:__HAL_RCC_GPIOx_CLK_ENABLE()
2,初始化GPIO:HAL_GPIO_Init()
3,設定輸出狀態(可選):控制IO輸出高/低電平--HAL_GPIO_WritePin() 、每次呼叫IO輸出電平翻轉一次--HAL_GPIO_TogglePin()
4,讀取IO電平(可選):HAL_GPIO_ReadPin()
結構體
typedef struct
{
uint32_t Pin; /* 引腳號 */
uint32_t Mode; /* 模式設定 */
uint32_t Pull; /* 上拉下拉設定 */
uint32_t Speed; /* 速度設定 */
uint32_t Alternate; /* 複用功能 */
} GPIO_InitTypeDef;
中斷:打斷CPU執行正常的程式,轉而處理緊急程式,然後返回原暫停的程式繼續執行
中斷的作用:1,實時控制;2,故障處理;3,資料傳輸
中斷的意義:高效處理緊急程式,不會一直佔用CPU資源
GPIO外部中斷簡圖:GPIO->AFIO(F1)、SYSCFG(F4/F7/H7)->EXTI->NVIC->CPU
NVIC:巢狀向量中斷控制器,屬於核心
中斷向量表:定義一塊固定的記憶體,以4位元組對齊,存放各個中斷服務函式程式的首地址
中斷向量表定義在啟動檔案,當發生中斷,CPU會自動執行對應的中斷服務函式
NVIC還有:中斷掛起,解掛,啟用標誌等非常用功能。
中斷優先順序:
搶佔優先順序(pre)>響應優先順序(sub)>自然優先順序
數值越小,優先順序越高
NVIC的使用:
1,設定中斷分組(SCB_AIRCR):HAL_NVIC_SetPriorityGrouping
2,設定中斷優先順序(NVIC_IPRx):HAL_NVIC_SetPriority
3,使能中斷(NVIC_ISER):HAL_NVIC_EnableIRQ
EXTI基本概念:
外部(擴充套件)中斷事件控制器,包含20個產生事件/中斷請求的邊沿檢測器,即總共:20條EXTI線(F1)
中斷和事件的理解:
中斷:要進入NVIC,有相應的中斷服務函式,需要CPU處理
事件:不進入NVIC,僅用於內部硬體自動控制的,如:TIM、DMA、ADC
EXTI主要特性:
F1/F4/F7系列
每條EXTI線都可以單獨配置:選擇型別(中斷或者事件)、觸發方式(上升沿,下降沿或者雙邊沿觸發)、支援軟體觸發、開啟/遮蔽、有掛起狀態位
H7系列
由其它外設對 EXTI 產生的事件分為可配置事件和直接事件。
可配置事件:簡單概括,基本和F1/F4/F7系列類似
直接事件:固定上升沿觸發、不支援軟體觸發、無掛起狀態位(由其它外設提供)
AFIO:複用功能IO,主要用於重對映和外部中斷對映配置
配置AFIO暫存器之前要使能AFIO時鐘:__HAL_RCC_AFIO_CLK_ENABLE();
1,除錯IO配置
2,重對映配置
3,外部中斷配置
SYSCFG:系統配置控制器,用於外部中斷對映配置等
使能SYSCFG時鐘:__HAL_RCC_SYSCFG_CLK_ENABLE();
外部中斷配置
如何使用中斷:
GPIO外部中斷:設定輸入模式(GPIO)->設定EXTI和IO對映關係(AFIO或SYSCFG)->EXTI->
外設中斷:開啟外設相關中斷(USART/TIM/SPI…)->
設定中斷分組、優先順序、使能(NVIC)->按優先順序順序,依次處理中斷(CPU)
EXTI的配置步驟(外部中斷):
1,使能GPIO時鐘:__HAL_RCC_GPIOx_CLK_ENABLE
2,設定GPIO輸入模式
3,使能AFIO/SYSCFG時鐘
4,設定EXTI和IO對應關係
5,設定EXTI遮蔽,上/下沿
6,設定NVIC
設定中斷分組:HAL_NVIC_SetPriorityGrouping,此函式僅需設定一次
設定中斷優先順序:HAL_NVIC_SetPriority
使能中斷:HAL_NVIC_EnableIRQ
7,設計中斷服務函式:EXTIx_IRQHandler,中斷服務函式,清中斷標誌
步驟2 - 5使用HAL_GPIO_Init一步到位
STM32有:EXTI0~4(5)、EXTI9_5(1)、EXTI15_10(1),7個外部中斷服務函式
RS-232電平與COMS/TTL電平對比
1,RS-232電平--邏輯1:-15V ~ -3V;邏輯0:+3V ~ +15V
2,COMS電平(3.3V)--邏輯1:3.3V;邏輯0:0V
3, TTL電平(5V)--邏輯1:5V;邏輯0:0V
RS-232通訊示意圖:
控制器A<-(TTL/COMS電平)->電平轉換晶片<-(RS-232電平)->DB9介面<-(RS-232電平)->DB9介面<-(RS-232電平)->電平轉換晶片<-(TTL/COMS電平)->控制器B
電平轉換晶片:MAX3232或者SP3232等
串列埠與電腦USB口通訊示意圖:
USB介面(安裝CH340 USB 虛擬串列埠驅動)<-(USB電平標準)->Type-c介面<-(USB電平標準)->USB/串列埠轉換電路(CH340C)<-(TTL/COM電平)->STM32開發板(TXD/RXD)
USART簡介
USART:通用同步非同步收發器
UART:通用非同步收發器
USART/UART都可以與外部裝置進行全雙工非同步通訊
USART,常用的也是非同步通訊
USART主要特徵:
1,全雙工非同步通訊
2,單線半雙工通訊
3,單獨的傳送器和接收器使能位
4,可配置使用DMA的多緩衝器通訊
5, 多個帶標誌的中斷源
設定USART/UART波特率(F1):
波特率計算公式:baud=fck /(16∗USARTDIV)
USARTDIV=DIV_Mantissa+(DIV_Fraction/16)
fck 是串列埠的時鐘,如:USART1的時鐘是PCLK2,其他串列埠都是PCLK1
USARTDIV的值寫入USART_BRR暫存器
/*波特率為115200為例:115200=72000000/(16∗USARTDIV)->USARTDIV=39.0625*/
uint16_t mantissa;
uint16_t fraction;
mantissa=39;
fraction=0.0625*16+0.5=0x01; /* USARTDIV = DIV_Mantissa + (DIV_Fraction/16) */
USART1->BRR = (mantissa << 4) + fraction;
暫存器版本例程的寫法:USART1->BRR =(fck +(baud/2))/baud
USART/UART波特率(F4):
波特率計算公式:baud=fck /(8∗(2−OVER8)∗USARTDIV)
USARTDIV=DIV_Mantissa+(DIV_Fraction/8∗(2−OVER8))
USART/UART波特率(F7):
16倍過取樣波特率計算公式:baud=fck /USARTDIV
8倍過取樣波特率計算公式:baud=(2∗fck )/USARTDIV
USART/UART波特率(H7):
16倍過取樣波特率計算公式:baud=(usart_ker_ckpres)/USARTDIV
8倍過取樣波特率計算公式:baud=(2∗usart_ker_ckpres)/USARTDIV
usart_ker_ckpres是串列埠的工作時鐘
波特率暫存器(BRR):把USART_CR1暫存器的位15設定為0,即使用16倍過取樣。
HAL庫外設初始化MSP回撥機制:
HAL_PPP_Init()->呼叫MSP回撥函式:HAL_PPP_MspInit()
MSP回撥函式作用:配置PPP外設用到的硬體,如:GPIO、NVIC、CLOCK等,使用者可選擇是否使用並重新定義該函式
HAL庫外設初始化MSP回撥機制- USART為例:
HAL_UART_Init()->HAL_UART_MspInit()->
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if(huart->Instance == USART1) /* 如果是串列埠1,進行串列埠1 MSP初始化 */
{
/* (1)使能USART1和對應IO時鐘,(2)初始化IO,(3)使能USART1中斷,設定優先順序 */
}
}
HAL庫中斷回撥機制:
HAL_PPP_IRQHandler()->HAL_PPP_xxxCallback()
HAL庫中斷回撥機制 - USART為例(F1):
USARTx_IRQHandler()或者UARTx_IRQHandler()->HAL_USART_IRQHandler()或者HAL_UART_IRQHandler()->呼叫中斷回撥函式
UART中斷回撥函式:
HAL_UART_TxCpltCallback() /* 傳送完成回撥函式 */
HAL_UART_TxHalfCpltCallback() /* 半傳送完成回撥函式 */
HAL_UART_RxCpltCallback() /* 接收完成回撥函式 */
HAL_UART_RxHalfCpltCallback() /* 半接收完成回撥函式 */
HAL_UART_ErrorCallback() /* UART錯誤回撥函式 */
HAL_UART_AbortCpltCallback() /* UART中止回撥函式 */
HAL_UART_AbortTransmitCpltCallback() /* UART傳送中止回撥函式 */
HAL_UART_AbortReceiveCpltCallback() /* UART接收中止回撥函式 */
USART/UART非同步通訊配置步驟:
1,配置串列埠工作引數:HAL_UART_Init()
2,串列埠底層初始化:HAL_UART_MspInit() 配置GPIO、NVIC、CLOCK等
3,開啟串列埠非同步接收中斷:HAL_UART_Receive_IT()
4,設定優先順序,使能中斷:HAL_NVIC_SetPriority()、 HAL_NVIC_EnableIRQ()
5,編寫中斷服務函式:USARTx_IRQHandler()、 UARTx_IRQHandler()
6,串列埠資料傳送:USART_DR, HAL_UART_Transmit()
USART/UART非同步通訊相關函式介紹:
1,HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)
關鍵結構體(F1):
typedef struct
{ uint32_t BaudRate; /* 波特率 */
uint32_t WordLength; /* 字長 */
uint32_t StopBits; /* 停止位 */
uint32_t Parity; /* 奇偶校驗位 */
uint32_t Mode; /* UART 模式 */
uint32_t HwFlowCtl; /* 硬體流設定 */
uint32_t OverSampling; /* 過取樣設定 */
}UART_InitTypeDef
2,HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
作用:以中斷的方式接收指定位元組的資料
形參 1 是 UART_HandleTypeDef 結構體型別指標變數
形參 2 是指向接收資料緩衝區
形參 3 是要接收的資料大小,以位元組為單位
3,HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
作用:以阻塞的方式傳送指定位元組的資料
形參 1 :UART_HandleTypeDef 結構體型別指標變數
形參 2:指向要傳送的資料地址
形參 3:要傳送的資料大小,以位元組為單位
形參 4:設定的超時時間,以ms單位
IO引腳複用:IO埠的輸入或輸出是由其它非GPIO外設控制,我們稱之為複用
通用:IO埠的輸入或輸出是由GPIO外設控制,我們稱之為通用
串列埠接收資料過程:
HAL_UART_Receive_IT()->以中斷的方式接收一個位元組資料:uint8_t g_rx_buffer[1]->在接收完成回撥函式中處理接收到的資料:HAL_UART_RxCpltCallback()->接收資料引入接收資料狀態變數(制定接收協議):uint16_t g_usart_rx_sta ->bit15,接收到0x0A(換行),接收完成標誌;bit14,接收到0x0D(回車);bit13~0,接收到的有效位元組數目:uint8_t g_usart_rx_buf[200]
串列埠傳送資料過程:
如果收到資料,獲取資料長度:uint16_t g_usart_rx_sta ->等待SR暫存器TC位置1(即等待傳送完成):HAL_UART_Transmit()->傳送完成,清標誌->->
IWDG簡介 :獨立看門狗
本質:能產生系統復位訊號的計數器
特性:遞減的計數器;時鐘由獨立的RC振盪器提供(可在待機和停止模式下執行);看門狗被啟用後,當遞減計數器計數到0x000時產生復位
餵狗:在計數器計數到0之前,重灌載計數器的值,防止復位:IWDG有什麼作用
作用:主要用於檢測外界電磁干擾,或硬體異常導致的程式跑飛問題
獨立看門狗是異常處理的最後手段,不可依賴,應在設計時儘量避免異常的發生
IWDG溢位時間計算:
IWDG溢位時間計算公式(HAL庫):Tout =(psc∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺
Tout:溢位時間
f𝐼𝑊𝐷𝐺:時鐘源頻率
psc:預分頻係數
rlr:重灌載值
暫存器設定分頻係數的方法:"psc" =4∗2^prer
prer是IWDG_PR 的值
IWDG溢位時間計算公式(暫存器):Tout =((4∗2^prer)∗𝑟𝑙𝑟)/f𝐼𝑊𝐷𝐺
IWDG配置步驟:
1,使能IWDG,設定預分頻係數和重灌載值等(IWDG_PR/RL/KR):HAL_IWDG_Init()
typedef struct
{
IWDG_TypeDef *Instance; /* IWDG 暫存器基地址 */
IWDG_InitTypeDef Init; /* IWDG 初始化引數 */
}IWDG_HandleTypeDef;
2,把重灌載暫存器的值過載到計數器中,餵狗(IWDG_KR):HAL_IWDG_Refresh()
typedef struct
{
uint32_t Prescaler; /* 預分頻係數 */
uint32_t Reload; /* 重灌載值 */
} IWDG_InitTypeDef;
->->->->