串列埠記錄:
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();
STM32筆記記錄4
user main.c 7 warning 223 d function iic busrtwrite declared implicitly 這個是因為程式模組化的時候,你在乙個.c裡面呼叫了另乙個.c的函式而沒有進行外部宣告。你將這個宣告的這個函式前面加上extern應該就好了!或者是函式宣告時...
STM32筆記 ADC DMA方式
adc流程,首先adc採集乙個訊號 訊號範圍大都為0 3.3v,ps 3.3v可通過更改vref暫存器修改 每隔相同時間菜一次數值傳送到乙個可變16位數中,下面是我們的陣列定義 io uint16 t adc convertedvalue 定義該16位數用來傳輸資料,原因是我們使用的12位ad,由於...
STM32筆記 SPI通訊
相對於上次說的iic,這次我們來回憶一下spi,之前並沒有過多深入了解spi協議,所以這次再來記錄一下,首先附上資料裡的spi定義 spi,是英語 serial peripheral inte ce 的縮寫,顧名思義就是序列外圍裝置介面。spi,是一種高速的,全雙工,同步的通訊匯流排,並且在晶元的管...