你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Firmware Lib的应用及C++工程建立过程杂谈

[复制链接]
incompletely 提问时间:2008-9-3 18:06 /
Firmware Lib下在地址:
http://www.st.com/stonline/products/support/micro/files/um0427.zip Firmware Lib用户手册下载地址:
http://www.st.com/stonline/products/literature/um/13475.pdf

IAR环境Firmware Lib的目录在
$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\library\中
由于版本的问题,一般应用都重建一个
$PROJ_DIR$\..\..\library\中
在$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\中有3个关键的文件夹

1.$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\library\
里面有2个重要目录
\inc
\src

2.$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\project\
我们新建工程可以用此当作模板直接拷贝修改即可

3.$TOOLKIT_DIR$\arm\examples\ST\STM32F10x\FWLib\examples\
内部存放着我们需要的一些常用例程
它一般含有
main.c 用户主程序,它最终是在$PROJ_DIR$\..\..\project\中
readme.txt
stm32f10x_conf.h 模块的配置文件
stm32f10x_it.h
stm32f10x_it.c 用户中断服务程序填加文件
可以将此复制到我们自己的$PROJ_DIR$\..\..\project\中
用户的工程应该在$PROJ_DIR$\..\..\project\EWARM\下建立
它重要含有
cortexm3_macro.s 启动文件
stm32f10x_vector.c 用户向量文件

lnkarm_flash.xcl
注意它在菜单Option->linker->config->Linker command file里要填入
$PROJ_DIR$\lnkarm_flash.xcl
这样即可在出现在工程菜单Workspace->BOOT_FLASH中的Output里
注意:
要在Option->C/C++ Compiler->Defined Symbols里填写VECT_TAB_FLASH

lnkarm_ram.xcl
注意它在Option->linker->config->Linker command file里要填入
$PROJ_DIR$\lnkarm_ram.xcl
这样即可在出现在Workspace->BOOT_RAM中的Output里
注意:
要在Option->C/C++ Compiler->Defined Symbols里填写VECT_TAB_RAM
BOOT_FLASH,BOOT_RAM可在菜单Project->Edit Configurations里添加和删除
这样即可运行在FLASH或RAM环境中

工程选项的主要配置问题
进入此菜单的方法有3个
1. Alt+F7
2. 在菜单的Project下选择Option
3。在Workspace右键选择Option
临时填加stm32f10x_conf.h内没有配置的选项
在Option->C/C++ Compiler->Defined Symbols里
填写_ADC1 等同在stm32f10x_conf.h里#define _ADC1
填写_GPIOA 等同在stm32f10x_conf.h里#define _GPIOA

关于Hex或Bin文件的生成输出问题
1.在选项栏里直接填入需要的文件
在Option->Linker->Output->Output file下选择Override default
填入:文件名.文件类型
例如: test.hex或test.bin
这种方法虽然很方便,但是可能随手点击Override default使
文本框内的文字变为:工程名.d79
2.在xcl文件里填入所需的文件类型
在BOOT_RAM下要填入lnkarm_ram.xcl文件中
在BOOT_FLASH下要填入lnkarm_flash.xcl文件中
可以直接在其文件的尾部填入
-Ointel-extended,(CODE)=.hex//输出hex文件

-Oraw-binary,(CODE)=.bin//输出bin文件
注意只能选择其一!!!
这种方法虽然"返古",但却是"永垂不朽"的~~~

用户指定固件库的配置问题
1.头文件引用声明
在Option->C/C++ Compiler-&gtreprocessor->Additional include directories
填入
$PROJ_DIR$\..\
$PROJ_DIR$\..\..\library\inc
2.库文件引用声明
在Option->Linker->Config Search paths
填入
$TOOLKIT_DIR$\LIB\
$PROJ_DIR$\..\..\library\src\

关于C++的配置问题
1.选择C++编译器
在Option->C/C++ Compiler->Language->Language下
选择
Embedded C++

Extended Embedded C++
在Option->C/C++ Compiler->Language->Language conformance下选择
Allow IAR exensions
这样即可支持__low_level_init(),从而可是全局变量复位后不初始化为0
例如:
extern "C" __root char __low_level_init (void)
{
stm32_Init();//抢在类析构函数和main()前初始化
return 0;//0-变量不初始化,1-变量初始化
}
SystemObj System;
LcdObj Lcd;
int main()
{
return 0;
}

再谈C++中变量不初始化为0的问题
在IAR中,本身就有__no_init修饰符可以阻止对变量的初始化
但是在C++中,对整个类使用__no_init修饰符将造成类不能析构
即分配类后将不能自动调用类的析构函数即类的初始化函数。
再者工控中需要很多需要初始化不变的变量用于现场参数的记忆。
而C++的类成员变量也需要此功能。
故干脆重载__low_level_init()使任何变量不初始化。
注意__low_level_init()返回0即可达到此目的!!!切记!!!
再注意__low_level_init()是在类析构函数和main()前运行的。
这样就可提前进行些系统的初始化,如__low_level_init()内的stm32_Init();

类分配顺序问题
在C++中,分配顺序顺序极为重要!!!
因为它是在__low_level_init()后而在main()前运行的!!!
由于硬件的关系,所以运行及分配的顺序很重要
申请反了可能带来意想不到的后果!!!!
哈哈,大雪封山,先杂谈到这里,俺要继续种地了~~~

出处:hotpower
收藏 评论0 发布时间:2008-9-3 18:06

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版