芯片:STM32F103VC 官方库:V3.5 MDK: 5.11 在做IAP工程时,参考官方代码 if (((*(__IO uint32_t*)AppAddress) & 0x2FFE0000 ) == 0x20000000) //检查栈顶地址是否合法. {/* Jump to user application */ JumpAddress = *(__IO uint32_t*) (AppAddress + 4); /* 用户应用地址 */ Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) AppAddress); //跳转到APP. Jump_To_Application(); } 编译过程 出现 Error: L6218E: Undefined symbol __set_MSP (referred from iap.o). 头文件路径已都包含,百度谷歌 无果,求助弄过的大神,谢谢 |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
感谢您的回复,在IAR确实没有问题,不过我用MDK编译ST官方的历程,就可以通过,我搜索了一下,结果如下
Searching for '__set_MSP'...
F:\STM32 开发手册\USB\STM32_USB-FS-Device_Lib_V4.0.0\Projects\Device_Firmware_Upgrade\src\main.c(78) : __set_MSP(*(__IO uint32_t*) ApplicationAddress);
D:\Program Files\MDK\Keil_V5\ARM\PACK\ARM\CMSIS\4.1.1\CMSIS\Include\core_cmFunc.h(168) : __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
D:\Program Files\MDK\Keil_V5\ARM\PACK\ARM\CMSIS\4.1.1\CMSIS\Include\core_cmFunc.h(454) : __attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
Lines matched: 3 Files matched: 2 Total files searched: 146
但是我自己建的工程就没有,不知道这个路径怎么知道MDK安装目录的,好像不是在include paths里面
酱哒哒的回复有些误导(“__set_MSP是IAR软件可以使用的一个东西”)!另外最后也没有解决问题(百度不是什么都能解决的)。
“__set_MSP”函数原型为:
__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack);
该函数是ARM定义好的内核功能函数之一:设置主栈指针,该函数以存在于头文件(cmsis_armcc.h)的形式提供给各芯片厂商、IDE等使用(不是哪个芯片厂商或IDE特有的)。
简单说,如果楼主按照官方的例子还出现此类问题,是由于没有正确的包含路径所致,一般需要包含形如“CMSIS\Include”的路径(针对多IDE环境可能导致包含交叉而找不到定义)。自己写一个该函数根本不可取(因为如果此函数找不到定义,那么势必会有其它函数也会找不到而且会有很多!),工程中对于内核功能函数的引用也不可能只有这一个(你可能没看到其它的)。可以搜索相关路径(在mdk-arm中)找到cmsis_armcc.h所在的路径,然后明显的包含该路径即可。
建议楼主使用STM32CUBEF1来替代旧版本的库函数。ARM对__set_MSP()的定义:
Undefined symbol __set_MSP (referred from iap.o).翻译一下,就是未定义
为啥未定义,因为这个东西是设置主堆栈指针,__set_MSP是IAR软件可以使用的一个东西(简单说就是封装了下这个函数)。
估计是MDK没有封装这个东西,所以用不了。
自己写个汇编设置地址一样,就是简单的设置MSP堆栈指针,挺简单的(自己百度吧,百度好了,你再把那个汇编封装成__set_MSP,就可以用了)。
应该是工程里少了跟内核定义相关的代码,你查下那个core_cm3.c文件加进来没有。
最简单的方法基于ST的模板建个新工程。说不定你少的文件还不止一个。
是的,我在我电脑里面搜cmsis_armcc.h, 只有CUBE库里面有这个.h 文件, 标准库没有这个文件
不用谢,实在找不到路径,而且问题又只有这个__set_MSP,就可以自己编写一个,官方的也是人编写出来的。MSP主堆栈指针赋值,不过就几条语句,简单的汇编命令而已。