1. 解決:keil報(bào)錯(cuò)invalid redeclaration of type name "s32" 答案:一般在Target Options C/C++選項(xiàng)卡里的Include Paths 里要添加幾個(gè)固定的頭文件路徑,
..CMSISCM3CoreSupport ..CMSISCM3DeviceSupportSTSTM32F10x ..STM32F10x_StdPeriph_Driverinc ..userinc
是頭文件路徑問(wèn)題,KEIL只要有一個(gè)頭文件找不到,就會(huì)自已從本身的INC文件夾找頭文件,結(jié)果就會(huì)出現(xiàn)以上錯(cuò)提示。把老版的頭文件改為STM32F10X.H.
新的庫(kù)已經(jīng)把.CONF.MAP.TYPE都已經(jīng)去掉整合到STM32F10X.H當(dāng)中
工程中包含了老版本的頭文件,包含stm32f10x_lib.h這個(gè)文件 ,將該頭文件改為STM32F10X.H.
2.STM32_TEST.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).
此問(wèn)題錯(cuò)誤提示已經(jīng)十分清楚的告訴你錯(cuò)在哪里了,Undefined symbol SystemInit ,翻譯過(guò)來(lái)就是:SystemInit 這個(gè)符號(hào)沒(méi)有定義,隨后的小括號(hào)告訴你了,是在startup_stm32f10x_md.o這個(gè)文件里面被提及的,這個(gè).o文件在工程里面并沒(méi)有,它是一個(gè)在編譯的時(shí)候根據(jù).c/.s文件生成的。所以我們只需要找到工程里面的.s或者.c即可,這里對(duì)應(yīng)這個(gè)名字的就是startup_stm32f10x_md.s了。
在此文件里面可以找到SystemInit的所在: Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP 原來(lái)在復(fù)位中斷服務(wù)函數(shù)里面,調(diào)用了SystemInit這個(gè)函數(shù),而這個(gè)函數(shù)在.s文件里面沒(méi)有定義。 所以解決的辦法有兩個(gè)。 1,在外部(其他任何.c文件里面)定義SystemInit這個(gè)函數(shù),哪怕是個(gè)空函數(shù)也可以。 2,把 LDR R0, =SystemInit BLX R0 這兩句話(huà)去掉。
(當(dāng)使用Libraries里面的startup文件時(shí),出現(xiàn)的問(wèn)題。我采用的1解決辦法,順利解決問(wèn)題)
3.。。HardFault_Handler的調(diào)試 最簡(jiǎn)單的辦法:
在進(jìn)入HardFault_Handler之后,根據(jù)堆棧指針查看堆棧,找到堆棧中最新的函數(shù)返回地址,到這個(gè)地址上去加斷點(diǎn),一步步根據(jù)匯編執(zhí)行代碼。很快就能找到出錯(cuò)原因,大多數(shù)是數(shù)組溢出,或者是指針初始化的問(wèn)題。
出現(xiàn)此問(wèn)題,肯定是堆棧溢出和數(shù)組越界。
(有時(shí)可能是因?yàn)椤啟動(dòng)文件,對(duì)stack和heap設(shè)置的太小,需要自己手動(dòng)設(shè)置變大,就不會(huì)出現(xiàn)此問(wèn)題。我就是將
原來(lái)的0x400和0x200增大到0x2000和0x2000)
(今天經(jīng)過(guò)高人指點(diǎn),對(duì)于此問(wèn)題又找到原因:潛入式庫(kù)函數(shù)里的malloc,沒(méi)有垃圾回收機(jī)制,因?yàn)槲沂锹惚,沒(méi)有
系統(tǒng)支持,所以malloc對(duì)內(nèi)存并沒(méi)有明確的機(jī)制,也就是說(shuō),他分配的內(nèi)存很可能是有問(wèn)題的,造成溢出等。所以原來(lái)
。s文件默認(rèn)的堆棧大小,都很小,很容易就溢出。 現(xiàn)在只需將malloc函數(shù)申請(qǐng)的內(nèi)存,使用數(shù)組代替,即可。)
4.問(wèn)題 "No Cortex-M Device found in JTAG chain"或“Emulator has been changed or re-enumerated!”
原因:燒錄的程序關(guān)閉了JTAg功能,復(fù)用了JTAG的接口,導(dǎo)致JTAG不能正常使用。這事,就需要使用串口下載一個(gè)
程序,此程序沒(méi)有關(guān)閉JTAG即可,然后就可以正常重新使用JTAG。
5.問(wèn)題:void SystemInit(void)不能寫(xiě)函數(shù),寫(xiě)在這里面的函數(shù)都不反應(yīng)
原因:
6. 問(wèn)題: 中斷方式接收USART,進(jìn)入中斷出不來(lái)了
解決: 配置串口時(shí),只寫(xiě)USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
不打開(kāi)TXE,發(fā)送中斷,即可。這樣進(jìn)入中斷,判斷FLAG,就不會(huì)出現(xiàn)錯(cuò)誤。
|