1. 程式人生 > >NVIC中斷優先順序管理+串列埠通訊基本原理+串列埠通訊基於庫函式的配置例項

NVIC中斷優先順序管理+串列埠通訊基本原理+串列埠通訊基於庫函式的配置例項

沒寫部落格的感悟:昨天沒有寫部落格,今天就倒黴了,得寫兩篇,果然不能偷懶,當天沒有做的事,無論如何你都得要做,為了改掉這個拖延的小毛病,給自己定了一條規則,無論多晚,哪怕沒有網沒有電也得寫完每天更新的部落格,以此勉勵。

今天主要總結和複習三個知識點,NVIC中斷優先順序管理、串列埠通訊、及串列埠通訊的簡單配置例項:

第一部分:

NVIC中斷優先順序管理:

首先是中斷分組,我們知道所用的CM3核心支援256箇中斷,其中包含了16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定。然而STM32並沒有使用CM3核心的全部東西,而是隻用了它的一部分。STM32有84箇中斷,包括16個核心中斷和68個可遮蔽中斷,具有16級可程式設計的中斷優先順序。而我所用的STM32F103系列上面,又只有60個可遮蔽中斷(在107系列才有68個),而STM系列把中斷分為5個組,如下圖一所示

圖一

這麼多大概60箇中斷如何管理,這是我一開始想到的問題,當然是用暫存器進行管理,有七組暫存器對所有的中斷進行管理,中斷暫存器分別如下,引用MDK對暫存器組的分類:

typedef struct
{
  __IO uint32_t ISER[8];                   //中斷使能暫存器組:設定為:8個32位暫存器來控制256箇中斷,由於我用的只有60個故只需設定ISER[0]-ISER[2]即可
       uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                      //中斷除能暫存器組:設定和中斷使能一樣
       uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];                      //中斷掛起暫存器組:設定和中斷使能一樣,通過置一把正在執行的中斷掛起從而執行同級別或更高級別的中斷,寫0無效
       uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                      //中斷解掛控制暫存器組:設定和中斷使能一樣作用和掛起暫存器組相反
       uint32_t RESERVED3[24];                                   
  __IO uint32_t IABR[8];                   //   中斷啟用標誌位暫存器組:這是一個只讀暫存器,如果置一可以知道該位所對應的正在執行的中斷,執行完畢由硬體自動清零
       uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];                   //  中斷優先順序控制暫存器組:這是非常重要的一個暫存器,總共有240個8位的暫存器組成,每8位代表一箇中斷,而每八位只用了其高八位,我所用的103系列只用了0-//67即可,詳細的會在下面給出
       uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;                      // 軟體觸發中斷暫存器組
}  NVIC_Type;      

中斷優先順序控制暫存器組,說這個之前得明白一個概念,優先順序概念,STM系列的中斷優先順序分為兩級,搶佔優先順序和響應優先順序。而又得知道兩者的區別,其中區別如下:

1、高優先順序的搶佔優先順序是可以打斷正在進行的低搶佔優先順序中斷的。 2、搶佔優先順序相同的中斷,高響應優先順序不可以打斷低響應優先順序的中斷 3、搶佔優先順序相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先順序高,哪個先執行。 4、如果兩個中斷的搶佔優先順序和響應優先順序都是一樣的話,則看哪個中斷先發生就先執行; 搶佔優先順序和響應優先順序中,數字越小說明級別越大。舉個例子,假定設定中斷優先順序組為2,然後設定中斷1(RTC中斷)的搶佔優先順序為2,響應優先順序為1。  中斷6(外部中斷0)的搶佔優先順序為3,響應優先順序為0。中斷4(外部中斷1)的搶佔優先順序為2,響應優先順序為0。則中斷優先順序為中斷4>中斷1>中斷6. 在詳細弄懂了上述所有知識後,就可以設定自己我們自己的中斷,具體步驟如下: ①系統執行後先設定中斷優先順序分組。呼叫函式:

voidNVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);/

整個系統執行過程中,只設置一次中斷分組。

②針對每個中斷,設定對應的搶佔優先順序和響應優先順序:

voidNVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

③ 如果需要掛起/解掛,檢視中斷當前啟用狀態,分別呼叫相關函式即可。

第二部分:串列埠通訊基本原理 這個複習得從通訊的背景開始闡述,處理器與外部的通訊分為兩種方式並行和序列方式:並行的優點是速度快缺點為佔用IO口較多,序列則速度慢優點為佔用的IO口較少。序列通訊按照傳輸方向又有三種方式,單工,半雙工,全雙工如圖二所示:
圖二 看完圖應該就很清晰了,再解釋一下 1、單工:資料傳輸只支援資料在一個方向上傳輸 2、半雙工:允許資料在兩個方向上傳輸,但是,在某一時刻,只允許數據在一個方向上傳輸,它實際上是一種切換方向的單工通訊; 3、全雙工:允許資料同時在兩個方向上傳輸,因此,全雙工通訊是兩個單工通訊方式的結合,它要求傳送裝置和接收裝置都有獨立的接收和傳送能力。  按照是否帶時鐘分為同步和非同步,其中STM32的串列埠通訊介面,UART:通用非同步收發器USART:通用同步非同步收發器 我所用的板子中的大概電路如圖三:
圖三 STM32串列埠非同步通訊主要的引數定義為:起始位,資料位,硬體流位,停止位,波特率設定。舉個例子如圖四:
圖四

第三部分: 下面進行第三部分,例項演示,在這之前得明白所用的三個暫存器 1、USART_SR狀態暫存器 2、USART_DR資料暫存器 3、USART_BRR波特率暫存器 而我們在運用庫函式編寫串列埠程式碼過程一般會運用到下面的幾個庫函式:

voidUSART_Init();//串列埠初始化:波特率,資料字長,奇偶校驗,硬體流控以及收發使能

voidUSART_Cmd();//使能串列埠

voidUSART_ITConfig();//使能相關中斷

voidUSART_SendData();//傳送資料到串列埠,DR

uint16_tUSART_ReceiveData();//接受資料,從DR讀取接受到的資料

FlagStatusUSART_GetFlagStatus();//獲取狀態標誌位

voidUSART_ClearFlag();//清除狀態標誌位

ITStatusUSART_GetITStatus();//獲取中斷狀態標誌位

voidUSART_ClearITPendingBit();//清除中斷狀態標誌位

其中提出一點波特率的計算方式如圖5所示:
圖五 最後就可以進行例項操作:總結步驟如下: ①串列埠時鐘使能,GPIO時鐘使能:RCC_APB2PeriphClockCmd(); ②串列埠復位:USART_DeInit(); 這一步不是必須的 ③GPIO埠模式設定:GPIO_Init(); 模式設定為GPIO_Mode_AF_PP ④串列埠引數初始化:USART_Init(); ⑤開啟中斷並且初始化NVIC(如果需要開啟中斷才需要這個步驟)

      NVIC_Init();

      USART_ITConfig();

⑥使能串列埠:USART_Cmd();

⑦編寫中斷處理函式:USARTx_IRQHandler();

⑧串列埠資料收發:

void USART_SendData();//傳送資料到串列埠,DR

uint16_t USART_ReceiveData();//接受資料,從DR讀取接受到的資料

⑨串列埠傳輸狀態獲取:

FlagStatusUSART_GetFlagStatus(USART_TypeDef* USARTx,uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

編寫得主函式程式碼如下:

#include "stm32f10x.h"
//串列埠通訊實驗1
void my_usart_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructA;
USART_InitTypeDef USART_InitStructA;
NVIC_InitTypeDef NVIC_InitStructA;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//enable GPIOA和USART1 的時鐘
//初始化GPIOA,查表可知串列埠1傳送模式下是全雙工,GPIO口設定為推輓複用模式
GPIO_InitStructA.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructA.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructA.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructA); 
//初始化GPIOA,查表可知串列埠1接受模式下是全雙工,GPIO口設定為浮空輸入模式
GPIO_InitStructA.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructA.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructA.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructA); 
//初始化串列埠引數
USART_InitStructA.USART_BaudRate=115200;
USART_InitStructA.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructA.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStructA.USART_Parity=USART_Parity_No;
USART_InitStructA.USART_StopBits=USART_StopBits_1;
USART_InitStructA.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructA);

//開啟接受中斷且初始化NVIC
NVIC_InitStructA.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructA.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructA.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructA.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructA);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//設定串列埠狀態
USART_Cmd(USART1, ENABLE);                    //使能串列埠1 
}
void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE))//由於有可能開啟了很多中斷故需要判斷是否是我們所要的中斷函式
{
res=USART_ReceiveData(USART1);//接受來自串列埠一的資料
USART_SendData(USART1,res);//
}
}
 int main(void)
 {
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
my_usart_Init();
while(1);
//執行以後就一直在主函式等待,當電腦給單片機發送資料時就跳到中斷
 
 }
由於我沒有JLINK線上除錯,故用USB直接下載到微控制器進行除錯,最後用串列埠助手可以得到所設想達到的輸出:結果如圖六


圖六


其中白色的傳送是先經過PC先發送給微控制器,如然後微控制器又傳送給PC由串列埠助手在列印得出;


相關推薦

NVIC中斷優先順序管理+串列通訊基本原理+串列通訊基於函式配置例項

沒寫部落格的感悟:昨天沒有寫部落格,今天就倒黴了,得寫兩篇,果然不能偷懶,當天沒有做的事,無論如何你都得要做,為了改掉這個拖延的小毛病,給自己定了一條規則,無論多晚,哪怕沒有網沒有電也得寫完每天更新的部落格,以此勉勵。 今天主要總結和複習三個知識點,NVIC中斷優先順序管理

【STM32】NVIC中斷優先順序管理中斷向量表)

STM32F1xx官方資料:《STM32中文參考手冊V10》-第9章 中斷和事件Cortex-M3核心支援256箇中斷,其中包含了16個核心中斷(異常)和240個外部中斷,並且具有256級的可程式設計中斷設定。但是,STM32並沒有使用CM3核心的全部東西,而是隻用了它的一部

NVIC 中斷優先順序管理詳解

1.NVIC(內嵌向量中斷控制器) STM32系列總共有84箇中斷,其中我用的STM32F103系列的板子也有60箇中斷,可想而知STM32一定有一箇中斷的管理機制來管理這麼多中斷,使能中斷並且配置

【STM32】串列通訊基本原理(超基礎、詳細版)

STM32F1xx官方資料:《STM32中文參考手冊V10》-第25章通用同步非同步收發器(USART)通訊介面背景知識裝置之間通訊的方式一般情況下,裝置之間的通訊方式可以分成並行通訊和序列通訊兩種。它們的區別是:並、序列通訊的區別並行通訊序列通訊傳輸原理資料各個位同時傳輸資

[原創]NVIC中斷優先順序分組與中斷優先順序和子優先順序

Cortex-M核心提出中斷分組的概念,一共5組 NVIC_PriorityGroup_0 :0 bit 搶佔優先順序 4 bit 子優先順序 NVIC_PriorityGroup_1 :1 bit 搶佔優先順序 3 bit 子優先順序 NVIC_PriorityGroup_2 :2

正點原子 24 NVIC中斷優先順序分組

數值越小,優先順序越高 高優先順序的搶佔優先順序是可以打斷正在進行的低搶佔優先順序中斷的。 搶佔優先順序相同的中斷,高響應優先順序不可以打斷低響應優先順序的中斷。 搶佔優先順序相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先順序高,哪個先執行。 如果兩個中斷的搶佔優先順序和響應優先順序

STM32 NVIC中斷優先順序

1 NVIC 介紹 STM32 有2 個優先順序:(1)搶佔式優先順序(主優先順序),(2)響應優先順序,每個中斷源都需要指定這兩種優先順序。 1.1 配置 STM32 把 中斷優先順序暫存器變成 4位

STM32串列USART用法的進階(標準函式版本)空閒中斷+DMA

任務:配置串列埠,完成資料的收發。方法1:普通操作----直接傳送&中斷接收第0步:printf的準備//加入以下程式碼,支援printf函式,而不需要選擇use MicroLIB 百度搜索:半主機模式 #if 1 方法1 #pragma import(__use

STM32 對於NVIC中斷優先順序的設定

用STM32做專案已經有段時間了,但是我忽然發現我對NVIC其實一點都不瞭解,所以今天補習了一下NVIC的知識以及我自己對NVIC中斷優先順序設定的瞭解,希望對大家有所幫助: 對於NVIC中斷優先順序的設定一直都不是很清楚; 具體函式如下: /* Configur

linux連結串列list_head的基本原理及使用

1、list_head結構原型 struct  list_head{ struct  list_head *next,*prev; }; 此結構體構成的連結串列為雙向迴圈連結串列。該結構體在linux核心中被大量引用,幾乎所有核心當中需要構成連結串列結構的地方都用

網路通訊基本原理-圖

ARP(Address Resolution Protocol) 地址解析協議 根據IP地址獲取實體地址的一個TCP/IP協議。 過程: 主機發送資訊時將包含目標IP地址的 AR

數據基本原理# 3:一個數據中有什麽?

決定 完整 存在 相關 recipe 信息 插入 是什麽 window 數據庫基本原理# 3:一個數據庫中有什麽? 值得一提的是很多人將不需要去創建他們自己的數據庫。你可能從不會去創建你自己的表格或者是其他的一些數據結構。你可能是安裝應用系統為你創建數據庫,你也只是做一些備

FPGA-14-串列通訊原理和傳送模組

瞭解串列埠通訊首先要了解串列埠通訊的原理: 串列埠通訊的概念非常簡單,串列埠按位(bit)傳送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一根線傳送資料的同時用另一根線接收資料。它很簡單並且能夠實現遠距離通訊。比如IEEE488定義並行通行狀態時,規定裝置線總長不得

STM32 串列基本配置(暫存器版)筆記

1.串列埠1.串列埠作為MCU和外界的連線工具,既可以檢驗程式碼的正確性,也可以和上位機進行交流2.在STM32F103RCT6中,最多支援5路串列埠,對於串列埠而言,一般使用序列通訊(USART1--5)3.幾個比較重要的暫存器:<1>:USART->SR

target裝置主動通訊遇到linux串列預設模式的尷尬

issue:sahara fail,場景linux系統第一次開機時,切到9008下載口 高通提供了一種升級方式是firehose,它工作在9008口,firehose的執行程式需要由sahara寫入pbl。 firehose可以很好的工作在windows端,模組系統接入android,會生成/dev/tt

基於AT89C52和串列通訊助手的串列通訊

我們要實現的功能是在程式執行的時候通過微控制器的串列埠向串列埠除錯助手傳送一個字串諸如“hello world”,串列埠通訊助手接收到字串之後顯示並由使用者反饋回去一個長度為4的字串並顯示到數碼管上 來看一下效果 首先是串列埠通訊電路的配置和藉助VSPD

利用boost網路通訊協議進行串列通訊的問題

菜狗玩ROS最近遇到一個問題,叫做error: stray ‘\200’ in program,除錯多次發現是因為貼上網頁程式碼,導致帶有中文字元,將報錯的一行程式碼前的空格刪除再調整格式,便可以通過編譯。 然而問題又來啦,執行生成的讀取串列埠的節點時,遇到這樣一個問題:

arm板 釋放ttyS0作為通訊串列(關閉除錯串列

釋放ttyS0作為通訊串列埠 #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <termios.h>

STM32F10x USART串列對映功能實現串列通訊 485初始化

這篇文章很有用!新手不要自以為是,STM32串列埠管腳重對映小樣你會嗎??? STM32F10x 系列微控制器中都包含了USART 模組,所謂USART,就是通用同步非同步收發器。通用同步非同步收發器(USART)提供了一種靈活的方法與使用工業標準NRZ非同步序列資料格

Android 模擬器串列與PC虛擬串列通訊

1、開發環境 (1) Android Studio 3.0.1      (2) JDK 1.8   (3)  1、建立SerialPortNDKText 工程 2、在工程的main目錄下,建立jniLibs資料夾,如:E:\androidcod