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文件时,可能会出现意想不到的问题,由于其通用性,限制了其易用性,加上初次接触的人对整个结构的不清晰认识都是出现问题的原因。
出现问题时:自己摸索问题,上网搜寻问题,自己摸索尝试解决问题,这三个方法是最终得以成功的保障。
本内容可能只适合一般的,或只适合自身搭建的环境,不能确保在其他环境下不会发生其他问题发生。