-
转载的 感觉 有 错误 特别是 贴的 图 STM32 好象不能 从 0X00执行程序 只能从0X8000000 开始 执行!
STM32启动代码概述
发布: 2009-5-20 16:00 | 作者: hnrain | 查看: 1013次
一般嵌入式开发流程就是先建立一个工程,再编写源文件,然后进行编译,把所有的*.s文件和*.c文件编译成一个*.o文件,再对目标文件进行链接和定位,编译成功后会生成一个*.hex文件和调试文件,接下来要进行调试,如果成功的话,就可以将它固化到flash里面去。
启动代码是用来初始化电路以及用来为高级语言写的软件作好运行前准备的一小段汇编语言,是任何处理器上电复位时的程序运行入口点。
比如,刚上电的过程中,PC机会对系统的一个运行频率进行锁定在一个固定的值,这个设计频率的过程就是在汇编源代码中进行的,也就是在启动代码中进行的。与此同时,设置完后,程序开始运行,注意,程序是在内存中运行的。这个时候,就需要把一些源文件从flash里面copy到内存中,又要对它们进行初始化读写,这又有频率的设置。这些都是初始化。
初始化完成后,我们又要设置一些堆栈,要跳到C语言的main函数里面运行。这就需要堆栈。对普通的ARM CPU有这样一个要求:在绝对地址为零的地方要放置一个异常向量表,但并不是所有的ARM CPU都留有这个一个空间,这就需要用到映射的功能。我们可以将其它地方的一些空间映射到绝对地址里面。当发生异常时,ARM核来读取异常中断表的时候,它会使用映射之后的那个表,这个就可以接着往下执行,否则在绝对地址零的地方找不到任何信息,程序就会死掉。这些运行的环境全部建立好后,程序就会跳转到我们的main函数里面。
总之,启动代码,就是对最小系统的初始化。包括晶振,CPU频率等。
启动代码的最小系统是:异常向量表的初始化–存储区分配–初始化堆栈–高级语言入口函数调用– main()函数。
程序的启动过程:
EF:__MICROLIB
EXPORT __heap_base
EXPORT __heap_limit
ELSE
这个时候,程序会运行各种scatterload函数,将我们的堆栈、全局变量等内容拷贝到内存中去。拷贝完后,就正式跳转到我们的main()函数中来执行了。
这就是启动代码执行的全过程,呵呵,平时我们看到以为只是执行main()函数就行了,是不是没有想到在执行 main() 函数后还有这么多学问呢?
-
很全的资料,收下了谢谢
-
数据采集模块:独立数据采集单元含MCU,AD.
我的意思例如设定15;希望采集模块模拟运行的时候:围绕着15产生正负1的偏差
-
顶下。。。。。。
-
晕,怎么计算的?
-
如果有ad的读单片机,使用电阻分压,或使用运放搭建一个分压电路,1/4放大的,变换到0~5V。使用ad检测,
没有ad的单片机,使用V-F变换电路或器件,将电压转换为频率测量。或使用电容充放电时间换算!
-
问题没有解决,自己顶一下
-
两眼放光**********************
顶!!!!!!!!!!!
-
谢谢大家!问题已找到.与大家分享痛苦经历..
[这个问题绕了2个弯.
程序初始化AHB外设时钟时.使用了一个未赋值的临时变量作为外设掩码输入. 导致错误的把SDIO的时钟打开了.
STM32勘误表中提到了如果要使用SDIO就不能使用UART4_TX. 两者会有冲突. 因此即使正确的初始化了GPIO与UART寄存器Tx也不会为高电平.
而改动应用程序将导致内存map发生变化. 局部变量的初始值也有所差别. 某些情况下不会将SDIO外设时钟打开. 故可正常运行.]
其实一开始我知道肯定是哪个地方内存出现问题了, 但死也找不到. 因为通过插件看GPIO, UART, RCC几个寄存器值完全配置正确了. 还不能工作.
有一次点击寄存器列表的时候打开了AHB看了一下,发现SDIOEN = 1. 而程序并没有使用SDIO. 当时没在意.
后面在看勘误表的时候发现SDIO与UART4_TX有冲突...才想起问题的所在.. 很快就定位了..
最后..血的教训:画原理、写驱动前一定要看勘误表!!! 在AT91,STM32上已经出了4-5个相关的问题了. 至少导致重新做了2版.
-
这不是逻辑分析仪吗?
-
我也很少听说用这个的。
-
看你的定位了啊 要是你做工控的话 就不需要ARM7 还是ARM9啊 要是你想偏硬的话 ARM7是个不错的选择哈,,,, 呵呵 还在这上面游走呢
-
有个命令叫做nmake
用过都说好哦
-
前几天调JATG时,用JLINK出现了问题,查找资料可能是nWAIT问题,请教了一位高手,解释是跟时序有关,如果是高速设备的话就要用这个信号,GOOGLEMAN的那个文章可以看下
-
MAKE
-
我是这样连的
FET 1 TDO------------------2013 RST
4------------------------ --------vcc
7-----------------------------------SWDTCK
9-----------------------------------GND
-
你可以用字符串截取来操作,而不需要依赖于webBrowser1啊
-
不要
-
lz可以检查一下,VBAT管脚上的电源有没有问题。
-
同样的程序 我在IAR下OK在KEIL下 不行。见鬼了。。。楼上的朋友 您也做过和我类似的东西?您在KEIL下 正常么? 可以看看您的配置么