❶ ARM STM32 嵌入式 匯編指令LDMIA用法
LDM是多寄存器存取的意思,IA表示數據傳輸後地址增加(increase
after);(IB:increase
before,
DA:
decrease
after,
DB:
decrease
before)
後面參數以「,」分隔,第一個參數是首地址;第二個參數是寄存器列表,並以「{}」括起來。
具體的例子:
LDMIA
R0!,
{R1-R4}
R0表示要操作的存儲空間首地址,要操作的數據個數由寄存器列表決定,現在是R1到R4,共4個數據(每個數據是32bits的)
具體:地址為R0的存儲空間中的數據賦值給R1
地址為R0+4的存儲空間中的數據賦值給R2
地址為R0+8的存儲空間中的數據賦值給R3
地址為R0+12的存儲空間中的數據賦值給R4
所有的示例指令執行前的存儲空間和寄存器情況:
mem32[0x1000C]
=
0x04
mem32[0x10008]
=
0x03
mem32[0x10004]
=
0x02
mem32[0x10000]
=
0x01
r0
=
0x00010000
r1
=
0x00000000
r3
=
0x00000000
r4
=
0x00000000
執行後存儲空間不變,寄存器變化:
r0
=
0x00010010
r1
=
0x01
r2
=
0x02
r3
=
0x03
r4
=
0x04
❷ stm32編譯問題
在頭文件usart.h裡面是沒有定義它的,在不完全手冊里提到過,上面是這樣寫的
「這里需要注意一點,因為我們使用到了串口的中斷接收,必須在 usart.h 裡面義EN_USART1_RX 。該函數才會配置中斷使能,以及開啟串口 1 的 NVIC 中斷。這里我們把串口 1 中斷放在組 2,優先順序設置為組 2 裡面的最低。」
在原頭文件usart.h中是這樣寫的"//#define EN_USART1_RX //使能串口1接收"他以備註解釋的形式出現的,要把前面的「//」給去掉,「symbol usart_RX BUF」就唄定義了
❸ stm32編譯問題
項目中同時包含以下啟動文件,
startup_stm32f10x_hd.s startup_stm32f10x_md.s startup_stm32f10x_ld.s
應該針對不同的CPU選擇不同的啟動文件,從項目中刪除不相關的啟動文件就可以了;分別對應小容量,中容量,大容量;具體看手冊.
❹ STM32編譯出錯
error: #137: expression must be a modifiable lvalue
描述:表達式必須是一個可以修改的左值
主要出現在這種現象
:a=NUM;
NUM是一個數值或表達式
,a為一個變數
但a被定義為像const這種不可更改的類型導致NUM不能賦值給變數
解決方法要麼放棄賦值要麼修改變數屬性
❺ 用keil5 STM32F107系列晶元編譯一個指令時提示錯誤為 A1105E: Area directive missing 怎麼解決
STM32調試過程中常見的問題及解決方法 一、 在「Debug選項卡」下設置好模擬器的類型後,下載程序時卻提示「No ULINK Device found.」
解決辦法: Keil MDK默認使用ULINK模擬器下載程序,在「Project --->Option for Target 'xxx' --->Utilities選項卡」下把編程所使用的模擬器改為相應的類型即可。
二、 編譯工程時提示如下信息:
main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __GetBASEPRI (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __RESETFAULTMASK (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __RESETPRIMASK (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __SETFAULTMASK (referred from stm32f10x_nvic.o).
main.axf: Error: L6218E: Undefined symbol __SETPRIMASK (referred from stm32f10x_nvic.o).
解決辦法:工程缺少「cortexm3_macro.s」文件,把cortexm3_macro.s和STM3210x.s全部添加到工程即可。
三、調試器不能連接到STM32的問題與解決辦法
很多人都碰到過調試器不能連接到STM32的問題,不管是IAR的J-Link還是Keil的ULink,或者是ST的ST-Link。出現這個問題時,調試軟體會提示不能建立與Cortex-M3的連接,或提示不能下載程序,或提示找不到要調試的設備等。
這樣的問題都是發生在調試那些可以在CPU不幹預的時候自動運行的模塊、或在調試低功耗模式的程序的時候。所謂「可以在CPU不幹預的時候自動運行的模塊」包括:DMA、定時器、連續轉換模式下的ADC、看門狗等模塊。
--------------------------------------------------------------------------------
這個問題的根源是:
1. 調試器需要在RAM內執行一段程序,對Flash進行擦寫操作,如果不停止這些自動運行的模塊,它們會干擾程序在RAM中的執行,致使下載失敗。比如DMA模塊被配置為不停地拷貝一段數據區,而調試器剛好需要使用DMA數據傳輸的目標區域,這時DMA的操作將會與調試器的操作發生沖突。再比如,如果啟動了看門狗而沒有執行硬體復位,則在下次調試器需要下載程序時,看門狗超時將觸發晶元復位,導致下載操作失敗。
2. 低功耗是通過停止CPU的時鍾而實現,JTAG調試是通過與CPU的通信實現,停止了CPU的時鍾致使調試器會失去與CPU的通信。
❻ 關於stm32 TFTLCD 的一些命令解析
全部都是宏,你要看宏代碼才能知道具體實現,最好看一下。。。這就是一個設置寫寄存器的指令。。。就是確定將要寫哪個就寄存器(該寄存器地址就是data)。。。 前兩個是清楚使能標志的,標志位1通常不能操作。。。DATAOUT是寫數據,LCD_WR_CLR,是寫標志清零,然後在寫寄存器標志和使能標志至1,就寫出去了。。。
通常寫外部設備寄存器,很多是先寫寄存器地址,確定操作哪個寄存器,後讀寫數據。。。比如flash,LCD,USB晶元等大多數地址數據匯流排公用的設備都是這樣。。。