明解STM32—GPIO應用設計篇之API函數及配置使用技巧

来源:https://www.cnblogs.com/Sharemaker/archive/2023/04/26/17357416.html
-Advertisement-
Play Games

一、前言 本篇開始對STM32的GPIO在實際開發設計中的使用配置和技巧進行探討,可以先去回顧下之前介紹的GPIO的相關理論基礎知識包括基本結構,工作模式和寄存器原理。 瞭解過STM32的GPIO相關的理論知識,這樣在應用GPIO開發過程中,能更好的理解GPIO的特點,應用起來會更加的得心應手。 後 ...


一、前言

        本篇開始對STM32的GPIO在實際開發設計中的使用配置和技巧進行探討,可以先去回顧下之前介紹的GPIO的相關理論基礎知識包括基本結構,工作模式和寄存器原理。

        瞭解過STM32的GPIO相關的理論知識,這樣在應用GPIO開發過程中,能更好的理解GPIO的特點,應用起來會更加的得心應手。

        後續將從以下圖1中所示的幾個方面對GPIO應用設計中的步驟展開介紹。本篇先介紹GPIO的基本API函數定義,配置初始化的流程,以及使用技巧;針對將GPIO的引腳用於外部中斷的功能將作為單獨的一篇進行詳細的討論介紹。

圖1 GPIO應用設計


二、API函數

        STM32有多種類型的庫,本節所介紹的STM32的GPIO函數介面是STM32標準庫的函數介面,介面總共分為4種類型,如圖2所示。

圖2 GPIO庫函數介面分類

1、關鍵參數

        在詳細介紹各個API函數介面功能之前,我們需要對函數介面中使用到的關鍵的幾個參數進行分析。

(1)、GPIO_TypeDef* GPIOx

        這個參數是用於指定需要具體的GPIO埠號定義,參數的範圍為GPIOA~GPIOK。

(2)、GPIO_InitTypeDef* GPIO_InitStruct

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

1 typedef struct
2 {
3     uint32_t GPIO_Pin;            //GPIO埠的引腳
4     GPIOMode_TypeDef GPIO_Mode;   //GPIO的埠模式                                         
5     GPIOSpeed_TypeDef GPIO_Speed; //GPIO的輸出速度頻率
6     GPIOOType_TypeDef GPIO_OType; //GPIO輸出時的類型
7     GPIOPuPd_TypeDef GPIO_PuPd;   //GPIO上下拉電阻設置                                       
8 }GPIO_InitTypeDef;

  (a)、GPIO埠的引腳:可選範圍為GPIO_Pin_0~GPIO_Pin_15,也可以選所有引腳GPIO_Pin_All。

  (b)、GPIO的埠模式:用於設置GPIO的埠模式,可選的埠模式如下。

1 typedef enum
2 {
3     GPIO_Mode_IN  = 0x00, //普通IO口輸入
4     GPIO_Mode_OUT = 0x01, //普通IO口輸出
5     GPIO_Mode_AF  = 0x02, //管腳復用功能
6     GPIO_Mode_AN  = 0x03  //模擬輸入,用於ADC功能
7 }GPIOMode_TypeDef;

        (c)、GPIO的輸出速度頻率:當GPIO引腳用於普通功能輸出或復用功能輸出時,GPIO的輸出速度頻率,可選的輸出速率如下。

1 typedef enum
2 {
3     GPIO_Low_Speed     = 0x00, //GPIO_Speed_2MHz
4     GPIO_Medium_Speed  = 0x01, //GPIO_Speed_25MHz
5     GPIO_Fast_Speed    = 0x02, //GPIO_Speed_50MHz
6     GPIO_High_Speed    = 0x03  //GPIO_Speed_100MHz
7 }GPIOSpeed_TypeDef;

        速度高的IO耗電大、雜訊也大,速度低的IO耗電小、雜訊也小。使用合適的速度可以降低功耗和雜訊。高頻的驅動電路,雜訊也高,當不需要高的輸出頻率時,請選用低頻驅動電路,這樣非常有利於提高系統的EMI性能,也可以降低功耗。當然如果要輸出較高頻率的信號,但卻選用了較低頻率的速度,很可能會得到失真的輸出信號。關鍵是GPIO的引腳速度跟應用匹配。

        (d)、GPIO輸出時的類型:當GPIO引腳用於普通功能輸出或復用功能輸出時,可選擇設置的GPIO的輸出結構類型有如下。

1 typedef enum
2 {
3     GPIO_OType_PP = 0x00, //推輓結構
4     GPIO_OType_OD = 0x01 //開漏結構
5 }GPIOOType_TypeDef;

        推輓輸出時,可以輸出高或者低電平;開漏輸出時,如果要輸出高電平,則需要在晶元內部配置上拉電阻(弱上拉)或者在晶元IO外部連接上拉電阻。

        (e)、GPIO上下拉電阻設置:可以為GPIO埠的引腳選擇設置是否具備帶上拉或下拉電阻功能。

1 typedef enum
2 {
3     GPIO_PuPd_NOPULL = 0x00, //無上拉或者下拉
4     GPIO_PuPd_UP     = 0x01, //帶上拉電阻
5     GPIO_PuPd_DOWN   = 0x02 //帶下拉電阻
6 }GPIOPuPd_TypeDef;

        STM32晶元GPIO的上拉電阻和下拉電阻最小值,典型值和最大值如下:

 

(3)、uint16_t GPIO_PinSource和uint8_t GPIO_AF

        這兩個參數都是GPIO埠引腳需要配置成復用功能引腳用到的參數。

        GPIO_PinSource:指需配置的復用功能引腳源,可選範圍GPIO_PinSource0~GPIO_PinSource15。

        GPIO_AF:指該引腳具體需要配置的功能,具體配置功能要看實際應用需求,例如需要配置成SPI1功能的引腳,那麼就選GPIO_AF_SPI1。

2、函數介面

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

(1)、void GPIO_DeInit(GPIO_TypeDef* GPIOx);

        作用:將GPIO埠設置成初始的預設狀態,相當於複位GPIO埠,預設的狀態為輸入浮空的狀態。

        舉例:GPIO_DeInit(GPIOA),將GPIOA埠所有引腳複位到預設狀態。

(2)、void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

        作用:將GPIO埠引腳進行功能狀態初始化。

        舉例:將GPIOA的pin1引腳設為普通輸出功能,IO驅動速率可達50MHz,推輓模式,帶上拉電阻。

1 gpio_InitStruct.GPIO_Pin = GPIO_Pin_1;
2 gpio_InitStruct. GPIO_Mode = GPIO_Mode_OUT;
3 gpio_InitStruct.GPIO_Speed = GPIO_Fast_Speed;
4 gpio_InitStruct. GPIO_OType = GPIO_OType_PP;
5 gpio_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
6 GPIO_Init(GPIOA, &gpio_InitStruct);

 (3)、void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

        作用:獲取GPIO埠的所有引腳的一個預設狀態,可應用於某個GPIO埠上。該函數內部預設的引腳預設狀態如下。

1 GPIO_InitStruct->GPIO_Pin  = GPIO_Pin_All;
2 GPIO_InitStruct->GPIO_Mode = GPIO_Mode_IN;
3 GPIO_InitStruct->GPIO_Speed = GPIO_Speed_2MHz;
4 GPIO_InitStruct->GPIO_OType = GPIO_OType_PP;
5 GPIO_InitStruct->GPIO_PuPd = GPIO_PuPd_NOPULL;

        舉例:使用gpio_InitStruct快速獲取到了引腳的預設狀態值。

1 GPIO_StructInit(&gpio_InitStruct);

(4)、void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        作用:將指定GPIO埠引腳當前的配置進行鎖定,鎖定後該引腳配置不能被修改,只有等下次MCU複位鎖定才能釋放。

        舉例:鎖定GPIOA的管腳pin1配置不被修改。

1 GPIO_PinLockConfig(GPIOA, GPIO_Pin_1);

(5)、uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        作用:為當GPIO的相應管腳配置成輸入時,讀取該GPIO埠下的相應引腳輸入電平值。

        舉例:讀取GPIOA的pin1引腳輸入電平值。

1 status = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);

(6)、uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

        作用:為當GPIO配置成輸入時,讀取該GPIO埠下的所有引腳輸入電平值。

        舉例:讀取GPIOA埠所有引腳的輸入電平值。

1 status = GPIO_ReadInputData(GPIOA);

(7)、uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        作用:為當GPIO的相應管腳配置成輸出時,讀取該GPIO埠下的相應引腳輸出電平值。

        舉例:讀取GPIOA的pin1引腳輸出電平值。

1 status = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1);

(8)、uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

        作用:為當GPIO配置成輸出時,讀取該GPIO埠下的所有引腳輸出電平值。

        舉例:讀取GPIOA埠所有引腳的輸出電平值。

1 status = GPIO_ReadOutputData(GPIOA);

(9)、void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        作用:置位相應GPIO埠引腳的電平值。

        舉例:將GPIOA的pin1管腳電平置為1。

1 GPIO_SetBits(GPIOA, GPIO_Pin_1);

        也可以用於多個引腳電平的置位。

1 GPIO_SetBits(GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

(10)、void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        作用:清零相應GPIO埠引腳的電平值。

        舉例:將GPIOA的pin1管腳電平置為0。

1 GPIO_ResetBits(GPIOA, GPIO_Pin_1);

        也可以用於多個引腳電平的清零。

1 GPIO_ResetBits(GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

(11)、void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

        作用:將GPIO埠的指定管腳電平置1或置0。

        舉例:將GPIOA的pin1管腳電平置為1。

1 GPIO_WriteBit(GPIOA, GPIO_Pin_1, 1);

        也可以用於多個引腳電平操作。

1 GPIO_WriteBit(GPIOA, GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3, 1);

(12)、void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

        作用:將GPIO埠的所有管腳電平置1或置0。

        舉例:將GPIOA埠的所有管腳電平置為1。

1 GPIO_Write(GPIOA, 1);

(13)、void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

        作用:翻轉指定GPIO引腳的輸出電平,即0變為1,1變為0。

        舉例:翻轉GPIOA的pin1管腳電平值。

1 GPIO_ToggleBits(GPIOA , GPIO_Pin_1);

(14)、void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);

        作用:將GPIO的指定管腳配置成復用功能管腳。

        舉例:將GPIOA的pin9管腳配置成串口USART1的功能管腳。

1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);

三、配置流程

        配置流程主要在實際的驅動配置中對GPIO進行初始化的操作,根據實際項目應用開發中的晶元GPIO引腳的定義,進行合理的配置。圖3所示為GPIO的基本配置操作流程。

圖3 GPIO配置流程

(1)、使能對應GPIO的時鐘

        在配置GPIO的開始,首先需要將對應的GPIO模塊的時鐘打開,這樣才能為GPIO工作提供動力源,因此只有先將GPIO的時鐘打開才能使GPIO正常的工作。

        關於STM32晶元內部整體的時鐘系統,可以回顧之前明解STM32時鐘系統的文章介紹。STM32的GPIO模塊是掛載在晶元內部AHB1匯流排(AHB:高級高性能匯流排)上的外設,因此就需要打開GPIO在AHB1匯流排上對應的時鐘。AHB1匯流排上的外設時鐘開關在STM32提供的標準庫函數中通過函數 RCC_AHB1PeriphClockCmd ()來實現的。例如調用:

1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

         這樣就將GPIOA的時鐘打開,也可以同時打開多個GPIO埠的時鐘:

1 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);

(2)、引腳功能配置

        接下來對GPIO引腳的配置是需要根據實際的項目應用要求,根據各個晶元管腳的定義來對引腳的功能進行合理的配置,主要是根據引腳是使用成普通IO輸出還是輸入,復用功能還是模擬管腳來調用GPIO_Init()函數進行配置。舉例說明:

用於普通IO輸出時:

1 GPIO_WriteBit(GPIOA, GPIO_Pin_1, 1);//向引腳輸出0或1電平,在GPIO_Init前調用
2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//設置使用引腳
3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通IO輸出
4 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//根據實際應用配置輸出結構類型
5 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//根據實際應用配置輸出速度
6 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//根據實際應用配置上拉或下拉電阻
7 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA1引腳

        需要註意的是,初始化輸出電平時,需要先調用寫引腳電平介面,再做初始化操作,這是因為GPIO_WriteBit是將輸出的值寫入寄存器輸出置位/複位寄存器BSRR,BSRR寄存器複位值是0,GPIO_Init相當於將GPIO引腳初始化完打開輸出開關。如果需要輸出的是高電平,GPIO_WriteBit在前,GPIO_Init在後相當於在沒打開開關之前就將1在BSRR中放置好,GPIO_Init將開關一打開就可以輸出高電平;如果GPIO_Init在前,GPIO_WriteBit在後,GPIO_Init完會將BSRR中的0先輸出,過了一個函數指令周期後調用GPIO_WriteBit才輸出高電平,因此若驅動時序對函數指令周期敏感的外圍器件時,可能帶來驅動時序問題!

用於普通IO輸入時:

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

用於復用功能時:

        在管腳應用於復用功能時,需要調用GPIO_PinAFConfig()介面來將管腳配置成具體的外設管腳。

1 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PA9 復用為 USART1
2 GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //PA10復用為USART1
3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //設置使用引腳
4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復用功能
5 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //根據實際應用配置輸出速度
6 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //根據實際應用配置輸出結構類型
7 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //根據實際應用配置上拉或下拉電阻
8 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9和PA10引腳

用於模擬管腳時:

1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道 5
2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模擬輸入
3 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不帶上下拉
4 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA5引腳

        當STM32需要進行 AD( 模數 ) 轉換採樣時,需要把引腳設置為模擬輸入模式,模擬輸入模式下,不需要連接上拉和下拉電阻,因為GPIO用於模擬功能時,引腳的上、下拉電阻是不起作用的。這個時候即使在配置了上拉或下拉電阻,也不會影響到模擬信號的輸入。

(3)、對GPIO引腳進行操作

        在初始化完GPIO引腳的具體配置後,就可以對GPIO引腳進行具體的操作使用了。

用於普通IO輸出時:

  可以調用相關GPIO相關寫操作介面對引腳進行輸出0或者1的操作:GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_ToggleBits。

  也可以調用相關GPIO讀介面對輸出類型的GPIO進行讀取引腳電平的操作GPIO_ReadOutputDataBit。

用於普通IO輸入時:

        可以調用相關GPIO讀介面對輸入類型的GPIO進行讀取引腳電平的操作:GPIO_ReadInputDataBit。

用於復用功能時:

        需要根據實際使用時的具體外設配置,接著初始化相應的片上外設後,調用具體的外設信號讀或者寫介面進行信號的讀寫操作。

用於模擬管腳時:

        由於模擬管腳功能是用晶元上的ADC對晶元外部的模擬信號進行採樣,因此還需要初始化完ADC外設後,調用ADC外設採樣的介面進行信號讀取。


四、使用技巧

        在日常程式開發調試的過程中,可以簡單有效的利用GPIO驅動輸出高低電平來進行輔助的測試及驗證工作。下麵介紹幾個較為常用的使用場景,如果有其它可以利用GPIO的方法和技巧,也請大家積極留言,我們一起探討。

        (1)、在boot程式階段使用IO翻轉輸出信號的頻率可以和APP程式階段使用IO翻轉輸出信號的頻率相異,通過使用示波器測量波形,用於區分程式是運行在boot程式階段還是APP程式階段,即不同程式階段。

        (2)、在使用定時器中斷的時候,為了確保定時器時基設置的正確性,測試是可以定時器中斷中增加IO口信號翻轉邏輯,通過使用示波器測量翻轉的頻率來測試驗證定時器中斷的周期。

1 void TIM1_IRQHandler(void) //定時器 1 中斷服務函數
2 {
3     if(TIM_GetITStatus(TIM1,TIM_IT_Update)==SET) //溢出中斷
4     {
5         GPIO_ToggleBits(); //IO口信號翻轉操作邏輯,用於驗證定時器中斷頻率
6     }
7     TIM_ClearITPendingBit(TIM1,TIM_IT_Update); //清除中斷標誌位
8 }

        (3)、在不同的程式段中使用多個IO,輸出高電平,通過示波器測量IO口之間輸出高電平的間隔,可以確定兩個程式段之間運行的準確時間。

 

        (4)、在板卡上沒有LED進行閃爍指示的情況或沒有使用外部看門狗晶元的情況下,為了確認程式是否仍然在正常運行,需要留出一個IO口,用於翻轉高低電平輸出,後續就可以用示波器測量該信號的有無來判斷程式是否死機。

        (5)、在沒有調試列印程式信息的串口時,查找死機問題的時候,放置不同的IO輸出高電平的在不同的程式段,這樣類似的進行插樁驅動測試,通過示波器測量信號,可以大體的定位在程式運行的哪一塊發生了死機的問題。

        (6)、在測試驗證階段,可以將某個IO引腳配置成輸入模式,利用外部給的激勵信號,在程式中判斷讀到的信號電平的高低狀態,去作為邏輯判斷條件進行一些代碼段的驗證測試。


五、總結

        本篇主要主要是對STM32的GPIO在日常基本應用開發中的具體的操作配置和使用方法進行了說明,包括API功能函數的定義,驅動初始化的配置流程以及一些利用GPIO操作的相關技巧,後續將對GPIO使用成外部中斷時進行詳細的介紹。


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

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


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

-Advertisement-
Play Games
更多相關文章
  • 0. ray 簡介 ray是開源分散式計算框架,為並行處理提供計算層,用於擴展AI與Python應用程式,是ML工作負載統一工具包 Ray AI Runtime ML應用程式庫集 Ray Core 通用分散式計算庫 Task -- Ray允許任意Python函數在單獨的Python worker上運 ...
  • ###淺拷貝的問題 預設提供的拷貝構造就是淺拷貝,如果拷貝的對象中含有成員指針變數指向堆區中的記憶體空間,那麼就會出現兩個對象中的成員指針變數指向同一塊堆區空間,當方法執行結束後,對象就會被釋放,調用析構函數(析構函數中存在釋放在堆區開闢的記憶體空間),就會存在一塊記憶體空間被多次釋放的問題。 ###解決 ...
  • 一、背景 Hi,大家!我是 @馬哥python說 ,一名10年程式猿。 今天我來演示一下:通過百度AI開放平臺,利用python調用百度介面進行中文情感傾向分析,並得出情感極性分為積極、消極還是中性以及置信度結果。 二、操作步驟 首先,打開百度AI首頁:百度AI開放平臺-全球領先的人工智慧服務平臺 ...
  • MySQL 備忘清單 MySQL是一種關係型資料庫管理系統,關係資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。 MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社區版和商業版,由於其體積小、速 ...
  • Netcat 備忘清單 Netcat 是一款簡單的 Unix 工具,使用 UDP 和 TCP 協議。 它是一個可靠的容易被其他程式所啟用的後臺操作工具,同時它也被用作網路的測試工具或黑客工具。 使用它你可以輕易的建立任何連接。內建有很多實用的工具。 Netcat備忘單提供了在 Linux 和 Uni ...
  • 在一些字典綁定中,往往為了方便展示詳細數據,需要把一些結構樹展現在樹列表TreeList控制項中或者下拉列表的樹形控制項TreeListLookUpEdit控制項中,為了快速的處理數據的綁定操作,比較每次使用涉及太多細節的操作,我們可以把相關的數據綁定操作,放在一些輔助類的擴展函數中進行處理,這樣可以更方... ...
  • C#泛型中new和where是重要的關鍵字,它們都可以用於約束泛型類型參數的限制;它們都用於提高代碼的安全性和可用性,它們的作用在很大程度上提高了代碼的可讀性和可維護性。在這篇文章中,我們將一起瞭解泛型中的new和where,以及它們之間的區別。 1. new關鍵字 在C#泛型中,new關鍵字被用於 ...
  • 本文演示Sitecore XP Single(XP0)在Azure上的一鍵部署,即“30分鐘生成Sitecore演示環境”的一環。 關於XP(即Sitecore Experience Platform) roles的相關介紹移步 XP Single配置主要用來開發和測試: Four Sitecore ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...