STM32寄存器操作、模板構建

来源:https://www.cnblogs.com/zqingyang/p/18308826
-Advertisement-
Play Games

本文介紹了:外設寄存器查找 ① 名稱 ② 偏移地址 ③ 寄存器位表 ④ 位功能說明 寄存器基本操作 C語言的置位和清零 具體方法 設置GPIO流程 給寄存器賦值 帶參數巨集 STM32F1xx 晶元識別 存儲器映射 寄存器映射 讓GPIOB埠的16個引腳輸出高電平,要怎麼實現? STM32寄存器映射... ...


2024年7月18日 發佈於博客園, 本文涉及到STM32F4XX和STM32F1XX系列

目錄

外設寄存器查找

見<<野火STM32庫開髮指南P64>>

在XX 外設的地址範圍內,分佈著的就是該外設的寄存器。以GPIO 外設為例,GPIO 是通用輸入輸出埠的簡稱,簡單來說就是STM32 可控制的引腳,基本功能是控制引腳輸出高電平或者低電平。最簡單的應用就是把GPIO 的引腳連接到LED 燈的陰極,LED 燈的陽極接電源,然後通過STM32 控制該引腳的電平,從而實現控制LED 燈的亮滅。

GPIO 有很多個寄存器,每一個都有特定的功能。每個寄存器為32bit,占四個位元組,在該外設的基地址上按照順序排列,寄存器的位置都以相對該外設基地址的偏移地址來描述。

image

image

① 名稱

寄存器說明中首先列出了該寄存器中的名稱“(GPIOx_BSRR)(x=A⋯I)”這段的意思是該寄存器名為“GPIOx_BSRR”其中的“x”可以為A-I,也就是說這個寄存器說明適用於GPIOA、GPIOB 至GPIOI,這些GPIO 埠都有這樣的一個寄存器。

② 偏移地址

偏移地址是指本寄存器相對於這個外設的基地址的偏移。本寄存器的偏移地址是0x18,從參考手冊中我們可以查到GPIOA 外設的基地址為0x4002 0000 ,我們就可以算出GPIOA 的這個GPIOA_BSRR 寄存器的地址為:0x4002 0000+0x18;同理,由於GPIOB 的外設基地址
為0x4002 0400,可算出GPIOB_BSRR 寄存器的地址為:0x4002 0400+0x18 。其他GPIO 埠以此類推即可。

③ 寄存器位表

image

緊接著的是本寄存器的位表,表中列出它的0-31 位的名稱及許可權。表上方的數字為位編號,中間為位名稱,最下方為讀寫許可權,其中w 表示只寫,r 表示只讀,rw 表示可讀寫。本寄存器中的位許可權都是w,所以只能寫,如果讀本寄存器,是無法保證讀取到它真正內容的。而有的寄存器位只讀,一般是用於表示STM32 外設的某種工作狀態的,由STM32 硬體自動更改,程式通過讀取那些寄存器位來判斷外設的工作狀態。

④ 位功能說明

位功能是寄存器說明中最重要的部分,它詳細介紹了寄存器每一個位的功能。例如本寄存器中有兩種寄存器位,分別為BRy 及BSy,其中的y 數值可以是0-15,這裡的0-15 表示埠的引腳號,如BR0、BS0 用於控制GPIOx 的第0 個引腳,若x 表示GPIOA,那就是控制GPIOA 的第0 引腳,而BR1、BS1 就是控制GPIOA 第1 個引腳。

其中BRy 引腳的說明是“0:不會對相應的ODRx 位執行任何操作;1:對相應ODRx 位進行複位”。

這裡的“複位”是將該位設置為0 的意思,而“置位”表示將該位設置為1;說明中的ODRx 是另一個寄存器的寄存器位,我們只需要知道ODRx 位為1 的時候,對應的引腳x 輸出高電平,為0 的時候對應的引腳輸出低電平即可(感興趣的讀者可以查詢該寄存器GPIOx_ODR 的說明瞭解)。所以,如果對BR0 寫入“1”的話,那麼GPIOx 的第0 個引腳就會輸出“低電平”,但是對BR0 寫入“0”的話,卻不會影響ODR0 位,所以引腳電平不會改變。要想該引腳輸出“高電平”,就需要對“BS0”位寫入“1”,寄存器位BSy 與BRy 是相反的操作。

image

具體查對應的手冊和系統庫函數的封裝, 註意, 要看數據手冊, 查找對應的資源才能知道具體的位置. 重點是掌握方法.

寄存器基本操作

C語言的置位和清零

若直接賦值0或1, 會將所有位都變為0或1

例如:*(unsigned int*)(0x40010C0C)=1;*(unsigned int*)(0x40010C0C)=0;

任何數&1,值不變 任何數&0,均為0

故而只對目標位操作

//清零  &=~

//置位  |=

具體方法

/*對某寄存器某些位清零*/
	// 配置IO口為輸出
	GPIOB_CRL &=  ~( (0x0f) << (4*0) );//對寄存器清零. 0x0f是0000 1111, 因為要取反, 要把哪一位清零就用1去清零

/*對某寄存器某1位置位*/
	//寫入值
	GPIOB_CRL |=  ( (1) << (4*0) );

/*對某寄存器某1位置零*/
	// 控制 ODR 寄存器
	GPIOB_ODR &= ~(1<<0);

/* 置位操作 */
	a|=(1<<?);
/* 清零操作 */
	a&=~(1<<?);

設置GPIO流程

打開GPIOB埠的時鐘-->配置埠配置低寄存器的埠模式和速率-->控制ODR寄存器的高低電平

//打開GPIOB埠的時鐘(看2.3和第六章6.3.7)
	//RCC外設地址0x4002 1000位於AHB匯流排, 該外設下的APB2寄存器,APB2外設時鐘使能寄存器偏移地址為0x18
	//讓該寄存器的對應IOPB埠時鐘開啟, 位於該寄存器的第3位, 即左移3位
*(unsigned int *)0x40021018 |= ((1)<<3);

//配置IO口位輸出
	//配置8.2.1埠配置低寄存器的埠模式和速率
	//因為4個為1組,所以控制PB0則為第0組,需要左移0組
*(unsigned int *)0x40010C00 |= ((1)<<(4*0));

//控制ODR寄存器的高低電平,此處為置零
*(unsigned int *)0x40010C0C &= ~((1)<<0);

給寄存器賦值

方法1:巨集定義直接賦值

/*通過絕對地址訪問記憶體單元*/
//GPIOB的埠全部輸出為高電平
*(unsigned int*)(0x40010C0C)=0xFFFF;
/*
(0x40010C0C)是GPIOB輸出數據寄存器ODR的地址, 是一個立即數
(unsigned int*)(0x40010C0C) 將立即數強制類型轉換為指針, 指向地址
*(unsigned int*)(0x40010C0C) 對該地址所指向的區域進行操作
*(unsigned int*)(0x40010C0C)=0xFFFF; 從該地址開始往後數32位,均為1(十六進位0xffff)
*/

/*通過巨集定義,寄存器別名的方式訪問記憶體單元*/
// GPIOB 埠全部輸出 高電平
#define GPIOB_ODR (unsignedint*)(0x40010C0C)//給該地址定義個巨集
* GPIOB_ODR = 0xFF;//對巨集進行操作


/*為了方便操作,我們乾脆把指針操作“*”也定義到寄存器別名裡面*/
// GPIOB 埠全部輸出 高電平
#define GPIOB_ODR   *(unsignedint*)(0x40010C0C)
GPIOB_ODR = 0xFF;

方法2: 採用移位的方式

* (unsigned int * )0x40010c0c &=~(1<<0);

#define PERIPH_BASE      ((unsigned int)0x40000000)
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE       (APB2PERIPH_BASE + 0x0C00)
#define GPIOB_ODR        *(unsignedint*)(GPIOB_BASE+0x0C)//ODR的絕對地址

// PB0輸出輸出低電平(清零) 將目標位清零 &= ~(1<<目標位)
GPIOB_ODR &= ~(1<<0);
/*
等效於 GPIOB_ODR = GPIOB_ODR & ~(1<<0);
根據優先順序, 先計算括弧內(1<<0)  
	0001<<0--->0001
取反~
	~0001--->1110
計算按位與
	 GPIOB_ODR & 1110 若原來值為1000
	 則 1000 & 1110 
	 得 1000
*/

// PB0輸出輸出高電平 將目標位拉高 |= ~(1<<目標位)
GPIOB_ODR |= (1<<0);

按位邏輯運算符: A &= B 等效於 A = A&B

移位運算符:

左移 1<<2

  • 把十進位數1轉換為二進位 0000 0001
  • 整體左移2位 0000 0100 , 左側移除的丟失, 空位補0

右移需要區分符號位, 結果看機器 (1000 1010)>>2

  • //轉換為二進位
  • 無符號位 整體右移2位 0010 0010 , 右側移除的丟失, 空位補0
  • 有符號位 整體右移2位 0010 0010或1110 0010 , 右側移除的丟失, 空位補符號位

或不用巨集定義

* (unsigned int *)0x40010C0C &=~(1<<0);//將第一位置零

帶參數巨集

#define    ON        1 //代參數巨集
#define    OFF       0

// \  C語言裡面叫續行符,後面不能有任何的東西
	//帶參巨集的主體
#define   LED_G(a)   if(a) \
	                       GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); \
                     else  GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);

void LED_GPIO_Config(void);

STM32F1xx

寄存器 需要反覆看書籍第六章

晶元識別

1、如何看晶元絲印

2、懂得如何辨別正方向

image

若有2個點,則看小的點,逆時針。

若沒有點,那麼正看絲印,左上方為第一腳,逆時針數。

image

STM32晶元架構簡圖

image

flash存儲程式,SRAM存儲變數

IP廠商(內核廠商):ARM

SOC廠商(晶元廠商):ST


STM32F10xx系統框圖

image

在參考手冊的存儲架構章節中。

驅動單元(CPU,內核):ARM公司設計

被動單元:外設:ST公司設計

ICode 中的I 表示Instruction,即指令。我們寫好的程式編譯之後都是一條條指令,存放在FLASH中,內核要讀取這些指令來執行程式就必須通過ICode 匯流排,它幾乎每時每刻都需要被使用,它是專門用來取指的。


DCode 匯流排:DCode 中的D 表示Data,即數據,那說明這條匯流排是用來取數的。我們在寫程式的時候,數據有常量和變數兩種,常量就是固定不變的,用C 語言中的const 關鍵字修飾,是放到內部的FLASH當中的,變數是可變的,不管是全局變數還是局部變數都放在內部的SRAM。因為數據可以被Dcode 匯流排和DMA 匯流排訪問,所以為了避免訪問衝突,在取數的時候需要經過一個匯流排矩陣來仲裁,決定哪個匯流排在取數。

系統匯流排system 系統匯流排主要是訪問外設的寄存器,我們通常說的寄存器編程,即讀寫寄存器都是通過這根系統匯流排來完成的。

DMA 匯流排:DMA 匯流排也主要是用來傳輸數據,這個數據可以是在某個外設的數據寄存器,可以在SRAM,可以在內部的FLASH。因為數據可以被Dcode 匯流排和DMA 匯流排訪問,所以為了避免訪問衝突,在取數的時候需要經過一個匯流排矩陣來仲裁,決定哪個匯流排在取數

image

APB1低速匯流排,APB2高速匯流排

存儲器映射

存儲器本身不具有地址信息,它的地址是由晶元廠商或用戶分配,給存儲器分配地址的過程就稱為存儲器映射,具體見圖存儲器映射。如果給存儲器再分配一個地址就叫存儲器重映射

2的32次方是4G。

圖在Datasheet search site的Memory mapping章節

image

重點學習Block2

image

image

image

image

寄存器映射

image

看STM32參考手冊中文版第八章

image

地址偏移是相對於埠基地址偏移,見第二章存儲器組織。

讓GPIOB埠的16個引腳輸出高電平,要怎麼實現?

/*通過絕對地址訪問記憶體單元*/
//GPIOB的埠全部輸出為高電平
*(unsigned int*)(0x40010C0C)=0xFFFF;
/*
(0x40010C0C)是GPIOB輸出數據寄存器ODR的地址, 是一個立即數
(unsigned int*)(0x40010C0C) 將立即數強制類型轉換為指針, 指向地址
*(unsigned int*)(0x40010C0C) 對該地址所指向的區域進行操作
*(unsigned int*)(0x40010C0C)=0xFFFF; 從該地址開始往後數32位,均為1(十六進位0xffff)
*/

/*通過巨集定義,寄存器別名的方式訪問記憶體單元*/
// GPIOB 埠全部輸出 高電平
#define GPIOB_ODR (unsignedint*)(0x40010C0C)//給該地址定義個巨集
* GPIOB_ODR = 0xFF;//對巨集進行操作


/*為了方便操作,我們乾脆把指針操作“*”也定義到寄存器別名裡面*/
// GPIOB 埠全部輸出 高電平
#define GPIOB_ODR   *(unsignedint*)(0x40010C0C)
GPIOB_ODR = 0xFF;

什麼是寄存器?

給有特定功能的記憶體單元取一個別名,這個別名就是我們經常說的寄存器,這個給已經分配好地址的有特定功能的記憶體單元取別名的過程就叫寄存器映射。

什麼叫存儲器映射?

給存儲器分配地址的過程叫存儲器映射,再分配一個地址叫重映射。

STM32寄存器映射

image

image

image

如何計算?以GPIOB為例

GPIOB的外設基地址為:0x4001 0C00

因為埠輸入數據寄存器(GPIOx_IDR) 地址偏移為:0x08

所以(GPIOx_IDR) 的絕對地址為 0x4001 0C08

所以我們只需要+4就能得到下一個寄存器的地址, 一個位元組有8位, 4個位元組即32位

CRL 埠配置低寄存器

CRH 埠配置高寄存器

IDR 輸入數據寄存器

ODR 數據輸出寄存器

BSRR和BRR是配置某埠的某一個位的

LCKR 鎖定寄存器

重點看第85頁

C語言對寄存器的封裝

在編程上為了方便理解和記憶,我們把匯流排基地址和外設基地址都以相應的巨集定義起來,匯流排或
者外設都以他們的名字作為巨集名

代碼清單: 寄存器-4 匯流排和外設基址巨集定義

/* 外設基地址*/
#define PERIPH_BASE ((unsigned int)0x40000000)

/* 匯流排基地址*/
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000)


/* GPIO 外設基地址*/
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)


/* 寄存器基地址,以GPIOB 為例*/
#define GPIOB_CRL (GPIOB_BASE+0x00)
#define GPIOB_CRH (GPIOB_BASE+0x04)
#define GPIOB_IDR (GPIOB_BASE+0x08)
#define GPIOB_ODR (GPIOB_BASE+0x0C)
#define GPIOB_BSRR (GPIOB_BASE+0x10)
#define GPIOB_BRR (GPIOB_BASE+0x14)
#define GPIOB_LCKR (GPIOB_BASE+0x18)

首先定義了“片上外設”基地址PERIPH_BASE,接著在PERIPH_BASE 上加入各個匯流排的地址偏移,得到APB1、APB2 匯流排的地址APB1PERIPH_BASE、APB2PERIPH_BASE,在其之上加入外設地址的偏移,得到GPIOA-G 的外設地址,最後在外設地址上加入各寄存器的地址偏移,得到特定寄存器的地址。一旦有了具體地址,就可以用指針讀寫

重點看64頁

讓PB0輸出低/高電平,要怎麼實現?

#define PERIPH_BASE      ((unsigned int)0x40000000)
#define APB2PERIPH_BASE  (PERIPH_BASE + 0x00010000)
#define GPIOB_BASE       (APB2PERIPH_BASE + 0x0C00)
#define GPIOB_ODR        *(unsignedint*)(GPIOB_BASE+0x0C)//ODR的絕對地址

// PB0輸出輸出低電平(清零)
GPIOB_ODR &= ~(1<<0);//(1<<0)將1左移0位 0000 0000變成0000 0001,別的為0
/*
先計算左邊 0000 0001 取反後 1111 1110
再與原來的值0000 1000 按位與
結果 0000 0000
*/

// PB0輸出輸出高電平
GPIOB_ODR |= (1<<0);
/*
|=是相加的意思
原來0000 1000
相加0000 0001 先計算出1<<0的結果,再位相加
結果0000 1001 
*/

使用結構體封裝寄存器列表?

image

image

-> 和結構體的. 的作用是類似的, 都是對結構體成員的訪問, 可以見C結構體

image

這部分工作都由固件庫幫我們完成了

新建寄存器(REG)模板

創建工程

image

工程命名--不要中文

image

選擇對應晶元型號

image

跳過軟體包

image

導入啟動文件,文件路徑,在固件庫中:

C:\MYDATA~1\網課資料\野火指~1\A盤(~1\1-程式~1\1-_野~1\1-書籍~1\0【固~1.0\STM32F~1.0\【固件~1.0\LIBRAR~1\CMSIS\CM3\DEVICE~1\ST\STM32F~1\startup\arm\

根據Flash大小選擇對應啟動文件:

image

image

拷貝啟動文件到工程項目文件夾中

image

雙擊導入文件

image

記事本新建一個main.c文件並導入

image

設置代碼大小

image

image

#include "stm32f10x.h"//<>是表示頭文件在軟體安裝根目錄下, ""表示先在工程目錄下尋找,再去軟體安裝根目錄尋找

int main (void)
{


}


void SystemInit(void)
{
	//編譯時, 會先在啟動文件的彙編中初始化時鐘, 採用的插入方式. 函數體為空,目的是為了騙過編譯器不報錯
}

修改名稱

間斷雙擊target,重命名

image

修改生成的目標工程文件名稱,存放在項目的objects文件夾中。

image

hex是通過串口下載的可執行文件,

axf是通過編譯器下載的可執行文件

image

**燒錄設置 ** 連接模擬器和單片機 上電

image

image

image

image

然後編譯後,選擇download下載

這個是可以上相容的,即在同一內核版本下,F103,引腳少的工程項目在引腳多的晶元上可以直接燒錄,無需修改。因為引腳少的晶元的所有引腳在引腳多的晶元上都有。

移植工程,需要修改晶元型號,然後重新配置模擬器:

image

image

關閉C語言語法的動態檢查:

image

本文來自博客園,作者:舟清颺,轉載請註明原文鏈接:https://www.cnblogs.com/zqingyang/p/18308826


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

-Advertisement-
Play Games
更多相關文章
  • 痞子衡嵌入式半月刊: 第 105 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回 ...
  • 一、 Linux發行版本和虛擬機介紹 Linux系統的版本分為兩種,分別是: 內核版 和 發行版。 1) .內核版 由Linus Torvalds及其團隊開發、維護 免費、開源 負責控制硬體 2).發行版 基於Linux內核版進行擴展 由各個Linux廠商開發、維護 有收費版本和免費版本 我們使用L ...
  • 寫在前面 本隨筆是非常菜的菜雞寫的。如有問題請及時提出。 可以聯繫:[email protected] GitHhub:https://github.com/WindDevil (目前啥也沒有 設計方法 瞭解了特權級機制,實際上如果要設計一個應用程式就需要保證它符合U模式的要求,不要去訪問S模式下的 ...
  • 1.字元集 在電腦科學中,信息的存儲和處理都是基於二進位數的,這是因為二進位數在電腦硬體層面上實現起來最為簡單和高效。二進位數由兩個基本元素組成:0和1,這兩個元素可以通過電子器件(如晶體管)的開關狀態來輕鬆表示。而我們在屏幕上看到的數字、英文、標點符號、漢字等字元是二進位數轉換之後的結果。按照 ...
  • ArchLinux Vmware安裝指北 在本文開始之前,首先允許我提前聲明一點,Arch Linux的安裝並不算難,但是絕對也算不上簡單,中間的安裝可能會遇到很多問題,本篇文章不能保證完全貼合你的真實機器環境,但是我會在我安裝過程中遇到的一點點小問題都說出來,給大家避個坑,這裡我安裝Arch的時候 ...
  • bitwarden本地搭建(無需購買SSL證書) 在安裝之前,筆者在這裡先聲明一下,我安裝bitwarden使用的操作環境為ArchLinux,我的想法是,因為這隻是一個“密碼本”,並且最好能保證其能夠在開機後占用儘量少的記憶體讓密碼本保持穩定運行。在此前提下,我選擇了乾凈整潔的ArchLinux,關 ...
  • 介紹DSLogic_邏輯分析儀參數 基本參數 主要特征 外部介面 供電要求 輸入輸出埠 技術規格 輸入電壓和閾值 輸入阻抗 最大採樣率 最大採樣深度 解析度 雜訊/干擾 安裝 基本概念 運行模式: 使用 硬體連接 簡單直接波形採集 觸發採集 重覆採集 協議解碼 邏輯分析儀和示波器的區別 ...
  • GICV3中斷控制器初始化調用鏈 /kernel/irq/handle.c: #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER int __init set_handle_irq(void (*handle_irq)(struct pt_regs *)) { if (h ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...