初学stm32-环境搭建——stm32和IAR配置

  • Post author:
  • Post category:其他


1.1 说明

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

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;

二、准备工作

2.1 了解IAR for ARM编译环境

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

2.2 了解Firmware-STM32F10x_StdPeriph_Lib_V3.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,在下面在创建一个EWARM文件夹:

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

如图:

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


至此,所有的拷贝工作都已经完成,进入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使之成为一个按照你的想法完成任务的系统功能。

最简单的任务就是:让4个LED循环亮灭;

源代码如下:

/* Includes

——————————————–*/

#i nclude “stm32f10x.h”

/* Private 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$..LibrariesCMSISCM3CoreSupport


$PROJ_DIR$..LibrariesCMSISCM3DeviceSupportSTSTM32F10x


$PROJ_DIR$..LibrariesSTM32F10x_StdPeriph_Driverinc

如图:

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

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

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

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

右击Project——>option——>General Options——>Target——>:

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

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文件时,可能会出现意想不到的问题,由于其通用性,限制了其易用性,加上初次接触的人对整个结构的不清晰认识都是出现问题的原因。

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

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