串口記錄:
STM32有好幾個串口。比如說STM32F103ZET6有5個串口,串口1的引腳對應的IO為PA9,PA10.PA9,PA10默認功能是GPIO,所以當PA9,PA10引腳作為串口1的TX,RX引腳使用的時候,那就是端口復用。
復用端口初始化有幾個步驟:
1) GPIO端口時鍾使能。要使用到端口復用,當然要使能端口的時鍾了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
2) 復用的外設時鍾使能。比如你要將端口PA9,PA10復用為串口,所以要使能串口時鍾。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
3) 端口模式配置。 在IO復用位內置外設功能引腳的時候,必須設置GPIO端口的模式,至於在復用功能下GPIO的模式是怎么對應的,這個可以查看手冊。
所以,我們在使用復用功能的是時候,最少要使能2個時鍾:
1) GPIO時鍾使能 ;2) 復用的外設時鍾使能 同時要初始化GPIO以及復用外設功能
串口設置的一般步驟可以總結為如下幾個步驟:
1) 串口時鍾使能,GPIO時鍾使能
2) 串口復位
3) GPIO端口模式設置
4) 串口參數初始化
5) 開啟中斷並且初始化NVIC(如果需要開啟中斷才需要這個步驟)
6) 使能串口
7) 編寫中斷處理函數
端口重映射:(暫略)
中斷量控制:
STM32有84個中斷,包括16個內核中斷和68個可屏蔽中斷,具有16級可編程的中斷優先級。而我們常用的就是這68個可屏蔽中斷,但是STM32的68個可屏蔽中斷,在STM32F103系列上面,又只有60個(在107系列才有68個)。
ISER[2]:ISER全稱是:Interrupt Set-Enable Registers,這是一個中斷使能寄存器組。
ICER[2]:全稱是:Interrupt Clear-Enable Registers,是一個中斷除能寄存器組。
ISPR[2]:全稱是:Interrupt Set-Pending Registers,是一個中斷掛起控制寄存器組。
ICPR[2]:全稱是:Interrupt Clear-Pending Registers,是一個中斷解掛控制寄存器組。
IABR[2]:全稱是:Active Bit Registers,是一個中斷激活標志位寄存器組。
IPR[15]:全稱是:Interrupt Priority Registers,是一個中斷優先級控制的寄存器組。
簡單介紹一下STM32的中斷分組:STM32將中斷分為5個組,組0~4。該分組的設置是由SCB->AIRCR寄存器的bit10~8來定義的。
通過這個表,我們就可以清楚的看到組0~4對應的配置關系,例如組設置為3,那么此時所有的60個中斷,每個中斷的中斷優先寄存器的高四位中的最高3位是搶占優先級,低1位是響應優先級。每個中斷,你可以設置搶占優先級為0~7,響應優先級為1或0。搶占優先級的級別高於響應優先級。而數值越小所代表的優先級就越高。
STM32的中斷如此之多,配置起來並不容易,因此,我們需要一個強大而方便的中斷控制器NVIC (Nested Vectored Interrupt Controller)。NVIC是屬於
Cortex內核的器件,不可屏蔽中斷 (NMI)和外部中斷都由它來處理,而SYSTICK不是由NVIC來控制的。
使用NVIC來配置中斷時,自然想到ST庫肯定也已經把它封裝成庫函數了。對NVIC初始化NVIC_Init() 函數,首先要定義並填充一個NVIC_InitTypeDef 類型的結構體。
這個結構體有四個成員:
NVIC_IRQChannel 需要配置的中斷向量;
NVIC_IRQChannelCmd 使能或關閉相應中斷向量的中斷響應;
NVIC_IRQChannelPreemptionPriority 配置相應中斷向量搶占優先級;
NVIC_IRQChannelSubPriority 配置相應中斷向量的響應優先級;
首先要用NVIC_IRQChannel參數來選擇將要配置的中斷向量,用NVIC_IRQChannelCmd參數來進行使能(ENABLE)或關閉(DISABLE)該中斷。在NVIC_IRQChannelPreemptionPriority成員要配置中斷向量的搶占優先級,在NVIC_IRQChannelSubPriority需要配置中斷向量的響應優先級。
搶占優先級和響應優先級
STM32的中斷向量具有兩個屬性,一個為搶占屬性,另一個為響應屬性,其屬性編號越小,表明它的優先級別越高。
搶占,是指打斷其它中斷的屬性,即因為具有這個屬性,會出現嵌套中斷(在執行中斷服務函數A的過程中被中斷B打斷,執行完中斷服務函數B再繼續執行中斷服務函數A),搶占屬性由NVIC_IRQChannelPreemptionPriority的參數配置。
而響應屬性則應用在搶占屬性相同的情況下,當兩個中斷向量的搶占優先級相同時,如果兩個中斷同時到達,則先處理響應優先級高的中斷,響應屬性由NVIC_IRQChannelSubPriority的參數配置。
例如:現在有三個中斷向量:
中斷向量 搶占優先級 響應優先級
A 0 0
B 1 0
C 1 1
若內核正在執行C的中斷服務函數,則它能被搶占優先級更高的中斷A打斷,由於B和C的搶占優先級相同,所以C不能被B打斷。但如果B和C中斷是同時到達的,內核就會首先響應響應優先級別更高的B中斷。
NVIC只可以配置16種 中斷向量的優先級,也就是說,搶占優先級和響應優先級的數量由一個4位的數字來決定,把這個4位數字的位數 分配成搶占優先級部分和響應優先級部分。有5組分配方式。
要配置這些優先級組,可以采用庫函數NVIC_PriorityGroupConfig(),可輸入的參數為NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分別為以上介
紹的5種分配組。
中斷優先級設置的步驟:
1. 系統運行開始的時候設置中斷分組。確定組號,也就是確定搶占優先級和子優先級的分配位數。調用函數為NVIC_PriorityGroupConfig();
2. 設置所用到的中斷的中斷優先級別。對每個中斷調用函數為NVIC_Init();