Firmware Lib的应用及C++工程建立过程杂谈
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$armexamplesSTSTM32F10xFWLiblibrary中
由于版本的问题,一般应用都重建一个 $PROJ_DIR$....library中
在$TOOLKIT_DIR$armexamplesSTSTM32F10xFWLib中有3个关键的文件夹
1.$TOOLKIT_DIR$armexamplesSTSTM32F10xFWLiblibrary 里面有2个重要目录 inc src
2.$TOOLKIT_DIR$armexamplesSTSTM32F10xFWLibproject 我们新建工程可以用此当作模板直接拷贝修改即可
3.$TOOLKIT_DIR$armexamplesSTSTM32F10xFWLibexamples 内部存放着我们需要的一些常用例程 它一般含有 main.c 用户主程序,它最终是在$PROJ_DIR$....project中 readme.txt stm32f10x_conf.h 模块的配置文件 stm32f10x_it.h stm32f10x_it.c 用户中断服务程序填加文件 可以将此复制到我们自己的$PROJ_DIR$....project中
用户的工程应该在$PROJ_DIR$....projectEWARM下建立 它重要含有 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->Preprocessor->Additional include directories 填入 $PROJ_DIR$.. $PROJ_DIR$....libraryinc
2.库文件引用声明 在Option->Linker->Config Search paths 填入 $TOOLKIT_DIR$LIB $PROJ_DIR$....librarysrc
关于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@126.com 2008.1.14 10:58 杂谈于雁塔菜地中 |