關(guān)于學(xué)習(xí)STM3210X中遇到的若干問題
學(xué)習(xí)STM32一段時(shí)間,調(diào)試程序是總是有各種問題,特在此開博,以記錄遇到的各種問題及解決辦法。
1、現(xiàn)象:程序編譯成功,仿真時(shí)不能全速運(yùn)行,command 窗口顯示:
Load "E:\ARM\Program\Sample2\Putout\Sample.AXF"
LA (PORTC & 0x80) >> 7
*** error 65: access violation at 0x1FFFF7E8 : no 'read' permission
*** error 65: access violation at 0x1FFFF7EC : no 'read' permission
*** error 65: access violation at 0x1FFFF7F0 : no 'read' permission
問題:指定的內(nèi)存空間不能讀寫
解決辦法:對(duì)內(nèi)存讀寫的程序只能在板子上運(yùn)行,不能再仿真時(shí)運(yùn)行,不然就會(huì)出現(xiàn)上面的錯(cuò)誤。
2、現(xiàn)象:編寫了兩個(gè)中斷:Systick_Handler()產(chǎn)生毫秒中斷,EXTI0_Handler()產(chǎn)生外部中斷,其中外部中斷中有用到延時(shí)函數(shù)。
問題:進(jìn)入外部中斷函數(shù)后,不能進(jìn)入中斷延時(shí)函數(shù)
解決辦法:Systick中斷的優(yōu)先級(jí)最低,所以在進(jìn)入一個(gè)比它高的外部中斷后不能嵌套進(jìn)入Systick中斷,即延時(shí)函數(shù)無法完成延時(shí),要想延時(shí)只能用自己編寫的延時(shí)函數(shù)。
注:在中斷中不推薦使用延時(shí)函數(shù),因?yàn)橹袛嗟脑瓌t就是快進(jìn)快出。
3、現(xiàn)象:編譯時(shí)出現(xiàn)錯(cuò)誤:.PutoutAWM.axf: Error: L6200E: SymbolDelay_Timemultiply defined (by stm32f10x_it.o and main.o).
問題: AWM出局。axf:錯(cuò)誤:L6200E:象征Delay_Time多重定義(通過stm32f10x_it。o和main.o)。
解決辦法:上述錯(cuò)誤原因是把變量 Delay_Time 定義到了頭文件中,而頭文件又被多次調(diào)用導(dǎo)致重復(fù)調(diào)用的結(jié)果,只要把變量放到.c文件中即可。
4、現(xiàn)象:編譯時(shí)出現(xiàn)錯(cuò)誤:Usermain.c(193): error:#268: declaration may not appear after executable statement in block
問題:用戶 c(193):錯(cuò)誤:# 268:聲明不能出現(xiàn)在可執(zhí)行語句塊后面
解決辦法:將聲明語句放置一個(gè)函數(shù)的開頭。例如:NVIC_InitTypeDefNVIC_InitStructure;
5、現(xiàn)象:編譯時(shí)出現(xiàn)錯(cuò)誤:Usermain.c(458): warning: #223-D: function "Time_Ini" declared implicitly
問題:提示函數(shù) Time_Ini() 聲明為隱性函數(shù)
解決辦法:最后發(fā)現(xiàn)聲明的函數(shù)為 Tim_Ini() ,而引用時(shí)錯(cuò)誤的寫成了 Time_Ini()。
6、現(xiàn)象:編譯通過,運(yùn)行時(shí)進(jìn)入不了中斷
問題:中斷函數(shù)名是這樣定義:EXTI1_Handler();
解決方法:最后在啟動(dòng)文件中發(fā)現(xiàn)中斷函數(shù)定義錯(cuò)誤,應(yīng)該是EXTI1_IRQHandler();其中,系統(tǒng)定時(shí)中斷函數(shù)名應(yīng)該為:SysTick_Handler()。
7、現(xiàn)象:通過調(diào)用系統(tǒng)定時(shí)函數(shù) while(SysTick_Config(SystemCoreClock/72000000)) ;使其產(chǎn)生1s中斷。
問題:運(yùn)行時(shí),通過標(biāo)記變量發(fā)現(xiàn)程序無法進(jìn)入系統(tǒng)中斷SysTick_Handler()
解決方法:在系統(tǒng)頻率為72MHz時(shí),SystemCoreClock/72000000= 1,相當(dāng)于每一個(gè)時(shí)鐘周期就要進(jìn)入中斷一次,實(shí)際上是不可能的,所以無法進(jìn)入中斷。將值改成SystemCoreClock/72000后即可進(jìn)入中斷。
再問:目的想產(chǎn)生1s中斷,按照現(xiàn)在的想法應(yīng)該是產(chǎn)生1ms的中斷,但在運(yùn)行中發(fā)現(xiàn)產(chǎn)生的中斷要比ms短得多,不能得到正確的延時(shí)。
最終解決:其實(shí),SystemCoreClock/72000的值是賦給系統(tǒng)定時(shí)寄存器的值,所以要產(chǎn)生1ms的中斷應(yīng)該寫成SystemCoreClock/1000,要產(chǎn)生1s的定時(shí)中斷應(yīng)該賦值SystemCoreClock/1000000 。
8、現(xiàn)象:編寫了ADC轉(zhuǎn)換后的數(shù)據(jù)通過DMA傳輸,經(jīng)過USART串口輸出數(shù)據(jù)的程序。仿真時(shí),程序一運(yùn)行就停在了啟動(dòng)文件里面中斷函數(shù)名處。
問題:中斷也打開了,中斷函數(shù)名也沒有問題,資源打開正常,就是仿真是不能通過總是停留在 B. 處。
解決方法:經(jīng)過分析,問題出在了開中斷的配置上。因?yàn)樾酒桥f芯片,所以使用中斷時(shí)應(yīng)當(dāng)從新定位中斷函數(shù)入口地址:NVIC_SetVectorTable()。
9、現(xiàn)象:調(diào)試文件系統(tǒng)程序時(shí),程序編譯沒有錯(cuò),仿真時(shí)程序總是跑飛到硬件中斷。
問題:仿真總是過不去,頻繁跑飛
解決方法:初始化文件系統(tǒng)時(shí),前面忘記調(diào)用設(shè)備選擇函數(shù),導(dǎo)致一些參數(shù)未能及時(shí)存儲(chǔ)變量的值,致使程序跑飛,加入設(shè)備選擇函數(shù)后,該現(xiàn)象解決。