创建一个基于万利EK-STM32开发板的IAR工程

控制/MCU

1876人已加入

描述

首先启动IAR开发环境。如果你的设置是在启动时出现Embedded Workbench Startup对话框,那么可以直接在这个对话框中点击第一个按钮——Create new projectin current workspace。如果你选择了启动不出现这个对话框,那么你可以在IAR的菜单栏中找到Project菜单,在其子菜单中有一个“Create new project...”。点击之后会出现创建新工程的对话框,Tool chain选择ARM,Project templates我们选择Empty project,然后点击OK。这时会弹出保存工程的对话框,随便些个工程名,例如MyTestProject,点击保存。这时一个空的工程就创建好了,接下来我们对工程的选项进行设置。

在Workspace窗口中,右击MyTestProject,在弹出的菜单中选择Options,这时就打开了工程选项。在第一项GeneralOptions中,选择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.0Kickstartarmconfig下。点击旁边的浏览文件的按钮,找到这个默认的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 flashloader勾上。

然后在切换到最下面的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_CRL16位都清0

 //这样CNF00,即选择为推挽输出模式

 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提供的库包含了很多已经写好了的代码,大家可以直接使用,以减少编程的工作量。

 

 

 

 

STM32/STM8

意法半导体/ST/STM

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分