明解STM32—GPIO應用設計篇之IO外部中斷EXTI原理及使用方法

来源:https://www.cnblogs.com/Sharemaker/archive/2023/06/09/17461890.html
-Advertisement-
Play Games

本篇首先介紹下EXTI的結構,接著介紹外部中斷的相關概念,對STM32的IO外部中斷EXTI有個初步的瞭解,在此基礎上重點圍繞IO外部中斷EXTI的使用展開分析。 ...


一、前言

        在之前針對STM32的GPIO相關API函數及配置使用進行了詳細的介紹,GPIO作為輸入引腳時,調用相關讀信號引腳函數介面就可以在程式的迴圈中,輪詢的對輸入信號進行讀取檢測操作,除了輪詢的方式訪問輸入引腳,還可以通過另外一種叫做外部中斷的方式來對引腳的輸入信號進行檢測,本篇首先介紹下EXTI的結構,接著介紹外部中斷的相關概念,對STM32的IO外部中斷EXTI有個初步的瞭解,在此基礎上重點圍繞IO外部中斷EXTI的使用展開分析。

圖1 外部中斷設計


二、EXTI結構

        EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的 20個中斷/事件線。每個中斷/事件線都對應有一個邊沿檢測器,可以實現輸入信號的上升沿檢測和下降沿的檢測。EXTI 可以實現對每個中斷/事件線進行單獨配置,可以單獨配置為中斷或者事件,以及觸發事件的屬性。

        在圖2可以看到很多在信號線上打一個斜杠並標註“20”字樣,這個表示在控制器內部類似的信號線路有 20 個,這與 EXTI 總共有 20 個中斷/事件線是吻合的。所以我們只要明白其中一個的原理,那其他 19 個線路原理也就知道了。

圖2 EXTI結構

        EXTI 可分為兩大部分功能,一個是產生中斷,另一個是產生事件,這兩個功能從硬體上就有所不同。

        中斷和事件的區別:

        事件:某一信號出現,比如上升沿或者下降沿。不一定觸發中斷。

        中斷:某一的事件發生,並產生中斷,然後跳到相應的中斷服務函數中進行相應的處理

        首先我們來看圖中紅色虛線指示的電路流程。它是一個產生中斷的線路,最終信號流入到 NVIC 控制器內。

        編號 1 是輸入線,EXTI 控制器有 19 個中斷/事件輸入線,這些輸入線可以通過寄存器設置為任意一個 GPIO,也可以是一些外設的事件,這部分內容我們將在後面專門講解。輸入線一般是存在電平變化的信號。

        編號 2 是一個邊沿檢測電路,它會根據上升沿觸發選擇寄存(EXTI_RTSR)和下降沿觸發選擇寄存器(EXTI_FTSR)對應位的設置來控制信號觸發。邊沿檢測電路以輸入線作為信號輸入端,如果檢測到有邊沿跳變就輸出有效信號 1 給編號 3 電路,否則輸出無效信號0。而 EXTI_RTSR 和 EXTI_FTSR 兩個寄存器可以控制器需要檢測哪些類型的電平跳變過程,可以是只有上升沿觸發、只有下降沿觸發或者上升沿和下降沿都觸發。

        編號 3 電路實際就是一個或門電路,它一個輸入來自編號 2 電路,另外一個輸入來自軟體中斷事件寄存器(EXTI_SWIER)。EXTI_SWIER允許我們通過程式控制就可以啟動中斷/事件線,這在某些地方非常有用。我們知道或門的作用就是有 1 就為 1,所以這兩個輸入隨便一個有有效信號 1就可以輸出 1 給編號 4和編號 6電路。

        編號 4 電路是一個與門電路,它一個輸入是編號 3 電路,另外一個輸入來自中斷屏蔽寄存器(EXTI_IMR)。與門電路要求輸入都為 1 才輸出 1,導致的結果是如果EXTI_IMR 設置為 0 時,那不管編號 3 電路的輸出信號是 1 還是 0,最終編號 4 電路輸出的信號都為 0;如果EXTI_IMR設置為1時,最終編號4電路輸出的信號才由編號3電路的輸出信號決定,這樣我們可以簡單的控制 EXTI_IMR 來實現是否產生中斷的目的。編號 4 電路輸出的信號會被保存到掛起寄存器(EXTI_PR)內,如果確定編號 4 電路輸出為 1 就會把 EXTI_PR 對應位置1。

        編號 5 是將 EXTI_PR 寄存器內容輸出到 NVIC 內,從而實現系統中斷事件控制。

        接下來我們來看看綠色虛線指示的電路流程。它是一個產生事件的線路,最終輸出一個脈衝信號。產生事件線路是在編號3電路之後與中斷線路有所不同,之前電路都是共用的。

        編號6電路是一個與門,它一個輸入來自編號 3 電路,另外一個輸入來自事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR設置為 0時,那不管編號 3電路的輸出信號是 1還是 0,最終編號 6 電路輸出的信號都為 0;如果EXTI_EMR 設置為 1 時,最終編號 6 電路輸出的信號才由編號 3 電路的輸出信號決定,這樣我們可以簡單的控制 EXTI_EMR 來實現是否產生事件的目的。

        編號 7 是一個脈衝發生器電路,當它的輸入端,即編號 6 電路的輸出端,是一個有效信號 1 時就會產生一個脈衝;如果輸入端是無效信號就不會輸出脈衝。

        編號 8 是一個脈衝信號,就是產生事件的線路最終的產物,這個脈衝信號可以給其他外設電路使用,比如定時器 TIM、模擬數字轉換器 ADC等等,這樣的脈衝信號一般用來觸發 TIM 或者 ADC開始轉換。

        產生中斷線路目的是把輸入信號輸入到 NVIC,進一步會運行中斷服務函數,實現功能,這樣是軟體級的。而產生事件線路目的就是傳輸一個脈衝信號給其他外設使用,並且是電路級別的信號傳輸,屬於硬體級的。

        另外,EXTI是在 APB2匯流排上的,在編程時候需要註意到這點。


三、IO外部中斷概念

        外部中斷是單片機實時地處理外部事件的一種內部機制。當某種外部事件發生時,單片機的中斷系統將迫使CPU暫停正在執行的程式,轉而去進行中斷事件的處理;中斷處理完畢後.又返回被中斷的程式處,繼續執行下去。

圖3 外部中斷概念內容

1、外部中斷映射

        外部中斷/事件控制器EXTI包含多達 23 個用於產生事件/中斷請求的邊沿檢測器。每根輸入線都可單獨進行配置,以選擇類型(中斷或事件)和相應的觸發事件(上升沿觸發、下降沿觸發或邊沿觸發)。每根輸入線還可單獨屏蔽。

        以STM32F407為例,支持多達 23 個軟體事件/中斷請求,這些事件/中斷請求通過EXTI線輸入到EXTI控制器中去,其中各EXTI線連接如下:

        EXTI_Line0~15:連接外部 GPIO 口的輸入中斷。

        EXTI_Line16:連接到 PVD 輸出

        EXTI_Line17:連接到 RTC 鬧鐘事件

        EXTI_Line18:連接到 USB OTG FS 喚醒事件

        EXTI_Line19:連接到乙太網喚醒事件

        EXTI_Line20:連接到 USB OTG HS(在 FS 中配置)喚醒事件

        EXTI_Line21:連接到 RTC 入侵和時間戳事件

        EXTI_Line22:連接到 RTC 喚醒事件

        我們在這裡重點討論的是GPIO口的輸入中斷,因此EXTI_Line16~EXTI_Line22不是本文討論的重點。STM32的每個GPIO引腳都可以作為外部中斷輸入,STM32的GPIO口引腳多達幾十個甚至上百個,因此既然每個GPIO引腳都可以作為外部中斷輸入,而EXTI_Line0~15只有16個,因此IO引腳和外部中斷線的對應關係如下:

圖4 外部中斷/事件 GPIO 映射

        從圖4中可以看出,由於STM32每個GPIO埠都有16個pin引腳,因此EXTI_Line0~15對應的是引腳pin0~pin15。例如EXTI_Line0對應GPIOA0~GPIOI0,因此類推EXTI_Line1對應GPIOA1~GPIOI1,因此每個EXTI_Line可以對應最多9個pin引腳,具體映射到那個pin引腳上,需要進行相應的配置。

2、外部中斷寄存器

(1)、中斷屏蔽寄存器EXTI_IMR

        圖5為斷屏蔽寄存器定義,本寄存器用於打開和關閉外部中斷的請求,0~22位有效,對應之前提到的23個外部中斷請求,對應的位寫0時,關閉外部中斷請求;對應位寫1時,打開外部中斷請求。

圖5 中斷屏蔽寄存器定義

(2)、事件屏蔽寄存器EXTI_EMR

        圖6為事件屏蔽寄存器定義,本寄存器用於打開和關閉外部事件的請求,0~22位有效,對應之前提到的23個外部事件請求,對應的位寫0時,關閉外部事件請求;對應位寫1時,打開外部事件請求。事件只是一個觸發信號,它作為中斷的觸發源,可以觸發中斷,也可以不觸發中斷,打開對應EXTI_IMR的中斷屏蔽位,那麼事件可以觸發對應的中斷。只有觸發了中斷後,程式才會跳轉到對應的中斷處理程式中去。

圖6 事件屏蔽寄存器定義

(3)、上升沿觸發選擇寄存器EXTI_RTSR

        圖7為上升沿觸發選擇寄存器定義,本寄存器用於設置外部中斷的觸發事件是信號的上升沿,0~22位有效,對應之前提到的23個外部事件請求,對應的位寫0時,關閉外部事件信號上升沿請求,不可以觸發信號上升沿中斷;對應位寫1時,打開外部信號上升沿請求,可以觸發信號上升沿中斷。

圖7 上升沿觸發選擇寄存器定義

(4)、下降沿觸發選擇寄存器EXTI_FTSR

        圖8為下降沿觸發選擇寄存器定義,本寄存器用於設置外部中斷的觸發事件是信號的下降沿,0~22位有效,對應之前提到的23個外部事件請求,對應的位寫0時,關閉外部事件信號下降沿請求,不可以觸發信號下降沿中斷;對應位寫1時,打開外部信號下降沿請求,可以觸發信號下降沿中斷。

圖8 下降沿觸發選擇寄存器定義

(5)、軟體中斷事件寄存器EXTI_SWIER

        圖9為軟體中斷事件寄存器定義,本寄存器可以用軟體程式的方式來觸發事件中斷的產生,用來模擬外部實際事件中斷的產生,0~22位有效,對應之前提到的23個外部事件請求,對應位寫1時,用於模擬外部事件的產生,對應位寫0時,用於複位事件狀態,下次可以再寫1產生事件。因此,這個寄存器是用軟體程式模擬外部實際事件的產生從而觸發中斷,當然前提是打開了IMR和EMR。

圖9 軟體中斷事件寄存器定義

(6)、掛起寄存器EXTI_PR

        圖10為掛起寄存器寄存器定義,本寄存器可以標誌是否產生了外部中斷事件請求,同時可以通過向對應位寫1來清除中斷事件,0~22位有效,對應之前提到的23個外部事件請求,讀到對應位為1時,表示發生了外部事件中斷;讀到對應位為1時,表示沒有發生外部事件中斷。因此一旦觸發中斷條件就對應位被置為1,不過要在中斷服務函數裡面向對應位寫1清除中斷,不然就導致會一直進入中斷。

圖10 掛起寄存器定義

3、外部中斷API函數

        本節所介紹的STM32的EXTI函數介面是STM32標準庫的函數介面,在詳細介紹各個API函數介面功能之前,我們需要對函數介面中使用到的關鍵的參數進行分析。

1 EXTI_InitTypeDef* EXTI_InitStruct

        這個參數是EXTI函數埠需要初始化的功能參數的結構體指針,下麵我們看看這個結構體的定義。

1 typedef struct
2 {
3   uint32_t EXTI_Line;              //外部中斷事件連接線                                                 
4   EXTIMode_TypeDef EXTI_Mode;      //外部中斷事件模式                                    
5   EXTITrigger_TypeDef EXTI_Trigger; //邊沿事件觸發方式                                      
6   FunctionalState EXTI_LineCmd;     //外部中斷事件連接線開關
7 }EXTI_InitTypeDef;

(a)、外部中斷事件連接線:可選範圍為EXTI_Line0~EXTI_Line15。

(b)、外部中斷事件模式:用於選擇發生EXTI的模式,可選的模式如下。

1 typedef enum
2 {
3   EXTI_Mode_Interrupt = 0x00,  //中斷模式
4   EXTI_Mode_Event = 0x04       //事件模式
5 }EXTIMode_TypeDef;

(c)、邊沿事件觸發方式:用於選擇外部IO輸入時信號邊沿觸發事件的方式。

1 typedef enum
2 {
3   EXTI_Trigger_Rising = 0x08,        //信號上升沿觸發
4   EXTI_Trigger_Falling = 0x0C,       //信號下降沿觸發
5   EXTI_Trigger_Rising_Falling = 0x10  //信號雙邊沿觸發
6 }EXTITrigger_TypeDef;

(d)、外部中斷事件連接線開關:用於打開和關閉外部中斷事件連接線。

1 typedef enum 
2 {
3   DISABLE = 0,         //關閉外部中斷事件連接線
4   ENABLE = !DISABLE   //打開外部中斷事件連接線
5 } FunctionalState;

        下麵就對具體的函數介面進行逐個的介紹。由於使用的是STM32的標準庫,EXTI相關的函數及配置定義和可以調用的介面放置在官方提供的標準庫文件 stm32fxx_exti.c和頭文件 stm32fxx_exti.h 文件中。

(1)、void EXTI_DeInit(void);

        作用:將EXTI的各個寄存器值恢復到複位值,各個寄存器複位值如下。

1 EXTI->IMR = 0x00000000;
2 EXTI->EMR = 0x00000000;
3 EXTI->RTSR = 0x00000000;
4 EXTI->FTSR = 0x00000000;
5 EXTI->PR = 0x007FFFFF;

(2)、void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

        作用:對外部中斷的中斷線進行初始化操作。

        舉例:

1 EXTI_InitStructure.EXTI_Line = EXTI_Line2; //外部中斷事件連接線為EXTI2
2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
3 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO輸入信號為下降沿觸發
4 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開外部中斷事件連接線
5 EXTI_Init(&EXTI_InitStructure);

(3)、void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);

        作用:獲取EXTI的一個預設狀態,可應用於某個外部中斷事件上。該函數內部預設狀態如下。

1 EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; //外部中斷事件連接線為無
2 EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
3 EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling;//外部IO輸入信號為下降沿觸發
4 EXTI_InitStruct->EXTI_LineCmd = DISABLE;//關閉外部中斷事件連接線

        舉例:EXTI_StructInit(&exti_InitStruct),使用exti_InitStruct快速獲取到了外部中斷事件預設狀態值。

(4)、void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

        作用:使用軟體的方式模擬產生一個外部中斷,前提是使能了EXTI_IMR和EXTI_EMR。

        舉例:EXTI_GenerateSWInterrupt(EXTI_Line2),通過軟體方式在EXTI_Line2上產生了一個中斷。

(5)、FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

        作用:檢測外部事件標誌位,判斷外部事件是否產生。FlagStatus=RESET,事件未產生;FlagStatus=SET,事件產生。

        舉例:status = EXTI_GetFlagStatus(EXTI_Line2),檢測EXTI_Line2上外部事件標誌位。

(6)、void EXTI_ClearFlag(uint32_t EXTI_Line);

        作用:清除外部事件標誌位。

        舉例:EXTI_ClearFlag(EXTI_Line2),清除EXTI_Line2外部事件標誌位。

(7)、ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

        作用:檢測外部中斷標誌位,判斷外部中斷是否產生。ITStatus =RESET,中斷未產生;ITStatus=SET,中斷產生。

        舉例:status = EXTI_GetITStatus(EXTI_Line2),檢測EXTI_Line2上外部中斷標誌位。

(8)、void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

        作用:清除外部中斷標誌位。

        舉例:EXTI_ClearITPendingBit(EXTI_Line2),清除EXTI_Line2外部中斷標誌位。


四、IO外部中斷配置應用步驟

圖11 IO外部中斷配置使用內容

(1)、初始化相應的GPIO引腳

        需要按照GPIO的普通IO輸入進行引腳的初始化,同時使能對用GPIO的外設時鐘。

1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA的外設時鐘
2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//設置使用引腳
3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通IO輸入
4 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//根據實際應用配置輸出速度
5 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//根據實際應用配置上拉或下拉電阻
6 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA1引腳

(2)、初始系統配置控制器SYSCFG

        系統配置控制器SYSCFG可以用於管理GPIO外部中斷線連接。需要開啟SYSCFG 時鐘,同時需要將外部中斷事件線 EXTI_Line和GPIO的引腳pin進行關係映射。

1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能 SYSCFG 時鐘
2 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource1);//PA1連接到中斷線1

        將中斷線 1 與GPIOA 映射起來,那麼此處很顯然是 GPIOA的pin1與 EXTI_Line1中斷線連接了。

(3)、初始化外部中斷事件線

        即調用EXTI_Init介面對中斷線進行配置,設置好EXTI_Line的參數。

1 EXTI_InitStructure.EXTI_Line = EXTI_Line1; //外部中斷事件連接線為EXTI1,根據實際情況設置
2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI模式為外部中斷模式
3 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //外部IO輸入信號為下降沿觸髮根據實際情況設置
4 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//打開外部中斷事件連接線
5 EXTI_Init(&EXTI_InitStructure);

(4)、初始化NVIC

        NVIC是嵌套向量中斷控制器,屬於內核外設,管理著包括內核和片上所有外設的中斷相關的功能。關於NVIC的知識,可以回顧明解STM32中斷系統的內容進行詳細的瞭解。

1 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能外部中斷EXTI1,根據實際情況設置
2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先順序2,根據實際情況設置
3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //響應優先順序2,根據實際情況設置 
4 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道 
5 NVIC_Init(&NVIC_InitStructure); //中斷優先順序分組初始化

(5)、中斷服務函數編寫

        雖然EXTI的外部中斷事件線有16個為EXTI_Line0~EXTI_Line15,但是STM32規定好的GPIO外部中斷服務函數只有7個:

1 EXTI0_IRQHandler
2 EXTI1_IRQHandler
3 EXTI2_IRQHandler
4 EXTI3_IRQHandler
5 EXTI4_IRQHandler
6 EXTI9_5_IRQHandler
7 EXTI15_10_IRQHandler

  可以看出EXTI_Line0~EXTI_Line4每個中斷線對應一個中斷函數,中斷線EXTI_Line5~EXTI_Line9共用中斷函數 EXTI9_5_IRQHandler,EXTI_Line10~EXTI_Line15 共用中斷函數 EXTI15_10_IRQHandler。

        一個標準的GPIO外部中斷服務函數模板如下:

1 void EXTI1_IRQHandle(void)
2 {
3   if(EXTI_GetITStatus(EXTI_Line1)!=RESET)//判斷某個EXTI_Line上的中斷是否發生
4   {
5     ................ //此處用戶自行定義中斷處理邏輯
6     EXTI_ClearITPendingBit(EXTI_Line3); //清除EXTI_Line上的中斷標誌位
7   } 
8 }

        需要註意的是:EXTI9_5_IRQHandler和EXTI15_10_IRQHandler這兩個中斷由於是多個中斷線共用,因此中斷服務函數中可以分別放置多個EXTI_Line的處理邏輯。


五、總結

        本篇在GPIO基本API和配置使用流程基礎之前,對EXTI的結構功能,普通IO輸入使用成外部中斷的方式進行了詳細介紹。圍繞外部中斷概念和外部中斷的配置使用分別進行了介紹分析,通過分析外部中斷相關API和寄存器,瞭解外部中斷和GPIO引腳的映射關係,功能特性等,從而能更好的應用外部中斷的介面完成一系列外部中斷的配置使用工作。


更多技術內容和書籍資料獲取,入群技術交流敬請關註“明解嵌入式”

本文來自博客園,作者:Sharemaker,轉載請註明原文鏈接:https://www.cnblogs.com/Sharemaker/p/17461890.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # JGroups概念 在 JGroups 中,集群(cluster)是一個由多個節點組成的邏輯實體,節點可以通過一個共用的集群名稱來進行連接和通信。這個集群名稱可以在配置中指定或在運行時動態創建。 JGroups 提供了多種方式來創建集群,並使節點能夠加入到相同的集群中。下麵是一些常見的方式: 1 ...
  • 【前言】 本文自1年前的1.0版本推出以來,已被業界大量科技公司採用。同時也得到了.Net圈內多位大佬的關註+推薦,文章也被多家頂級.Net/C#公眾號轉載。 現在更新到了7.0版本,更好的服務各位.Neter。 【正文】 支持.Net/.Net Core/.Net Framework,可以部署在D ...
  • #! https://zhuanlan.zhihu.com/p/635569763 # Excel DDE Commands ## 連接參數 `Application`: `Excel` `Topic`: `System`: 整個應用。 [sheetname] 指定 worksheet。 我使用的是 ...
  • # 一個超級大的文件如何更快讀 問題起因 ![](https://img2023.cnblogs.com/blog/2415052/202306/2415052-20230608110517159-989018809.png) 一個有千萬的數據的txt文件如何發揮IO的全部性能更快的讀和寫。 ## ...
  • 為什麼選擇FFmpeg? 延遲低,參數可控,相關函數方便查詢,是選擇FFmpeg作為編解碼器最主要原因,如果是處理實時流,要求低延遲,最好選擇是FFmpeg。 如果需要用Opencv或者C#的Emgucv這種庫來處理視頻流,也多是用FFmpeg做編解碼然後再轉換圖像數據給Opencv去處理。用Ope ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • 大家好,我是 god23bin。今天給大家帶來的是 Linux 命令系列,**每天只需一分鐘,記住一個 Linux 命令不成問題**。今天,我們要介紹的是一個常用且強大的命令:tar。 ...
  • 目錄 一、awk概念 二、awk的工作過程 三、awk字元 四、內置變數 五、getline 六、awk的精準篩選 七、例子演示 八、實驗演示 一、awk概念 1.概念:awk 是一個功能強大的編輯工具,逐行讀取輸入文本,主要作用於文件內容,AWK信息的讀入也是逐行指定的匹配模式進行查找, 對符合條 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...