圈圈前面几个STM32的程序是直接拿例子来改的,但 我们总不能每次都拿别人的例子来改吧?我们要学会如何 自己来创建一个属于自己的IAR工程。
首先启动IAR开发环境。如果你的设置是在启动时出现 Embedded Workbench Startup对话框,那么可以直接 在这个对话框中点击第一个按钮——Create new project in current workspace。如果你选择了启动不出现这个对话 框,那么你可以在IAR的菜单栏中找到Project菜单,在其子 菜单中有一个“Create new project...”。点击之后会出现 创建新工程的对话框,Tool chain选择ARM,Project templates 我们选择Empty project,然后点击OK。这时会弹出保存工程 的对话框,随便些个工程名,例如MyTestProject,点击保存。 这时一个空的工程就创建好了,接下来我们对工程的选项进行 设置。
在Workspace窗口中,右击MyTestProject,在弹出的菜 单中选择Options,这时就打开了工程选项。在第一项General Options中,选择Target标签页。在Processor variant分组中 单击Device单选按钮,然后单击Device右边的器件选择按钮, 在弹出的菜单中选择ST菜单中的ST STM32F10x。Endian mode 选择为Little,即小端模式。Stack align选择为4字节。 Output标签页使用默认设置就可以了,不用动。Library Configuration标签页中的Library选择为Full。Library options 和MISRA C标签页不用动,使用默认即可。
再切换到C/C++ Compiler分类,选择Language标签页, Language我们选择为C,并将Require prototypes勾上, 在Language conformace分组中选择Relaxed ISO/ANSI。其他 几个标签页可以不用修改。
然后再切换到Linker分类,在Output标签页中,在Format 分组中将Allow C-SPY-specific extra的复选框勾上。再切换 到Extra Output标签页,将Generate extra output file勾上。 再切换到Config标签页,在Linker command file分组中将 Override default勾上,这时有个默认的lnkarm.xcl文件,它 位于IAR的安装目录IAR SystemsEmbedded Workbench 4.0 Kickstartarmconfig下。点击旁边的浏览文件的按钮,找到 这个默认的lnkarm.xcl文件,然后复制一份到我们的工程目录 MyTestProject下。然后在Override default下面的框中写入 路径$PROJ_DIR$lnkarm.xcl,这将使用我们工程目录下的链 接文件。但是这个链接文件还是不行的,需要做一下修改。 用记事本打开我们刚刚复制到工程目录下的lnkarm.xcl文件, 找到以下部分并修改(其中用//注释的是原来的): //-DROMSTART=08000 //-DROMEND=FFFFF -DROMSTART=0x8000000 -DROMEND=0x801FFFF //-DRAMSTART=100000 //-DRAMEND=7FFFFF -DRAMSTART=0x20000000 -DRAMEND=0x20004FFF //-Z(CODE)INTVEC=00-3F -Z(CODE)INTVEC=ROMSTART-ROMEND //-D_CSTACK_SIZE=2000 -D_CSTACK_SIZE=800 //-D_HEAP_SIZE=8000 -D_HEAP_SIZE=400
再切换到Debugger分类,在Setup标签页中,Driver选择 Third-Party Driver。在Download标签页中,将Use flash loader勾上。
然后在切换到最下面的Third-Party Driver分类,以选择 调试器的驱动。在IAR debugger driver下的文本框中输入驱动 的路径,一般是C:ManleydriversSTLinkSTM32Driver.dll, 这要看你的STLink驱动装在哪了,指定到安装的路径即可。
至此,我们的工程选项就设置完了。接下来我们写个流水 灯的程序。要控制LED亮,就需要将对应的IO口设置为输出口, 并控制IO口的输出电平。通过查看万利STM32板的原理图,我们 4个LED是分别接在PORTC的4、5、6、7这4个引脚上的,高电平 时将点亮LED。
首先我们要将IO口设置为输出模式,查看STM32F103的数据 手册,是通过GPIOx_CRL和GPIOx_CRH寄存器来选择模式的。 我们要设置PORTC口的4、5、6、7位,那么就应该使用GPIOC_CRL 寄存器,它的地址为0x40011000。我们将这4个IO口设置为50MHz 的推挽输出模式,具体的代码见后面。然后,我们就可以对IO 口的高低电平进行控制了,这通过端口置1和清0寄存器来控制, 即寄存器GPIOx_BSRR寄存器和GPIOx_BRR寄存器。GPIOx_BSRR 寄存器可以同时置1和清0,高16位是用来清0的,低16位是用来 置1的。如果置1和清0位被同时设置,那么置1的优先级高。 由于我们这里是控制LED的,对操作要求不严格,所以我们不 使用BSRR寄存器的高16位,而用GPIOx_BRR寄存器来清0。 GPIOC_BSRR和GPIOC_BRR的地址分别为0x40011010和0x40011014。 另外,我们还需要启动PORTC的时钟,才能让端口工作起来。 启动PORTC时钟的控制在RCC_APB2ENR寄存器中,其中Bit4控制 PROTC的时钟,该位为1时时钟使能。RCC_APB2ENR的地址为 0x4002 1018。
最终,我们写出的流水灯程序入下所示。点击创建新文本 文件的图标,建立一个新的源文件。然后将以下代码复制进去:
#define GPIOC_CRL (*((unsigned int *)(0x40011000))) #define GPIOC_BSRR (*((unsigned int *)(0x40011010))) #define GPIOC_BRR (*((unsigned int *)(0x40011014))) #define RCC_APB2ENR (*((unsigned int *)(0x40021018)))
void Delay(void)//延时函数,流水灯显示用 { unsigned int i; for(i=0;i<0xFFFFF;i++); }
void main(void) { //使能PORTC时钟 RCC_APB2ENR |=(1<<4); //将GPIOC_CRL高16位都清0 //这样CNF为00,即选择为推挽输出模式 GPIOC_CRL &= 0x0000FFFF; //MODE选择为11,即50MHz输出模式 GPIOC_CRL |= 0x33330000; while(1) { GPIOC_BRR=(1<<4); //灭 LED5 GPIOC_BSRR=(1<<7);//亮 LED2 Delay(); GPIOC_BRR=(1<<7); //灭 LED2 GPIOC_BSRR=(1<<6);//亮 LED3 Delay(); GPIOC_BRR=(1<<6); //灭 LED3 GPIOC_BSRR=(1<<5);//亮 LED4 Delay(); GPIOC_BRR=(1<<5); //灭 LED4 GPIOC_BSRR=(1<<4);//亮 LED5 Delay(); } }
然后将其保存为main.c文件。再在Workspace窗口中, 右击MyTestProject,在弹出的菜单中选择“Add”→“Add Files...”,然后将我们刚刚保存的main.c文件增加进去。 然后编译,点击开始调试,等下载完成后,全速运行,就 可以看到流水灯跑起来了~~~~~
如果你需要产生一个HEX文件然后通过ISP下载来运行, 那么还需要在我们刚刚的lnkarm.xcl文件最后加入一行: -Ointel-extended,(CODE)=.hex 这样就会在工程目录的DebugExe下产生一个HEX文件。 当然,具体是在Debug目录还是Release目录,就要看你 当前选择编译模式了。
当然,上面这个工程只是一个非常简单的例子,在实际 的工程中,我们还有更多、更复杂的事情要做,例如各种 时钟的初始化、中断初始化等等。这些就需要靠大家自己 去看资料学习了,圈圈也只能是爱莫能助。ST提供的库包 含了很多已经写好了的代码,大家可以直接使用,以减少 编程的工作量。
http://blog.**/computer00/130429/message.aspx |