stm32學習
十一.中斷
4.使用中斷

EXTI的配置步驟:
- 使能GPIO時鐘
- 設置GPIO輸入模式
- 使能AFIO/SYSCFG時鐘
- 設置EXTI和IO對應關系
- 設置EXTI屏蔽,上/下沿
- 設置NVIC
- 設計中斷服務函數
HAL庫的使用:
- 使能GPIO時鐘:__HAL_RCC_GPIOx_CLK_ENABLE
- GPIO/AFIO(SYSCFG)/EXTI:HAL_GPIO_Init()
- 設置中斷分組:HAL_NVIC_SetPriorityGrouping,此函數僅需設置一次
- 設置中斷優先級:HAL_NVIC_SetPriority
- 使能中斷:HAL_NVIC_EnableIRQ
- 設計中斷服務函數:EXTIx_IRQHandler,中斷服務函數,清中斷標志
STM32僅有:EXTI0~4、EXTI9_5、EXTI15_10,7個外部中斷服務函數
十二.串口
1.通信基礎
單工/半雙工/全雙工通信:

波特率:
- 比特率:每秒傳送的比特數,單位bit/s
- 波特率:每秒傳送的碼元數,單位Baud
- 比特率 = 波特率 * log2M,M表示每個碼元承載的信息量
- 二進制系統中,波特率數值上等于比特率
常見的串行通信串口

2.串口
串行通信接口:指按位發送和接收的接口。如:RS-232、422、485
RS-232現在逐漸被USB、無線網所取代
RS-232電平不能與COMS/TTL電平直接交換信息
現代設備常通過 USB轉RS-232芯片實現兼容

3.UART/USART
一個是通用異步收發器,一個是通用同步異步收發器
常用的也是異步通信
如何區分UART/USART和其它通信:TX和RX交叉相連
USART的框圖簡化版:

設置UART/USART波特率:
①F1: b a u d = f c k 16 ? U S A R T D I V baud = \frac{f_{ck}}{16*USARTDIV} baud=16?USARTDIVfck??
f c k f_{ck} fck?是串口的時鐘, U S A R T D I V = D I V _ M a n t i s s a + ( D I V _ F r a c t i o n / 16 ) USARTDIV = DIV\_Mantissa + (DIV\_Fraction / 16) USARTDIV=DIV_Mantissa+(DIV_Fraction/16)
②F4: b a u d = f c k 8 ? ( 2 ? O V E R 8 ) ? U S A R T D I V baud = \frac{f_{ck}}{8 * (2 - OVER8) * USARTDIV} baud=8?(2?OVER8)?USARTDIVfck??
③F7:16倍過采樣波特率計算公式: b a u d = f c k U S A R T D I V baud = \frac{f_{ck}}{USARTDIV} baud=USARTDIVfck??
8倍過采樣波特率計算公式: b a u d = 2 ? f c k U S A R T D I V baud = \frac{2 * f_{ck}}{USARTDIV} baud=USARTDIV2?fck??
④H7:16倍過采樣波特率計算公式: b a u d = u s a r t k e r c k p r e s U S A R T D I V baud = \frac{usart_ker_ckpres}{USARTDIV} baud=USARTDIVusartk?erc?kpres?
8倍過采樣波特率計算公式: b a u d = 2 ? u s a r t k e r c k p r e s U S A R T D I V baud = \frac{2 * usart_ker_ckpres}{USARTDIV} baud=USARTDIV2?usartk?erc?kpres?
usart_ker_ckpres是供串口使用的時鐘
在Cube生成的代碼中,我們實現業務邏輯的代碼是寫在回調函數:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {// 1. 判斷是否為USART1觸發的回調(支持多UART實例)if (huart->Instance == USART1) {// 2. 接收完成后,設置標志位(輕量級操作,避免中斷內耗時)rx_complete_flag = 1;// 3. 重新啟動UART接收(否則只能接收一次數據)HAL_UART_Receive_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);}
}
4.寄存器介紹
控制寄存器1(CR1):

控制寄存器2(CR2):

控制寄存器3(CR3):

數據寄存器(DR):

狀態寄存器(SR):
