STM32_IAR 工程解释
- 格式:doc
- 大小:401.50 KB
- 文档页数:17
IAR for arm 4.42A 应用笔记学习stm32我选择的用的编译器IAR for arm 4.42A,因为开始用的这个吧,习惯了,我感觉,用什么编译器,都一样,程序还是要自己写的,别的东西永远是别人的,拿到自己手里,才是自己的;用IAR调stm32,我首先想到的是用stm32f103驱动一个LED,让他亮起来;接着调中断,接着调各种总线(SPI、SDIO、FSMC、UART、CAN、USB),这些会了,估计什么外围器件都能接上了。
第一章建工程点亮LED1.建工程:这里说下我怎样建的工程:点击如果错过了这个界面点Project——Creat New Project…点,取个名字就可以保存了;有了新的工程点下,保存为.C 文件;再在工程上右击——Add——Add Files..;把我们.C文件加进去;下面是最重要的一部,配置Option;右击工程,点出Option 界面;这里主要配置的几项有://General Options;//C/C++Compiler;//Linker;//Debugger;(1)Option 中的Target 选择我们所用的芯片型号;(2)C/C++Compiler中的Preprocessor输入我们的.h 文件的路径;说明:$PROJ_DIR$\带表的工程序所在的目录;在这个位置的基础上来添加我们的目录。
如:我们在E盘下建了一个文件夹(My_Project)放我们的工程;我把点.h文件放在E:\My_Project \User\inc里面,我们就可以把目录写成$PROJ_DIR$\user\inc;这样方便我的工程随便移动位置;(3)Linker下的Output设置如下:Extra Output设置如下:Config设置如下:说明:这个xcl是我们的flash配置文件,IAR4.42用的xcl文件,高版本的IAR已改为.icf文件,作用是一样的,加载进去就行;(4)Debugger中的Setup先择所用的调试工具,选上run to main;Download中有一项。
以前用IAR,正点原子提供的是MDK开发环境,我重新建立了一个IAR5.30工程,使用MDK库函数版本。
拷贝MDK库函数版本工程到一个工程目录下就好了,见下图。
几个icf文件要从其他地方考过来,不难的。
startup_stm32f10x_hd.s文件要使用IAR格式的,在IAR安装目录中有MDK,GCC,IAR三种格式的,需要使用IAR格式。
IAR开发环境设置。
这里要选择FULL ,不然会出现FILE not found 的错误。
上面的红圈很重要,第一个是头文件目录,必须要设置,工程下所有用到的.h文件第二个是宏定义,USE_STDPERIPH_DRIVER和STM32F10X_HD必须要添加,VECT_TAB_SRAM是正点原子工程中设置中断向量表到SRAM和FLASH中的宏定义,我使用SRAM调试,就需要定义这个宏了。
这里也很重要,这是设置SRAM和FLASH文件,我使用sram调试就利用SRAM那个icf文件了。
这是main.c文件,Systeminit();是我加上去的,如果不加好像也没有啥影响,不过在流水灯程序中如果不加,LED闪烁时间变慢,没有在MDK中的快。
所以,以后的工程,我都把这句加上了。
这是下载code到SRAM中的map文件,可以看到是下载到SRAM中,这样就可以调试了,上面说的是利用正点原子的库函数版本的程序,移植到IAR中的步骤,但是,我更喜欢使用寄存器版本的程序,因为条理和思路清晰,容易理解。
下面步骤是将寄存器程序移植到IAR中的,步骤和上面一样,但是要修改system.c文件,见下图,其中需要几句汇编,在IAR中是利用asm(“XXXX”);来声明嵌入汇编的。
下面是需要修改usart.c的文件,注释掉前面的#if 1,但是sys_exit()和重定义的fputc()需要保留。
然后寄存器版本的程序就可以移植到IAR5.30中了。
下图是在SRAM中调试寄存器版本的LCD测试程序界面。
Keil MDK 转换详解“>STM32 IAR 工程->Keil MDK 转换详解我在STM32 的学习中发现,大部分的STM32 示例程序都是基于IAR 开发环境的,但我认为使用Keil MDK 开发环境更加方便,可以利用RVMDK 强大的外设仿真功能加速STM32 的开发。
我在以前的Blog 文章里介绍过如何在RVMDK 中建立STM32 工程,以及如何使用RVMDK 的软件仿真功能,下面我将详细说明怎样将已有的IAR 工程移植到RVMDK。
不管是IAR 还是RVMDK,编程时使用的都是STM32 的固件函数库,唯一不同的是启动文件。
RVMDK 在建立STM32 工程时会自动创建启动文件STM32F10x.s,而IAR 使用的启动文件是cortexm3_macro.s。
此外,两者对中断向量表的管理也不一样。
在移植STM32 工程时首先要检查IAR 工程中是否使用了中断。
方法是要看工程中stm32f10x_it.c 文件内的各中断函数是否为空函数,中断函数为空说明没有使用中断;否则若中断函数有修改并且在main 函数中对NVIC 进行了设置,则说明使用了中断。
下面分没有使用中断和使用了中断这两种情况分别介绍移植方法。
无中断:没使用中断时的移植较为简单,此时还可以使用RVMDK 自动创建的启动文件STM32F10x.s,只要把IAR 工程project 文件夹中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h 和main.c 等文件复制到建立好的RVMDK 工程文件夹下,然后为RVMDK 工程添加使用到的库函数文件即可。
有中断:如果IAR 工程中使用了NVIC 时,在RVMDK 下就不能再使用自动生成的STM32F10x.s 启动文件了,但可以用IAR 工程中的启动文件cortexm3_macro.s 和stm32f10x_vector.s 来替换。
简述1STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)①浮空输入_IN_FLOATING②带上拉输入_IPU③带下拉输入_IPD(所谓上拉就是接一电阻到电源;下拉就是接一电阻到地。
也就是说带上拉就是口初始的时候是高电平,下拉就是低电平。
)④模拟输入_AIN⑤开漏输出_OUT_OD⑥推挽输出_OUT_PP⑦复用功能的推挽输出_AF_PP⑧复用功能的开漏输出_AF_OD1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。
通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。
比如:1.1.1 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
1.1.2 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
1.1.3 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。
输入模式。
1.4 所有端口都有外部中断能力。
为了使用外部中断线,端口必须配置成输入模式。
1.5 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
2 在STM32中如何配置片内外设使用的IO端口首先,一个外设经过①配置输入的时钟和②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。
IAR建⽴stm32⼯程 stm32是⼀个当下⾮常流⾏的微控制器,很多⼈都加⼊了学习stm32的⾏列中,常⽤的stm32编译器有IAR和mdk两种,接下来是利⽤stm32固件库3.5在IAR下的建⽴的⼯程模板历程: 1、在常⽤的⽂件夹下新建⽴⼀个⽂件夹,根据个⼈喜好,分别建⽴如下⼏个⽂件夹,⽤于分别存放固件库中的⽂件和⽤户⾃⼰的⽂件 2、将固件库E:\STM32\stm32固件库3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar⽬录下的汇编⽂件复制到刚刚建好的模板⽬录下F:\STM32-IAR\demo\CMSIS\Startup 3、将固件库E:\STM32\stm32固件库3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x⽬录下的⽂件复制到刚刚建好的模板⽬录下F:\STM32-IAR\demo\CMSIS\System下 4、将固件库E:\STM32\stm32固件库3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver⽬录下的驱动⽂件复制到模板⽬录下F:\STM32-IAR\demo\FWLIB 5、将固件库E:\STM32\stm32固件库3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\EWARM⽬录下的.icf⽂件复制到模板⽬录F:\STM32-IAR\demo\Config中6、将固件库⽬录E:\STM32\stm32固件库3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的F:\STM32-IAR\demo\User下到此为⽌,建⼯程前的准备⼯作已经做好,接下来就是打开IAR进⾏建⽴⼯程了,打开IAR->File->New->Workspace,建⽴好⼯作空间后,选择Project->Create New Project 建⽴⼀个新的⼯程,接下来将⿏标放在界⾯左侧的⼯作空间处点击⿏标右键选择Add,添加⼯作组如下图,⽂件名模板⽂件夹中的名字相同加下来分别将模板⽂件家中的.C⽂件添加进⼯程到此为⽌需要添加的⽂件已全部添加进来了,接下来是对IAR的配置,依旧是将⿏标放在左侧的⼯作空间上点击右键选择Options进⾏配置,在General Options-Target-Device选择⾃⼰使⽤的相应芯⽚型号,General Options下其他选项保持默认即可,接下来是C\C++Compler按下图进⾏设置接下来的⼏项⼀次按接下来的图⽚设置就好接下来是最容易忽视的⼀个问题,图⽚上画圈的位置⼀定要选上,不然编译将出错最后在⼯程中加⼊main函数编译通过,⼀个模板就建好了。
STM32图文解说--超级入门之三--IAR配置STM32图文解说--超级入门之三--IAR配置其实,IAR编译环境的配置是相当重要的,没配置正确或者不符合自己的习惯的话,使用起来就会很麻烦。
下面我根据网上的经验和资料,以及自己摸索和大家共同探讨下IAR的配置。
我第一次打开IAR环境的时候,发现工作区有明显分层现象。
如图一所示图一这是我郁闷了好久,网上也不知道该如何搜索相关,只有自己慢慢找,最后还是找到了。
点击tools---options就会弹出一个对话框来,如图二所示图二点editor选项卡,可以看到右边有很多选项,这些选项关系到使用的习惯和便捷性。
首先要谈到的是tabsize,这个表示tab的字符宽度,默认值为8,indentsize表示缩进的字符宽度,默认为2。
有人喜欢缩进为4,有人喜欢缩进为2,根据个人喜好,和程序的复杂度来选择,我一般选择2。
然后紧跟着,下面有个tab key funtion,说得是按下tab键所起到的作用,第一个表示插入制表符,第二个表示插入空格,一般选择插入空着(insertwith space)这个选项。
为了解决图一的问题,就在show rightmargin(显示右边空白),处理方法很多,可以不选中,也可以选择Printingedge(显示到边缘),也可以把Columns(分栏)占的比例修改为100都可以。
另外,根据个人习惯,有人喜欢列出行号,有人不喜欢,这个可以在configure的下面show line numbers的选项,选中即可列出行号。
其他可以根据自己习惯设定,设定好了之后,如图三的效果,就看起来舒服多了。
图三下面一个重点就是进行项目设定了,这个步骤非常重要,如果没有设置好,有可能编译不通过或者出错。
其实我们当初选择emptyproject模版的时候,配置都是属于默认的,但是有些关键配置还是需要自己手动配置的,虽然配置项目很多,根据网上经验和资料,以及个人理解,列举了几个关键选项来配置即可。
IAR下用JLINK调试STM32心得IAR开发环境下使用JLINK来调试STM32芯片是一种常见的调试方法。
以下是我在实际使用中总结的一些经验和心得。
首先,在使用JLINK进行调试之前,我们需要按照JLINK提供的说明书正确连接好硬件设备。
通常,我们需要将JLINK与STM32芯片之间连接好,并确保连接的正确性。
此外,我们还需将JTAG/SWD接口正确地连接到STM32的相应引脚上。
接下来,在IAR环境下进行配置。
在打开IAR工程之前,我们需要确保IAR和JLINK驱动软件已经正确地安装到电脑上。
然后,我们可以打开IAR并打开相关的工程文件,然后进入调试模式。
在调试模式下,我们需要在IAR的"Options"菜单中选择"Debugger"选项。
在"Driver"栏中,我们需要选择使用JLINK进行调试。
在"Setup"选项卡下,我们可以进一步配置JLINK的一些参数,比如连接速度和复位方式等。
根据实际需求,我们可以对这些参数进行相应的调整。
在调试过程中,我们可以使用IAR提供的各种调试工具来观察和分析程序的运行状态。
比如,我们可以使用"Watch"窗口来监视变量的值,或者使用"Memory"窗口来查看内存的内容等。
此外,我们还可以使用"Breakpoints"来设置断点,使程序在特定的位置停止执行,方便我们进行代码的调试和分析。
从实践中,我发现在使用JLINK调试STM32时,一些常见的问题可能会出现。
比如,由于硬件连接出错或者参数配置不当,导致与JLINK的连接失败。
此时,我们需要仔细检查硬件连接,并重新配置JLINK的参数。
另外,有时候程序可能会卡死或者出现异常,导致调试失败。
这时,我们可以使用IAR提供的复位工具来重新启动STM32芯片,然后重新开始调试。
第一步:文件准备
新建一个文件夹‘流水灯’用于存放工程
然后将固件库FWLIB中的library文件夹复制粘贴到你所建的工程文件夹中;
再将FWLIB中project文件夹中的main.c ,stm32f10x_conf.h ,stm32f10x_it.c ,stm32f10x_it.h 这四个文件复制粘贴到‘流水灯’中;
再将FWLIB\project\EWARMv5\中的四个镜像文件(后缀为icf)的文件复制粘贴到‘流水灯’中。
再将上述文件夹中的cortexm3_macro.s ,stm32f10x_vector.c 复制粘贴到你的工程文件夹中。
到此文件准备就基本完成。
第二步:新建IAR工程
启动IAR EWARM 5.40
点project----create New Project
选择Create New Project 后弹出一个如下窗口,在窗口中的下拉菜单中选择ARM ,在project templates 中选在Empty Project ,然后
点击OK.
点击OK后会弹出一个路径选择窗口,只需选择你所建的工程的路径,然后输入工程名即可,
点击保存,就可看到左边出现了你刚刚新建的工程
第三步 : 为工程添加分组及文件
在左边的工程名上点击右键,选择ADD ---ADD Group ,添加三个分组:EWARM , FWLIB , USER
将你所建工程中的main.c , stm32f10x_conf.h ,stm32f10x_it.c , stm32f10x_it.h这四个
文件添加到USER 分组中;
将cortexm3_macro.s , stm32f10x_vector.c 添加到EWARM分组中;
将library\src中相应的文件(初学者亦可全选)添加到FWLIB
中;
之后只需在main.c中进行修改,编写你所需的程序即可。
但此时有可能出现一种情况就是main.c无法修改,本人建议将原来main.c中的内容全部复制,然后在工程文件夹
中删除该main.c,然后新建一个文档,将其后缀改为.c然后将刚刚复制的内容粘贴到其中,最后再将其重新添加到USER分组中(应注意必须先Remove原先那个main.c)即可。
另一种方法是在IAR中新建,这里我就不罗嗦了。
第四步:工程的设置
选择Options 过程按照下面的图片设置即可
1、选择你的芯片Genaral Option中的Target选卡
2、C\C++ Compiler 中的language 选卡中
3、C\C++ Compiler 中的Optimizations 选卡中根据具体情况选择
4、C\C++ Compiler 中的Preprocessor选卡中
5、Linker中的config 选卡中
6、Linker中的config 选卡中
生成的.map文件可用来查看程序所占空间,及数据所占空间
7、在Debugger的Setup选卡中选择你所用的仿真器
8、在Download选卡中选中下面项
点击OK,设置结束。
接下来你便可编写自己的程序,然后compile,make了
第五步:流水灯程序的编写
注意:必须在main.c中加入如下申明
Main.c (所用管脚为PF0—PF7)红色部分为自己编写的程序,蓝色部分为本来main.c中的部分。
#include "stm32f10x_lib.h"
#include "stm32f10x_conf.h"
void delay(unsigned long uCOUNT) // The delay fuction
{
for(;uCOUNT!=0;uCOUNT--);
}
int main(void)
{
#ifdef DEBUG
debug();
#endif
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);//使能GPIOF的时钟
GPIO_InitStructure.GPIO_Pin=0x00ff;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //IO配置为输出口GPIO_Init(GPIOF,&GPIO_InitStructure);
GPIO_WriteBit(GPIOF,0X00FF,Bit_SET);
/* Infinite loop */
while (1)
{
GPIO_SetBits(GPIOF,GPIO_Pin_7);
GPIO_ResetBits(GPIOF,GPIO_Pin_0);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_0);
GPIO_ResetBits(GPIOF,GPIO_Pin_1);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_1);
GPIO_ResetBits(GPIOF,GPIO_Pin_2);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_2);
GPIO_ResetBits(GPIOF,GPIO_Pin_3);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_3);
GPIO_ResetBits(GPIOF,GPIO_Pin_4);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_4);
GPIO_ResetBits(GPIOF,GPIO_Pin_5);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_5);
GPIO_ResetBits(GPIOF,GPIO_Pin_6);
delay(1000000);
GPIO_SetBits(GPIOF,GPIO_Pin_6);
GPIO_ResetBits(GPIOF,GPIO_Pin_7);
delay(1000000);
}
}
#ifdef DEBUG
/******************************************************************** ***********
* Function Name : assert_failed
* Description : Reports the name of the source file and the source line number * where the assert_param error has occurred.
* Input : - file: pointer to the source file name
* - line: assert_param error line source number
* Output : None
* Return : None
********************************************************************* **********/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif。