stm32怎樣存痊大靜態陣列,stm32怎樣訪問超大靜態陣列

時間 2021-12-25 07:09:04

1樓:匿名使用者

你是否是遇到這樣問題:

比如定義乙個陣列unsigned char arry[num];因為想要這個陣列非常大,也就是說這個num非常大,超過了堆疊的大小,程式就會報錯而編譯不通過,然後你想換種方法解決是嗎?

如果是的話有兩種方法可解決:

1、擴大堆疊容量,如果是keil編寫**的話,那麼更改堆疊大小在相應的啟動檔案***.s中修改;如果是iar編寫**的話,那麼更改堆疊大小在相應的***.cif檔案中修改。

更具體的過程你就自行度娘了。

2、對絕對位址空間的訪問,並且要滿足乙個前提:訪問的對決位址空間必須要在堆疊的範圍之外,否則的話會破壞堆疊內容而導致程式跑飛(個人推薦使用該方法)。以stm32f103zet6為例,該型號的sram空間為0x20000000--0x2000ffff,共64kb,我想定義乙個陣列unsigned char arry[4096],並且想讓該陣列放在起始位址為0x2000e000的sram空間(盡量放在sram空間後面,避免堆疊只用到這些空間),那麼可以這麼做:

unsigned char *arry; //定義乙個指標變數

arry = (unsigned char *)0x2000e000; //令指標指向位址0x2000e000處

那麼接下來你就可以隨便這麼用了:

arry[0] = 0;

arry[100] = 1;

arry[1000] = 100; //等等

甚至你可以這麼用:arry[5000] = 10; //只要範圍不超處sram空間都是可以的。

再說一次:前提是這部分空間不再堆疊的範圍之內,否則程式跑飛後果自負。

2樓:

char *p;

p= (char *)常量位址;

c語言中只有同型別變數才能賦值,常量型別賦值給指標必須做強制型別轉換。假設靜態陣列位於0x3000 0000,那麼取資料時可以寫成

char *p;

p= (char *)0x3000 0000; // 指向0x3000 0000

x=*p; // 取資料

stm32中,stm32中GPIOx BSRR和 GPIO xBRR寄存允許對任何GPIOx進行讀 更改的獨立訪問

比如我要讓gpioa變為高電平,可以有兩種做法 1 gpioa odr gpio pin 0 2 gpioa bsrr gpio pin 0 比如我要讓gpioa變為低電平,可以有兩種做法 1 gpioa odr gpio pin 0 2 gpioa brr gpio pin 0 總結和糾正一下前面...

stm32如何啟動串列埠中斷,stm32 關於串列埠中斷服務函式

看一下暫存器手冊,配置一下相關暫存器就ok。然後在初始化時或合適的地方啟動串列埠中斷就是了。1.首先配置串列埠1管腳 配置串列埠1引腳 gpio initstructure.gpio pin gpio pin 9 gpio initstructure.gpio speed gpio speed 50...

stm32微控制器的定時問題,STM32微控制器的定時問題。

是這樣的,看到你這個問題,我腦海裡第乙個反映是,你的初值和計數方式配合反了.因為很多從51過來的人都犯這個錯誤,他們認為,stm32向上計數是從初值 65535 向下是 初值 0,也就是說,他們把初值作為出發點.其實是錯的,初值是目標點,向上是 0 初值,向下是 65535 初值.那麼看一下,如果你...

stm32的晶振為什麼不起振,STM32板的晶振不起振,怎麼辦

是不是你自己做的stm32板子呢?如果是的話建議你檢查電路,一般一次未燒寫程式的stm32晶振是不起振的,如果已經燒寫了程式不起振的話檢查你程式是否已經執行了。檢測boot0與boot1引腳電壓 這個晶元的通病,廠家答覆是使用問題,晶振不合適。問題是其他廠商的單片怎麼就沒這問題呢?st以前生產的其它...

為毛現在stm8和stm32這麼好用,而8051已經被淘汰了,還是要學

現在再試試stm的微控制器,用不起了。是像孫悟空翻跟頭,幾倍幾倍的往 剛開始深入學習單片的時候,屬於機緣巧合吧,當時我是電子資訊工程的一枚學生。當然課本上的那些單片基礎,稍微有點,至於實際的電路設計等勉強看懂的狀態,幾乎依靠高中物理功底和課堂上涉及的。大家開始都建議從51開始,當然初期我是從51開始...