3.外設GPIO、中斷

阿Q熊發表於2024-08-28

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引腳

施密特觸發器:整形電路,非標準方波->方波

MOS管是壓控型元件,透過控制柵源電壓( Vgs )來實現導通或關閉
G:柵極
S:源極
D:漏極
導通條件:
P:Vgs < 0
N:Vgs > 0
GPIO工作模式
輸入模式:
1.輸入浮空:空閒時,IO狀態不確定,由外部環境決定
2.輸入上拉:空閒時,IO呈現高電平
3.輸入下拉:空閒時,IO呈現低電平
模擬輸入:
4.模擬功能:專門用於模擬訊號輸入或輸出,如:ADC和DAC
通用輸出模式:
5.開漏輸出:不能輸出高電平,必須有外部(或內部)上拉才能輸出高電平
6.推輓輸出:可輸出高低電平,驅動能力強
複用功能模式:
7.開漏式複用功能:不能輸出高電平,必須有外部(或內部),上拉才能輸出高電平;由其他外設控制輸出
8.推輓式複用功能:可輸出高低電平,驅動能力強;由其他外設控制輸出

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還有:中斷掛起,解掛,啟用標誌等非常用功能。

內部中斷
Reset:復位
NMI:不可遮蔽中斷
HardFault:硬體失效
MemManage:儲存器管理
BusFault:預取指失敗,儲存器訪問失敗
UsageFault:未定義的指令或非法狀態
SVCall:透過SWI指令的系統服務呼叫
DebugMonitor:除錯監控器
PendSV:可掛起的系統服務
SysTick:系統滴答定時器
外部中斷
WWDG:連到EXTI的電源電壓檢測(PVD)中斷
PVD:連到EXTI的電源電壓檢測(PVD)中斷
TAMPER:侵入檢測中斷
RTC:實時時鐘(RTC)全域性中斷
FLASH:快閃記憶體全域性中斷
RCC:復位和時鐘控制(RCC)中斷
EXTI0:EXTI線0中斷
DMA1通道1:DMA1通道1全域性中斷
ADC1_2:ADC1和ADC2的全域性中斷
USB_HP_CAN_TX:USB高優先順序或CAN傳送中斷
CAN_RX1:CAN接收1中斷
EXTI9_5:EXTI線[9:5]中斷
TIM1_BRK:TIM1剎車中斷
I2C1_EV:I2C1事件中斷
SPI1:SPI1全域性中斷
USART1:USART1全域性中斷
RTCAlarm:連到EXTI的RTC鬧鐘中斷
USB喚醒:連到EXTI的從USB待機喚醒中斷
FSMC:FSMC全域性中斷
SDIO:SDIO全域性中斷

中斷優先順序:
搶佔優先順序(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個外部中斷服務函式

資料通訊:
按資料通訊方式分類:序列通訊、並行通訊
按資料傳輸方向分類:單工通訊、半雙工通訊、全雙工通訊
單工通訊:資料只能沿一個方向傳輸
半雙工通訊:資料可以沿兩個方向傳輸,但需要分時進行
全雙工通訊:資料可以同時進行雙向傳輸
按資料同步方式分類:同步通訊、非同步通訊
同步通訊:共用同一時鐘訊號
非同步通訊:沒有時鐘訊號,透過在資料訊號中加入起始位和停止位等一些同步訊號

1,位元率:每秒鐘傳送的位元數,單位bit/s
2,波特率:每秒鐘傳送的碼元數,單位Baud
3,位元率 = 波特率 * log2 M ,M表示每個碼元承載的資訊量
4,二進位制系統中,波特率數值上等於位元率
序列通訊介面:指按位傳送和接收的介面。如:RS-232/422/485等
RS-232介面(DB9)
3.外設GPIO、中斷
資料:
TXD(pin 3):串列埠資料輸出
RXD(pin 2):串列埠資料輸入
握手:
RTS(pin 7):請求傳送
CTS(pin 8):清除傳送
DSR(pin 6):資料傳送就緒
DCD(pin 1):資料載波檢測
DTR(pin 4):資料終端就緒
地線:GND(pin 5):訊號地
其他:RI(pin 9):振鈴指示

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, 多個帶標誌的中斷源

STM32F1/F4/F7/H7的USART框圖:
外部裝置->序列資料輸入(RXD)->接收移位暫存器->接收資料暫存器(RDR)->
F7/H7:CPU->
F1/F4:資料暫存器(DR)->
傳送資料暫存器(TDR)->傳送移位暫存器->序列資料輸出(TXD)->外部裝置

設定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;






->->->->

相關文章