1. 外設引腳重映射
1.1 定義
在STM32中,每個外設的引腳都有默認的GPIO端口,但有些引腳可以通過重映射寄存器將功能映射到其他端口。這種機制稱為引腳重映射,主要用于解決引腳復用沖突或優化PCB布線。
1.2 重映射的類型
- 部分重映射(Partial Remap):某些外設引腳被重新映射,而部分仍使用默認引腳。
- 完全重映射(Full Remap):外設的所有相關引腳都被重新映射到新的端口。
1.3 引腳重映射的配置過程(以串口1為例)
為了實現串口1的引腳重映射,需要按照以下步驟進行:
- 使能GPIO時鐘(針對重映射后的IO端口):
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA時鐘
- 使能功能外設時鐘(例如串口1):
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 使能USART1時鐘
- 使能AFIO時鐘(復用輔助功能時鐘)。
重映射必須使能AFIO時鐘:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- 開啟重映射:
其中,第一個參數決定了是部分重映射還是完全重映射。GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);
1.4 什么時候需要開啟AFIO輔助功能時鐘?
在對以下寄存器進行讀寫操作前,必須先打開AFIO時鐘:
- AFIO_MAPR:配置復用功能重映射。
- AFIO_EXTICRx:配置外部中斷線映射。
- AFIO_EVCR:配置EVENTOUT事件輸出。
2. STM32 中斷優先級管理
2.1 STM32 中斷概述
STM32 具有 84 個中斷,其中:
- 16 個內核中斷(系統級中斷)。
- 68 個可屏蔽中斷(外部中斷)(STM32F103 系列只有 60 個可屏蔽中斷,而 STM32F107 才有 68 個)。
這些外部中斷可以被屏蔽,并且支持可編程的優先級管理。
2.2 NVIC(嵌套向量中斷控制器)
STM32 的 NVIC 支持 16 級中斷優先級,用于管理不同外設和系統的中斷響應順序。
2.3 NVIC 中斷優先級分組
STM32 的 NVIC 允許對中斷優先級進行分組,每個中斷都有:
- 主優先級(Preempt Priority):決定是否可以搶占低優先級中斷。
- 子優先級(Sub Priority):決定在相同主優先級情況下,哪個中斷先被執行。
STM32 提供了 5 種優先級分組模式(由 SCB->AIRCR
配置):
分組模式 | 主優先級位數 | 子優先級位數 |
---|---|---|
0 | 0 位 | 4 位 |
1 | 1 位 | 3 位 |
2 | 2 位 | 2 位 |
3 | 3 位 | 1 位 |
4 | 4 位 | 0 位 |
2.4 設置 NVIC 優先級
使用 NVIC_PriorityGroupConfig()
設置 NVIC 分組:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 設置 2 級搶占優先級,2 級子優先級
設置某個外設中斷的優先級:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; // 選擇串口1中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 搶占優先級 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; // 子優先級 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能該中斷
NVIC_Init(&NVIC_InitStructure); // 配置 NVIC
- **搶占優先級(Preemption Priority)**越小,優先級越高,可以打斷低優先級的中斷。
- **子優先級(Sub Priority)**決定相同搶占優先級的情況下,哪個中斷先執行。