IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

参考博客及文档有:

1,http://www.cnblogs.com/ele-eye/archive/2011/11/28/2266229.html

        2,http://www.cnblogs.com/king-77024128/articles/2512997.html(CMSIS介绍)

        3,   http://wenku.baidu.com/link?url=2blE__GxI1lmJglihBi5xJQPolza-NMxcZqGThxwysiY80ZOe6hLl5k6mowbTN2j30WsPftFZsBe1pRt8WlCDIT7Ce5EIReo4uGCEyegh7S(IAR 新建 STM32工程)

        4,http://blog.sina.com.cn/s/blog_4c8287230100f0jw.html(IAR 新建 STM32工程)

        5,http://blog.sina.com.cn/s/blog_4c8287230100eznh.html(IAR使用说明)

        6,http://blog.sina.com.cn/s/blog_4c8287230100f2ah.html(IAR使用说明 第一个IAR项目)

        7,http://blog.chinaunix.net/uid-26435987-id-3073074.html(启动代码和bootloader的关系)

       建立工程之前首先应知道IAR EW6.30版本较IAR EW6.20之前的版本有一个较大的改变。即IAR EW6.30已经植入了Cortex-m3的内核相关定义,所以在建立工程时就不需要添加ST库中core_cm3.c 和 core_cm3.h 这两个文件了。不过需在配置IAR EW选项是需勾选"Options - General Options - Library Configuration"界面下的Use CMSIS。如图:

IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

           建立工程前先介绍下相关文件夹及源文件:

         CMSIS:ARM定制的一个Cortex_M系列微控制器软件接口标准(Cortex MicroController Software Interface Standard的缩写)。主要是为了提供通用api接口来访问内核和一些片上外设。提高代码的可移植性。CMSIS有三个层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件(是一种独立的系统软件或服务程序如FatFS)访问层Middleware Access Layer(MWAL),设备访问层(Device Peripheral Access Layer)。CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等,该层是由ARM实现的。MWAL用于对中间件的访问,现在该层还未实现。DPAL用于定义一些硬件寄存器的地址和一些外设访问函数,由芯片制造商实现。CPAL的实现就是core_cm3.c,core_cm3.h文件。DPAL层实现的就是system_stm32f10x.c的文件(似乎还要加上外设的函数库)。

       stm32f10x_flash.icf:编译器链接库文件,修改两个参数即可改变代码存放的地址空间。IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

       startup_stm32f10x_cl.s:stm32f105vc在IAR编译器环境下专业的启动文件。启动文件用英文单词来描述为“Bootloader”。无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从复位开始执行main函数中间这段时间(称为启动过程)所必须进行的工作。开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。由开发环境及启动文件可知:STM32的启动过程。首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。然后在复位中断服务程序中跳转¬¬C/C++标准实时库的__main函数,完成用户堆栈等的初始化后,跳转.c文件中的main函数开始执行C程序。假设STM32被设置为从内部FLASH启动(这也是最常见的一种情况),中断向量表起始地位为0x8000000,则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32遇到复位信号后,则从0x80000004处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转__main函数,最后进入mian函数,来到C的世界。

         bootloader:不是一段代码,它是一个具有引导装载功能的完整程序,如可以引导装载linux的vivi或uboot,以及通常PC机上的BIOS程序等。Bootloader也包含了相应的启动代码,也就是说启动代码是Bootloader的一部分,是所有相应应用程序的一部分。

      system_stm32f10x.c/.h:设置系统以及总线时钟,这个里面有个非常重要的SystemInit()函数,这个函数在我们系统启动的时候都会调用,用来设置系统的整个时钟系统。不知从哪个版本开始该函数被加入了启动文件中,可在启动文件查找。所以我们不需使用该函数了。系统主频时钟(主频率)的改变依实际芯片主频修改,如图:

      IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

      stm32f10x.h:这个文件相当重要,只要你做STM32开发,你几乎时刻都要查看这个文件的相关定义。这个文件打开可以看到,里面非常多的结构体以及宏定义。这个文件里面主要是系统寄存器定义声明以及包装内存操作。外部时钟频率在该文件里改变,如图:IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

       你外部晶振使用多少HZ,就改变为多少。

     misc.c:定义了中断向量表初始位置。对比ARM7/ARM9内核(复位后起始地址固定0x000000,中断向量表位置不固定),Cortex_M3则是固定了中断向量表的位置(若FLASH启动,复位后中断向量位置固定在0x08000000.),而程序起始地址(程序被安置的地址)是可变化的。编译器链接器分配了中断向量表实际放置的地址。所以cm3中断向量表初始位置不可变,程序起始地址可改变(对CPU来说)。如图: misc.c

      IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

      如图启动文件内修改当前程序的开始地址(内部flash启动时即ROM_start的地址):

      IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

                             

          下面开始建立工程:

         1,打开IAR EW。

            2,点选“File --- New ---  Workspace”创建一个工作区。创建工作区先新建一个文件夹,我在E盘新建一个名为IAR_Pro的文件夹,作为工作空间。然后在该文件夹下再新建一个名为Project1的工程文件夹,一会要在此目录下新建工程。

   IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

           3,点选“Project --- Create New Project”。弹窗后Tool Chain选择ARM,Project templates选择Empty project。点击OK,后弹出另存为窗口。选择文件路径为工作空间路径“E:\IAR_Pro\Project1”。填写文件名为NEW_Project,即工程名。

           4,在“E:\IAR_Pro”文件夹下新建USER,CMSIS,STM32F10x_FWLIB这三个文件夹。USER存放用户实现的代码如main.c和stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.c。CMSIS存放cm3的内核文件及启动文件和stm32f10x.h和system_stm32f10x.h,这里只存放启动文件startup_stm32f10x_cl.s。STM32F10x_FWLIB存放ST官方提供的标准库文件。 

           5,将IAR 链接脚本文件stm32f10x_flash.icf添加到Project1目录下。

           6,将上述文件都添加到IAR 工程里。如图:

           IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

           7,配置编译器选项。右击工程名选择Options。

          (1)配置General Options。如图:

            IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

           IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

           (2)配置C/C++ Compiler。点击Optimization(最优化)选择 High,如图:

             IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

             点击Option--C/C++ Compiler--Preprocessor下添加头文件路径及相应宏定义符号例如USE_STDPERIPH_DRIVER和STM32F10X_CL(互联型)。如图:

              IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

             (3)配置Output Converter,如图:

               IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

              (4)配置Linker。如图:

                IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

              路径可改为$PROJ_DIR$\stm32f10x_flash.icf。增加可移植性。

             (5)配置Debugger。如图:

              IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

              IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

              以上配置开发环境OK。编译OK,使用的是3.5库ADC1_DMA文件夹里的main.c,编译OK,如图:

              IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

           Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。

            查看IAR编译器编译后的汇编代码===================================
编辑界面右击工程名,点击Options选项,选择c/c++ compiler选项中的list选项,勾选output assembler files,编译后生产离线汇编代码文件。
调试界面下,点击view/disassembly菜单项,则显示在线汇编代码窗口。
在线调试,需将Debugger选项下Setup下的Driver改为simulator模拟器,run to到你想到的地方。然后点击Download and Debug


产生map文件================================================、
Options--linker--list --- Generate linker map file




仿真器作用=================================================
仿真器是在程序运行时,用来观察寄存器里的数值的。比如说你定义了一个变量,程序运行过程中这个变量会变化。当你需要确定当前值时候,可以用仿真器看到。
所以,如果做大工程,仿真器是必不可少的。如果是很小的代码,可以不用仿真器,用串口直接下载程序就OK了。 


硬件仿真与软件仿真区别=======================================
硬件仿真依赖实际的硬件实物,程序是运行在实际的cpu中的,读取到的任何数值、状态都是实际的现有状态,一旦能通那基本就没问题了。


软件仿真是在pc上用软件模拟了硬件cpu的各种功能、寄存器等,不依赖实际的硬件,其实可以看成是多个函数,你写的程序是多个输入,有一个输入,对应的函数就输出相应的结果。


软件仿真即使成功,实际下载到硬件上也有可能会出问题,比如电源、晶振这些都是没法仿真的。