欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IAR(For STM32) 安装,配置,工程创建,下载,调试

程序员文章站 2022-07-04 19:38:59
...

IAR Guide Manual

1 Install IAR

1.1 下载安装包

website:https://www.iar.com/iar-embedded-workbench/#!?architecture=Arm

1.2 安装

打开文件EWARM安装包,选择第一项进行安装:

IAR(For STM32) 安装,配置,工程创建,下载,调试

进入安装指导,选择NEXT,不要尝试改变语言,因为只有英语和日语两个选项,要汉化自行寻找汉化包和教程。

IAR(For STM32) 安装,配置,工程创建,下载,调试

勾选同意,点击NEXT:

IAR(For STM32) 安装,配置,工程创建,下载,调试

由于我们使用的吊事工具是ST-LINK/V2 所以选择安装ST-LINK驱动,由于J-Link也是比较常用的一个调试工具,因此都勾选上。如果觉得有必要U-Link也可以安装。

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择安装路径,这里直接默认安装路径。

IAR(For STM32) 安装,配置,工程创建,下载,调试

由于存在已经安装的USB Dongle驱动,会弹出下面窗口,不过不影响,直接确定。

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择Install,进行安装。

IAR(For STM32) 安装,配置,工程创建,下载,调试

安装中。。。。。。

IAR(For STM32) 安装,配置,工程创建,下载,调试

安装驱动中。。。。。。

IAR(For STM32) 安装,配置,工程创建,下载,调试

安装完成。看此教程的人理论上不需要看release notes了,不用勾选。点击Finish。

IAR(For STM32) 安装,配置,工程创建,下载,调试

继续安装被拦截的驱动等软件,选择安装即可。

IAR(For STM32) 安装,配置,工程创建,下载,调试

继续安装中。。。。。。

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择 I Agree。

IAR(For STM32) 安装,配置,工程创建,下载,调试

接下来会弹出的不少驱动安装窗口,操作如上进行即可。直至出现如下界面:

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择Exit,退出安装向导。

IAR(For STM32) 安装,配置,工程创建,下载,调试

IAR 自动打开。

IAR(For STM32) 安装,配置,工程创建,下载,调试

1.3证书安装

然后,证书安装向导弹出,若没有弹出,进入开始菜单,打开IAR License Manager。

此处进行一种非在线证书文件安装过程(安装需要在无网络环境下进行)。

选择第一个选项,填入***,选择先一步。

IAR(For STM32) 安装,配置,工程创建,下载,调试

弹出提示信息,选择是进行离线安装。

IAR(For STM32) 安装,配置,工程创建,下载,调试

保持原来的***,接下来选择第一项,点击下一步

IAR(For STM32) 安装,配置,工程创建,下载,调试

不用锁dongle,选择NO,点击下一步

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择一个路径用来保存**信息,该路径可以随意,但是要记住在哪儿,一会儿就要用。

IAR(For STM32) 安装,配置,工程创建,下载,调试

IAR(For STM32) 安装,配置,工程创建,下载,调试

利用**信息,请求**响应文件,点击Open file location 导入**响应文件,点击下一步。

IAR(For STM32) 安装,配置,工程创建,下载,调试

点击Finish,完成证书安装。

IAR(For STM32) 安装,配置,工程创建,下载,调试

2 Start an IAR project for STM32F103RB

2. 1 Create and config a sample project

首先打开软件,如下所示

IAR(For STM32) 安装,配置,工程创建,下载,调试

点击Project — > Create New Project

IAR(For STM32) 安装,配置,工程创建,下载,调试

如下,选择空白工程,点击OK。

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择工程文件位置。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后,为了使编程更加方便,以及使上个教程的代码可以重用,需要借助标准库文件和CMSIS核心,首先,将以下几个配置文件和主函数,在根目录下自建一个文件夹保存起来,如下,代码内容见教程尾部Appendix — > Example Code。其中stm32f10x_conf.h不在附录中,在标准库根文件夹下的的Project— > STM32F10x_StdPeriph_Template中可以找到。其实只要你自己的文件依赖关系都独立引入使用的库文件的头文件时,这个文件可以不要。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后复制标准库根文件夹下的Library到工程文件夹。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后将Custom文件夹和Library文件夹分组添加到工程中。如下点击Project弹出下拉菜单,也可以直接右击项目target进行添加。

IAR(For STM32) 安装,配置,工程创建,下载,调试

添加Custom Group。

IAR(For STM32) 安装,配置,工程创建,下载,调试

添加Custom文件夹下的文件,直接右击Custom文件夹,全选文件,直接打开。
IAR(For STM32) 安装,配置,工程创建,下载,调试

标准库文件夹添加比较复杂(如果自己要下载官方标准函数库访问https://my.st.com/content/ccc/resource/technical/software/firmware/48/ab/e5/17/0d/79/43/74/stsw-stm32054.zip/files/stsw-stm32054.zip/jcr:content/translations/en.stsw-stm32054.zip),首先添加STM32F10x_StdPeriph_Driver Group,添加Library /STM32F10x_StdPeriph_Driver/src 文件夹的所有文件。然后添加CMSIS Group,在其下再添加 startup Group,添加 \Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar 文件夹下的所有文件, 最后在CMSIS Group 添加文件system_stm32f10x.c ,在\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\文件夹下。
添加完毕如下:

IAR(For STM32) 安装,配置,工程创建,下载,调试

启动文件只需要一个startup_stm32f10x_md.s,其他的都右键 Option勾选如下选项,点击OK。实际上可以在添加文件时只添加我们要用的那个,因为这是一个模板工程,所以都添加了。

IAR(For STM32) 安装,配置,工程创建,下载,调试

其他同样操作后如下:

IAR(For STM32) 安装,配置,工程创建,下载,调试

这里需要说明一下,此工程中的startup_stm32f10x_md.s是经过修改的,若不修改,在该版本的IAR中编译后会出现大量警告。修改内容是将原来的SECTION .text:CODE:REORDER(1)改为SECTION .text:CODE:REORDER:NOROOT(1)。文件算是添加完了。

点击Project(或右击 template-Debug)选择Option,进入选项设置。点击左边的 General Options,再点击右边上部的Target,点击标记的按钮,选择ST— >STM32F1— > STM32F103— >STM32F103RB。

IAR(For STM32) 安装,配置,工程创建,下载,调试

点击右边上部Library Configuration,勾选标记的选项。由于使用的IAR自带的CMSIS core,因此标准库文件夹的Libraries\CMSIS\CM3\CoreSupport 文件不再使用,也不要将该路径加入预编译头文件包含路径。

IAR(For STM32) 安装,配置,工程创建,下载,调试

点击左边 C/C++ Compiler, 点击右边上部 Preprocessor ,首先添加头文件路径,四个文件路径如下所示,如果嫌自己写的头文件麻烦的话,可以将Custom文件夹也添加进去,注意箭头提示的下三角,点击该下三角可以调整浏览选择的路径为绝对或相对路径。

IAR(For STM32) 安装,配置,工程创建,下载,调试

继续添加宏定义,如下所示

IAR(For STM32) 安装,配置,工程创建,下载,调试

再点击左边的Debugger,点击右边上部的Setup,选择调试工具ST-LINK,我们使用的就是该工具。继而点击右边上部的Download,勾选 Verify download。

IAR(For STM32) 安装,配置,工程创建,下载,调试

继续,点击左边的ST-LINK,点击右边的Setup,在Interface 选项下勾选SWD。

IAR(For STM32) 安装,配置,工程创建,下载,调试

最后选择Project,点击Rebuild All。

IAR(For STM32) 安装,配置,工程创建,下载,调试

若出现如下提示框所示内容,则说明前面的步骤都没有错。可以进行程序下载了。

IAR(For STM32) 安装,配置,工程创建,下载,调试

接下来,点击Project — > Download — > Download active application ,进行下载。

IAR(For STM32) 安装,配置,工程创建,下载,调试

下载完毕出现如下所示信息,由于该下载直接将程序下载进入Flash,且没有软件重启,所以需要手动重启生效。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后就可以观察到想要的结果了。

2.2 Create the sample project with CMSIS-Pack

为什么要使用CMSIS-Pack 工具?

首先,从上面的配置可以看出,配置过程比较麻烦,除此之外,还需要手动下载标准库文件。其次,包依赖方便,标准库文件有一大部分在正常工程中可能是不需要的,但是难以理清其间的依赖关系。使用该工具可以自动检测依赖,可以直接看出去掉某个库文件后影不影响工程。最后,也是最重要的,使用工具后支持包更加丰富,可以省去很多工作,另外,可以直接导入嵌入式实时操作系统RTOS。

IAR 其实也可以使用keil CMSIS-Pack,但是在作者测试过程中,建立工程中仍存在一些bug,接下来使用步骤。

首先,点击图示的按钮。

IAR(For STM32) 安装,配置,工程创建,下载,调试

接下来,要求新建工作空间WorkSpace, 建在一个自己要创建工程的地方。
IAR(For STM32) 安装,配置,工程创建,下载,调试

接下来,正式进入包管理界面。首先将我们需要的ARM. CMSIS进行安装。

IAR(For STM32) 安装,配置,工程创建,下载,调试

再安装我们需要的Keil.STM32F1xx_DFP。

IAR(For STM32) 安装,配置,工程创建,下载,调试

不要关闭该界面,回到IAR主界面,然后新建一个工程。

IAR(For STM32) 安装,配置,工程创建,下载,调试

选择Empty CMSISPack project,然后保存工程,记住这个位置要在WorkSpace目录下新建一个目录,不能和WorkSpace同目录。这里再提一句,CMSISPack工程一定要建在CMSISPack WorkSpace下,若从新建CMSISPack工程开始,则在建工程的同时自动先添加WorkSpace,若从新建工作空间开始,不要先点击新建WorkSpace要先****点击CMSISPack Manager,进入前自动先建CMSISPack WorkSpace。然后不要关闭CMSISPack Manager,新建Empty CMSISPack project。

IAR(For STM32) 安装,配置,工程创建,下载,调试

点击保存后会弹出(若没有马上弹出要稍等一会儿)Select Device。作者这里使用了STM32F103RB的开发板,故选择该设备。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后开始配置Option,首先 General Options,点击Taget选择Device,按箭头提示按钮选择ST STM32F103RB。重要提示,一定是Device,不要选第三个 CMSIS-Pack。

IAR(For STM32) 安装,配置,工程创建,下载,调试

为了使用printf函数,需要勾选如下所示的提示框。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后调试工具配置同上

IAR(For STM32) 安装,配置,工程创建,下载,调试
IAR(For STM32) 安装,配置,工程创建,下载,调试IAR(For STM32) 安装,配置,工程创建,下载,调试

然后将我们需要的库文件添加进去。这里必须要添加的有CMSIS的CORE,以及根据依赖我们必需的STDPeripheral Driver库文件。这里的Startup实际上是没有实际内容的,可以不用添加。这里可能是个bug,之后我们还需要添加startup文件。

IAR(For STM32) 安装,配置,工程创建,下载,调试

添加之后如下所示。

IAR(For STM32) 安装,配置,工程创建,下载,调试

然后添加我们自己的文件进去,同上

IAR(For STM32) 安装,配置,工程创建,下载,调试

IAR(For STM32) 安装,配置,工程创建,下载,调试

IAR(For STM32) 安装,配置,工程创建,下载,调试

同样的方式,添加启动文件(汇编)。直接从上文中提到的库中粘贴过来。

IAR(For STM32) 安装,配置,工程创建,下载,调试

接着同上文一样,重建,下载,调试即可。

IAR(For STM32) 安装,配置,工程创建,下载,调试

3 Debug

如下图标记所示,两个按钮是进入调试的按钮,点击左边的按钮会先将程序下载入flash,然后运行调试。右边的不会下载,调试完断电重启之后,程序会被原来的程序覆盖。需要说明的是flash是有写入寿命的,少则100,多则10k,一般可以使用右边的按钮来调试。

IAR(For STM32) 安装,配置,工程创建,下载,调试

进入调试模式后,可以进行断点调试,单步调试等,同时显示汇编,也可以观察STM32F103的寄存器,RAM的值。比较明显的是,IAR调试功能不及keil强大。

IAR(For STM32) 安装,配置,工程创建,下载,调试

Appendix

Example Code

  1. Filename: main.c
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "delay.h"
#include "gpio_conf.h"
#include "usart_conf.h"
#include "misc.h"
#include <stdio.h>

#define LED_PORT  GPIOB
#define LED0_PIN  GPIO_Pin_0
#define LED1_PIN  GPIO_Pin_1

//#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) 
void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
//中断分组1:1位抢占优先级,3位响应优先级
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
    NVIC_Init(&NVIC_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);      
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
}
int main(void){
    int i = 0;
    GPIO_Conf(LED_PORT,LED0_PIN|LED1_PIN);
    USART1_Init();
    USART2_Init();
    NVIC_Config();
    while(1){
    GPIO_SetBits(LED_PORT, LED0_PIN);
    GPIO_ResetBits(LED_PORT, LED1_PIN);
    delay(20);
    GPIO_SetBits(LED_PORT, LED1_PIN);
    GPIO_ResetBits(LED_PORT, LED0_PIN);
    delay(100);
    i = USART1_RecNum();
    while(i--){USART2_SendChar(USART1_ReadByte());}
    i = USART2_RecNum();
    while(i--){USART1_SendChar(USART2_ReadByte());}
    //printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
    //USART1_SendChar('B');
    }
}
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t 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
  1. Filename: delay.c
#include "delay.h"
void delay(vu32 nCount)
{
  vu32 index = 0; 
  for(index = (34000 * nCount); index != 0; index--)
  {
  }
}
  1. Filename: delay.h
#ifndef __DELAY_H
#define __DELAY_H

#include "stm32f10x.h"

void delay(vu32 nCount);

#endif /* __DELAY_H */
  1. Filename: gpio_conf.c
#include "gpio_conf.h"

#define ID_GPIOA (uint32_t)GPIOA-APB2PERIPH_BASE
#define ID_GPIOB (uint32_t)GPIOB-APB2PERIPH_BASE
#define ID_GPIOC (uint32_t)GPIOC-APB2PERIPH_BASE
#define ID_GPIOD (uint32_t)GPIOD-APB2PERIPH_BASE
#define ID_GPIOE (uint32_t)GPIOE-APB2PERIPH_BASE
#define ID_GPIOF (uint32_t)GPIOF-APB2PERIPH_BASE
#define ID_GPIOG (uint32_t)GPIOG-APB2PERIPH_BASE

void GPIO_Conf(GPIO_TypeDef * port,uint16_t pin){
    GPIO_InitTypeDef  GPIO_InitStructure;
    uint32_t GPIO_CLK = RCC_APB2Periph_GPIOB;
  /* Enable the GPIO Clock */
    switch((uint32_t)port-APB2PERIPH_BASE){
        case ID_GPIOA:GPIO_CLK = RCC_APB2Periph_GPIOA;break;
        case ID_GPIOB:GPIO_CLK = RCC_APB2Periph_GPIOB;break;
        case ID_GPIOC:GPIO_CLK = RCC_APB2Periph_GPIOC;break;
        case ID_GPIOD:GPIO_CLK = RCC_APB2Periph_GPIOD;break;
        case ID_GPIOE:GPIO_CLK = RCC_APB2Periph_GPIOE;break;
        case ID_GPIOF:GPIO_CLK = RCC_APB2Periph_GPIOF;break;
        case ID_GPIOG:GPIO_CLK = RCC_APB2Periph_GPIOG;break;
        default: break;
    }   
  RCC_APB2PeriphClockCmd(GPIO_CLK, ENABLE);
  /* Configure the GPIO pin */
  GPIO_InitStructure.GPIO_Pin = pin;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}
  1. Filename: gpio_conf.h
#ifndef __GPIO_CONF_H
#define __GPIO_CONF_H

#include "stm32f10x.h"

void GPIO_Conf(GPIO_TypeDef * port,uint16_t pin);

#endif /*__GPIO_CONF_H*/
  1. Filename: usart_conf.c
#include "usart_conf.h"

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

char RxUBuf1[RXBUF1_MAX];   
static uint8_t Num_U1RxByte = 0;    
static uint8_t U1RxF = 0;
static uint8_t U1RxL = 0;
    
char RxUBuf2[RXBUF2_MAX];   
static uint8_t Num_U2RxByte = 0;    
static uint8_t U2RxF = 0;
static uint8_t U2RxL = 0;
    
    struct __FILE
{
    int a;
};
 
FILE __stdout;
void _sys_exit(int x)
{   
}

void USART1_Init(void){
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(USART1_GPIO_CLK, ENABLE);
  /* Configure USART Tx as alternate function push-pull */
  //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = USART1_TX;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = USART1_RX;
  GPIO_Init(USART1_GPIO, &GPIO_InitStructure);
      /* Enable UART clock */
  RCC_APB2PeriphClockCmd(USART1_PORT_CLK, ENABLE); 
    USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    /* USART configuration */
  USART_Init(USART1, &USART_InitStructure); 
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                          //开启接收中断
    //USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);        
  /* Enable USART */
  USART_Cmd(USART1, ENABLE);
}

void USART2_Init(void){
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIO clock */
  RCC_APB2PeriphClockCmd(USART2_GPIO_CLK, ENABLE);
  /* Configure USART Tx as alternate function push-pull */
  //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin = USART2_TX;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(USART2_GPIO, &GPIO_InitStructure);
  /* Configure USART Rx as input floating */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = USART2_RX;
  GPIO_Init(USART2_GPIO, &GPIO_InitStructure);
      /* Enable UART clock */
  RCC_APB1PeriphClockCmd(USART2_PORT_CLK, ENABLE); 
    USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    /* USART configuration */
  USART_Init(USART2, &USART_InitStructure); 
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                          //开启接收中断
    //USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);        
  /* Enable USART */
  USART_Cmd(USART2, ENABLE);
}
char USART1_ReadByte(void){
    if(Num_U1RxByte == 0) return '\0';  
    Num_U1RxByte--;
    return RxUBuf1[U1RxF++];
}
uint8_t USART1_RecNum(void){
        return Num_U1RxByte;
}
char USART1_SendChar(char ch){
      USART_SendData(USART1, (uint8_t) ch);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}
  return ch;
}

void USART1_IRQHandler(void){
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
//判断是否为接收中断
    {
        RxUBuf1[U1RxL++] = USART_ReceiveData(USART1);                 
//读取接收到的字节数据
        if(Num_U1RxByte < 255)Num_U1RxByte++;
        else{
            U1RxF++; //当buffer满了丢弃最先收到的1个数据
        }
    }
}

char USART2_ReadByte(void){
    if(Num_U2RxByte == 0) return '\0';  
    Num_U2RxByte--;
    return RxUBuf2[U2RxF++];
}
uint8_t USART2_RecNum(void){
        return Num_U2RxByte;
}
char USART2_SendChar(char ch){
      USART_SendData(USART2, (uint8_t) ch);
  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
  {}
  return ch;
}

void USART2_IRQHandler(void){
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)       //判断是否为接收中断
    {
        RxUBuf2[U2RxL++] = USART_ReceiveData(USART2);                 //读取接收到的字节数据
        if(Num_U2RxByte < 255)Num_U2RxByte++;
        else{
            U2RxF++; //当buffer满了丢弃最先收到的1个数据
        }
    }
}

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART1, (uint8_t) ch);

  /* Loop until the end of transmission */
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}
  1. Filename: uasrt_conf.h
#ifndef __USART_CONF_H
#define __USART_CONF_H

#include "stm32f10x.h"

#include <stdio.h>

//USART1  -->USART1_IRQn
#define USART1_GPIO             GPIOA
#define USART1_TX               GPIO_Pin_9
#define USART1_RX               GPIO_Pin_10
#define USART1_GPIO_CLK      	   RCC_APB2Periph_GPIOA
#define USART1_PORT_CLK     	   RCC_APB2Periph_USART1
#define RXBUF1_MAX 256//定义为256时,uint8_t不用判断是否溢出,自动从0开始

//USART2  -->USART2_IRQn
#define USART2_GPIO             GPIOA
#define USART2_TX               GPIO_Pin_2
#define USART2_RX               GPIO_Pin_3
#define USART2_GPIO_CLK     	   RCC_APB2Periph_GPIOA
#define USART2_PORT_CLK     	   RCC_APB1Periph_USART2
#define RXBUF2_MAX 256 

void USART1_Init(void);
char USART1_SendChar(char ch);
uint8_t USART1_RecNum(void);
char USART1_ReadByte(void);

void USART2_Init(void);
char USART2_SendChar(char ch);
uint8_t USART2_RecNum(void);
char USART2_ReadByte(void);

#endif /*__USART_CONF_H*/
  1. Filename: startup_stm32f10x_md.s
    Note: 为了支持新的IAR版本而修改的启动文件。
;******************** (C) COPYRIGHT 2011 STMicroelectronics ********************
;* File Name          : startup_stm32f10x_md.s
;* Author             : MCD Application Team
;* Version            : V3.5.0
;* Date               : 11-March-2011
;* Description        : STM32F10x Medium Density Devices vector table for 
;*                      EWARM toolchain.
;*                      This module performs:
;*                      - Set the initial SP
;*                      - Configure the clock system
;*                      - Set the initial PC == __iar_program_start,
;*                      - Set the vector table entries with the exceptions ISR 
;*                        address.
;*                      After Reset the Cortex-M3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;********************************************************************************
;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
;* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
;*******************************************************************************
;
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;

        MODULE  ?cstartup

        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)

        SECTION .intvec:CODE:NOROOT(2)

        EXTERN  __iar_program_start
        EXTERN  SystemInit        
        PUBLIC  __vector_table

        DATA
__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler             ; Reset Handler
        DCD     NMI_Handler               ; NMI Handler
        DCD     HardFault_Handler         ; Hard Fault Handler
        DCD     MemManage_Handler         ; MPU Fault Handler
        DCD     BusFault_Handler          ; Bus Fault Handler
        DCD     UsageFault_Handler        ; Usage Fault Handler
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     SVC_Handler               ; SVCall Handler
        DCD     DebugMon_Handler          ; Debug Monitor Handler
        DCD     0                         ; Reserved
        DCD     PendSV_Handler            ; PendSV Handler
        DCD     SysTick_Handler           ; SysTick Handler

         ; External Interrupts
        DCD     WWDG_IRQHandler           ; Window Watchdog
        DCD     PVD_IRQHandler            ; PVD through EXTI Line detect
        DCD     TAMPER_IRQHandler         ; Tamper
        DCD     RTC_IRQHandler            ; RTC
        DCD     FLASH_IRQHandler          ; Flash
        DCD     RCC_IRQHandler            ; RCC
        DCD     EXTI0_IRQHandler          ; EXTI Line 0
        DCD     EXTI1_IRQHandler          ; EXTI Line 1
        DCD     EXTI2_IRQHandler          ; EXTI Line 2
        DCD     EXTI3_IRQHandler          ; EXTI Line 3
        DCD     EXTI4_IRQHandler          ; EXTI Line 4
        DCD     DMA1_Channel1_IRQHandler  ; DMA1 Channel 1
        DCD     DMA1_Channel2_IRQHandler  ; DMA1 Channel 2
        DCD     DMA1_Channel3_IRQHandler  ; DMA1 Channel 3
        DCD     DMA1_Channel4_IRQHandler  ; DMA1 Channel 4
        DCD     DMA1_Channel5_IRQHandler  ; DMA1 Channel 5
        DCD     DMA1_Channel6_IRQHandler  ; DMA1 Channel 6
        DCD     DMA1_Channel7_IRQHandler  ; DMA1 Channel 7
        DCD     ADC1_2_IRQHandler         ; ADC1 & ADC2
        DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
        DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
        DCD     CAN1_RX1_IRQHandler       ; CAN1 RX1
        DCD     CAN1_SCE_IRQHandler       ; CAN1 SCE
        DCD     EXTI9_5_IRQHandler        ; EXTI Line 9..5
        DCD     TIM1_BRK_IRQHandler       ; TIM1 Break
        DCD     TIM1_UP_IRQHandler        ; TIM1 Update
        DCD     TIM1_TRG_COM_IRQHandler   ; TIM1 Trigger and Commutation
        DCD     TIM1_CC_IRQHandler        ; TIM1 Capture Compare
        DCD     TIM2_IRQHandler           ; TIM2
        DCD     TIM3_IRQHandler           ; TIM3
        DCD     TIM4_IRQHandler           ; TIM4
        DCD     I2C1_EV_IRQHandler        ; I2C1 Event
        DCD     I2C1_ER_IRQHandler        ; I2C1 Error
        DCD     I2C2_EV_IRQHandler        ; I2C2 Event
        DCD     I2C2_ER_IRQHandler        ; I2C2 Error
        DCD     SPI1_IRQHandler           ; SPI1
        DCD     SPI2_IRQHandler           ; SPI2
        DCD     USART1_IRQHandler         ; USART1
        DCD     USART2_IRQHandler         ; USART2
        DCD     USART3_IRQHandler         ; USART3
        DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10
        DCD     RTCAlarm_IRQHandler       ; RTC Alarm through EXTI Line
        DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
        THUMB

        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)  
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0
        
        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
NMI_Handler
        B NMI_Handler

        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
HardFault_Handler
        B HardFault_Handler

        PUBWEAK MemManage_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
MemManage_Handler
        B MemManage_Handler

        PUBWEAK BusFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
BusFault_Handler
        B BusFault_Handler

        PUBWEAK UsageFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
UsageFault_Handler
        B UsageFault_Handler

        PUBWEAK SVC_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
SVC_Handler
        B SVC_Handler

        PUBWEAK DebugMon_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DebugMon_Handler
        B DebugMon_Handler

        PUBWEAK PendSV_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
PendSV_Handler
        B PendSV_Handler

        PUBWEAK SysTick_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)  
SysTick_Handler
        B SysTick_Handler

        PUBWEAK WWDG_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
WWDG_IRQHandler
        B WWDG_IRQHandler

        PUBWEAK PVD_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
PVD_IRQHandler
        B PVD_IRQHandler

        PUBWEAK TAMPER_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TAMPER_IRQHandler
        B TAMPER_IRQHandler

        PUBWEAK RTC_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
RTC_IRQHandler
        B RTC_IRQHandler

        PUBWEAK FLASH_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
FLASH_IRQHandler
        B FLASH_IRQHandler

        PUBWEAK RCC_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
RCC_IRQHandler
        B RCC_IRQHandler

        PUBWEAK EXTI0_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI0_IRQHandler
        B EXTI0_IRQHandler

        PUBWEAK EXTI1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI1_IRQHandler
        B EXTI1_IRQHandler

        PUBWEAK EXTI2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI2_IRQHandler
        B EXTI2_IRQHandler

        PUBWEAK EXTI3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI3_IRQHandler
        B EXTI3_IRQHandler

        PUBWEAK EXTI4_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI4_IRQHandler
        B EXTI4_IRQHandler

        PUBWEAK DMA1_Channel1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel1_IRQHandler
        B DMA1_Channel1_IRQHandler

        PUBWEAK DMA1_Channel2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel2_IRQHandler
        B DMA1_Channel2_IRQHandler

        PUBWEAK DMA1_Channel3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel3_IRQHandler
        B DMA1_Channel3_IRQHandler

        PUBWEAK DMA1_Channel4_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel4_IRQHandler
        B DMA1_Channel4_IRQHandler

        PUBWEAK DMA1_Channel5_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel5_IRQHandler
        B DMA1_Channel5_IRQHandler

        PUBWEAK DMA1_Channel6_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel6_IRQHandler
        B DMA1_Channel6_IRQHandler

        PUBWEAK DMA1_Channel7_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
DMA1_Channel7_IRQHandler
        B DMA1_Channel7_IRQHandler

        PUBWEAK ADC1_2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
ADC1_2_IRQHandler
        B ADC1_2_IRQHandler

        PUBWEAK USB_HP_CAN1_TX_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
USB_HP_CAN1_TX_IRQHandler
        B USB_HP_CAN1_TX_IRQHandler

        PUBWEAK USB_LP_CAN1_RX0_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
USB_LP_CAN1_RX0_IRQHandler
        B USB_LP_CAN1_RX0_IRQHandler

        PUBWEAK CAN1_RX1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
CAN1_RX1_IRQHandler
        B CAN1_RX1_IRQHandler

        PUBWEAK CAN1_SCE_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
CAN1_SCE_IRQHandler
        B CAN1_SCE_IRQHandler

        PUBWEAK EXTI9_5_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI9_5_IRQHandler
        B EXTI9_5_IRQHandler

        PUBWEAK TIM1_BRK_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM1_BRK_IRQHandler
        B TIM1_BRK_IRQHandler

        PUBWEAK TIM1_UP_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM1_UP_IRQHandler
        B TIM1_UP_IRQHandler

        PUBWEAK TIM1_TRG_COM_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM1_TRG_COM_IRQHandler
        B TIM1_TRG_COM_IRQHandler

        PUBWEAK TIM1_CC_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM1_CC_IRQHandler
        B TIM1_CC_IRQHandler

        PUBWEAK TIM2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM2_IRQHandler
        B TIM2_IRQHandler

        PUBWEAK TIM3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM3_IRQHandler
        B TIM3_IRQHandler

        PUBWEAK TIM4_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
TIM4_IRQHandler
        B TIM4_IRQHandler

        PUBWEAK I2C1_EV_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
I2C1_EV_IRQHandler
        B I2C1_EV_IRQHandler

        PUBWEAK I2C1_ER_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
I2C1_ER_IRQHandler
        B I2C1_ER_IRQHandler

        PUBWEAK I2C2_EV_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
I2C2_EV_IRQHandler
        B I2C2_EV_IRQHandler

        PUBWEAK I2C2_ER_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
I2C2_ER_IRQHandler
        B I2C2_ER_IRQHandler

        PUBWEAK SPI1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
SPI1_IRQHandler
        B SPI1_IRQHandler

        PUBWEAK SPI2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
SPI2_IRQHandler
        B SPI2_IRQHandler

        PUBWEAK USART1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
USART1_IRQHandler
        B USART1_IRQHandler

        PUBWEAK USART2_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
USART2_IRQHandler
        B USART2_IRQHandler

        PUBWEAK USART3_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
USART3_IRQHandler
        B USART3_IRQHandler

        PUBWEAK EXTI15_10_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
EXTI15_10_IRQHandler
        B EXTI15_10_IRQHandler

        PUBWEAK RTCAlarm_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
RTCAlarm_IRQHandler
        B RTCAlarm_IRQHandler

        PUBWEAK USBWakeUp_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)  
USBWakeUp_IRQHandler
        B USBWakeUp_IRQHandler

        END
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/