关闭

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

4672人阅读 评论(0) 收藏 举报
分类:

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

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

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:50864次
    • 积分:865
    • 等级:
    • 排名:千里之外
    • 原创:28篇
    • 转载:39篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论