当前位置:文档之家› stm32+IAR配置与固件使用

stm32+IAR配置与固件使用

<2010-12-24>

kongst@https://www.doczj.com/doc/033454759.html,

If an error, please contact author, to be corrected.

For other uses, indicate the source, to express my recognition of the results. Thank you.

一、序言:

1.1 说明

本文逐步介绍了作者自身在STM32处理器和IAR编译环境的学习过程,并介绍了在该类环境下容易产生错误的地方,最后顺利的进行Firmware下的程序编写和ST-LINK的调试。

说来惭愧,小小的编译环境竟然花费了我整整4天时间,本人也是跟随着网上的众多教程慢慢的摸索。可不想,编写教程的人貌似并没有遇到很多问题,而自己确因为人品的关系很是出错。现将熟悉过程记录之,供人品和我一样差的,甚至比我差的同胞使用。

以下,仅仅是作者自身的实践所得。如有出错,请谅解,并提出意见;如需要引用,还请注明来源,以此表示对我成果的肯定。谢谢。

1.2 选择STM32单片机/处理器

在公司完成一个项目之后,需要考虑新的芯片适应新的需求,以此,同主管商量之后,决定采用ST的8位或32位单片机。其价格、功能、用户群都是比较不错的。

介于自身对32位芯片的向往,于是义不容辞的直接上STM32单片机。公司正好有一块STM32的板子,于是决定从STM32F103C8开始。

1.3 熟悉STM32的编程手法

不同于以往的8位或16位单片机,STM32的编程大量使用Firmware,也就是固件,个人理解是:Firmware不需要或者很少修改之后,可以随意的调用,即可以实现相关功能。Firmware的设计结构预示着它具有很好的通用型,而且熟悉之后调用非常的简单。

最大的困难在于当初次接触Firmware时,可能有点晕,于是本人花费了整整4天时间初步搞定了如何使用Firmware,以及使用开发板进行下载调试。

1.4 平台选择

A、开发板、仿真器:使用的是STM32F103C8-PKT+ST-LINK;

B、开发环境:IAR Embedded Workbench for ARM, 32K Kick start Edition;

C、Firmware:STM32F10x_StdPeriph_Lib_V3.4.0

首先安装IAR Embedded Workbench for ARM, 32K Kick start Edition;

下载STM32F10x_StdPeriph_Lib_V3.4.0;

(所有的资源都可以到IAR和ST官网上下载,资源的获取也是很重要的,要是自己不培养找资源的功夫,就不是一个好的开发人员,这里就不留网址了)

二、准备工作

2.1 了解IAR for ARM编译环境

和很多其他的编译环境一样,IAR for ARM也分为创建项目,添加文件,编译,连接,调试等相关流程。对IAR for ARM操作的重点在于对IAR环境的配置,将在后面详细介绍。(不像Keil编写51单片机一样,只需要配置out有hex输出既可)

2.2 了解Firmware-STM32F10x_StdPeriph_Lib_V

3.

4.0

只有对Firmware有整体性的认识之后,你才能使用它,不至于很模糊。以此初学者一定要对Firmware有一个整体性的认识。

2.3 了解ST-LINK

这里的ST-LINK是正宗的ST公司设计的,不是ST-LINKII,更不是III;

IAR for ARM中已经提供了对ST-LINK的支持,以此很容易就可以使用ST-LINK进行配置。

三、开始工作

和很多教程一样,使用项目知道的方法,在实际的操作中来加深对该环境下的操作方法。

环境为:

STM32F103C8-PKT+ST-LINK

IAR Embedded Workbench for ARM, 32K Kick start Edition

STM32F10x_StdPeriph_Lib_V3.4.0

3.1 创建文件目录

创建一个文件夹20101223,在下面在创建一个EW ARM文件夹:20101223文件夹是你的整个项目的文件夹;

EWARM文件夹是项目中的放置工程文件夹;

3.2 创建一个工程目录

创建一个Workspace,一个Project,添加Add Group:

最后IAR for ARM中的结构如下:

其中

CMSIS:Cortex Microcontroller Software interface standard

StdPeriph_Driver:Standard Peripheral Driver

这是你的代码结构,主要是模仿Firmware中的Template,应该是最清晰的结构了。

文件组织结构如下:

只要按照以上的建立方式,既可以进入下一阶段。

3.3 添加Firmware相关文件

该过程主要是Copy和Add两个过程。

3.3.1 Copy

A、Copy Firmware下的整个Libraries文件夹到20101223文件夹下

B、Copy Firmware中的

main.c、

stm32f10x_conf.h、

stm32f10x_it.c、

stm32f10x_it.h 、

system_stm32f10x.c

如图:

到20101223文件夹下,如图:

C、Copy 各类.ICF文件

stm32f10x_flash.icf

stm32f10x_flash_extsram.icf

stm32f10x_nor.icf

stm32f10x_ram.icf

如图:

到EW ARM(即放置工程文件的文件夹下),如图:

至此,所有的拷贝工作都已经完成,进入Add调整阶段。

3.3.2 Add

以最简单的GPIO端口操作为目的,开始Add相关文件。

添加之后的结果为:

其中:

core_cm3.c是内核文件(没深入研究);

system_stm32f10x.c是系统相关文件(没深入研究);

misc.c是一个辅助文件;

stm32f10x_gpio.c是gpio的驱动文件;

stm32f10x_rcc.c是复位与时钟控制器驱动文件;

main.c是主程序的入口函数,是整个系统的一个主框架;

stm32f10x_it.c是系统的所有的中断函数文件;

至此,所有的Copy和Add操作都已经完成,接下来是Modify。

3.4 开始编译和调试

3.4.1 Compile with Modify

首先修改main.c

修改main.c使之成为一个按照你的想法完成任务的系统功能。

最简单的任务就是:让一个LED一亮一灭;

流程图如下:

源代码如下:

/* Includes

--------------------------------------------*/ #include "stm32f10x.h"

/* Private function prototypes

--------------------------------------------*/ void RCC_Configuration(void);

void GPIO_Configuration(void); typedef enum {

LED1 = 0,

LED2,

LED3,

LED4,

}LED_STATE;

LED_STATE led_status;

int main(void)

{

u32 cnt = 0x000fffff;

/* System Clocks Configuration */ RCC_Configuration();

/* Configure the GPIO ports */ GPIO_Configuration();

led_status = LED1;

while (1){

switch (led_status){

case LED1:

GPIOB->BSRR = 0x1000E000; /* turn on LD1 */

led_status = LED2;

break;

case LED2:

GPIOB->BSRR = 0x2000D000; /* turn on LD2 */

led_status = LED3;

break;

case LED3:

GPIOB->BSRR = 0x4000B000; /* turn on LD3 */

led_status = LED4;

break;

case LED4:

GPIOB->BSRR = 0x80007000; /* turn on LD4 */

led_status = LED1;

break;

}

while(cnt--);

cnt = 0x000fffff;

}

}

/**

* @brief Configures the different system clocks.

* @param None

* @retval : None

*/

void RCC_Configuration(void)

{

/* Setup the microcontroller system. Initialize the Embedded Flash Interface, initialize the PLL and update the SystemFrequency variable. */ SystemInit();

/* GPIOA clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); }

/**

* @brief Configure the GPIOD Pins.

* @param None

* @retval : None

*/

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOB configuration: PB12 PB13 PB14 PB15 as led controller */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14| GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

Compile发现问题如下:

通过调整头文件路径解决:

右击Project——>option——>C/C++Compile——>Preprocessor——>:

在Additional include directories中加入如下语句:

$PROJ_DIR$\..\

$PROJ_DIR$\..\Libraries\CMSIS\CM3\CoreSupport

$PROJ_DIR$\..\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x $PROJ_DIR$\..\Libraries\STM32F10x_StdPeriph_Driver\inc

如图:

Compile:您有可能会出现以下问题:

这是需要修改stm32f10x.h文件中的相关,因为你没有为你的芯片选择类型,点击错误,即打开了stm32f10x.h头文件,如图:

只需要选择您的期间类型就好,比如:

再Compile,这下错误出现的吓人,镇定发现,我们没有选择device type:

选择好正确的芯片类型,如图:

Compile,出现:

分析好像没有将一些头文件包括进来,依然修改stm32f10x.h(注意:所有设备相关的头文件都是由stm32f10x.h控制的),找到如下图:

将其改成:

Compile:貌似ok了。

至此,程序基本上没有问题,之后进行调试,测试功能相关。

3.4.2 Debug and Modify

选择调试工具:ST-LINK;

选择调试方式:arm或者flash;

选择烧写配置文件:stm32f10x_flash.icf;

我们暂时使用ST-LINK进行flash的调试,这样,调试结束后,程序已经烧写到芯

片内部,可以成为一个真正的系统了。

至此所有的调试准备工作都已经就绪;

连接设备:包括ST-LINK和电源线:

点击,会出现如下结果:

你可以按F10、F11进行单步调试;

也可以按全速运行;

此时你可以看stack使用等相关情况,如图所示:

此时,

拔掉电源,从新插上电源,即可以不用任何帮助,系统就会自

动运行。

四、完成总结

在配置编译环境和修改Firmware文件时,可能会出现意想不到的问题,由于其通用性,限制了其易用性,加上初次接触的人对整个结构的不清晰认识都是出现问题的原因。

出现问题时:自己摸索问题,上网搜寻问题,自己摸索尝试解决问题,这三个方法是最终得以成功的保障。

本内容可能只适合一般的,或只适合自身搭建的环境,不能确保不会有其他问题发生。

相关主题
文本预览
相关文档 最新文档