2.3.4 IAR C语言程序设计 IAR开发环境中编写程序同样也包括包括工程建立、工程配置、工程编译和工程调试等多个阶段。 1.工程创建先创建一个workspace。选择“File->New>Workspace”创建一个新的工程。 选择“Project->Create New Project”,创建新工程的对话框,如图2-41所示。“Tool chain”默认是STM8 Series。在“Project templates”中选择“Empty project”,点击“OK”。 弹出Save As 对话框后,选择project保存的路径,并输入project 的名字。 图2-41 IAR创建Workspace 在Workspace 窗口中,显示信息如图2-42所示。有Debug 和 Release两个配置。默认配置为Debug。 图2-42 Debug配置 在添加文件到工程中之前,先保存workspace。选择”File->Save Workspace”, 指定要保存的路径,并输入workspace的名字。如图2-43所示。 图2-43 输入workspace名字 一个workspace 文件的扩展名是eww。此文件列出了添加到workspace 中的所有的project。相关当前会话信息,比如windows的保存路径和断点保存于projects\setttings目录下。 2.文件添加可选择“Project->Add Files” 选择要添加的C文件。找到相应MCU型号的头文件,拷贝到当前的工程目录中。默认地,头文件在IAR安装目录inc下,即“C:\Program Files\IAR Systems\Embedded Workbench 6.0 Kickstart\stm8\inc”。 本例中使用了iostm8s105s6.h文件 编写一个简单的C程序,源码如下: 源文件main.c /* Includes ------------------------------------*/ #include "iostm8s105s6.h" /* Global variables ---------------------------*/ unsigned int ms_count; void CLK_Configuration(void) { CLK_CKDIVR = 0x00; /* fCPU=fMASTER = 16MHz */ } void GPIO_Init(void) { PD_DDR |= 0x0D; /* Output. */ PD_CR1 |= 0x0D; /* PushPull. */ PD_CR2 = 0x00; /* Output speed up to 2MHz. */ } void TIM2_Init(void) { TIM2_PSCR = 0x00; /* Configure TIM2 prescaler =16. */ TIM2_ARRH = 0xC1; /* Configure TIM2 period. */ TIM2_ARRL = 0x7F; /* Configure TIM2 period. */ TIM2_CNTRH = 0xC1; TIM2_CNTRL = 0x7F; TIM2_CR1 |= 0x81; /* Enable TIM2. */ TIM2_IER |= 0x01; /* Enable TIM2 OVR interrupt. */ } main() { asm("sim"); /* disable interrupts */ ms_count = 0; CLK_Configuration(); GPIO_Init(); TIM2_Init(); asm("rim") ; /* enable interrupts */ while (1) { asm("nop"); asm("nop"); asm("nop"); //嵌入汇编语言 } } 声明一个中断向量,说明如下: #pragma vector=0x02 __interrupt void interrupt_handler(void) 说明: #pragma vector: 是IAR中断向量指令。 =0x02 : 其数字代表中断向量编号。STM8的地址是从0x00800开始,IAR的中断编号从0开始。中断向量号依次按照中断地址递增。如: 复位向量是0x008000,中断向量号是0x00 TRAP的中断地址是0x008004中断向量号是0x01 SPI中断号是0x0C;详见如图2-44所示。 __interrupt void interrupt_handler(void): 是声明一个中断函数,注意interrupt是两个下划线,interrupt_handler 是中断函数名字,可自己定义。 图2-44 中断地址分配图表 一个简单的中断函数stm8s105_interrupt.c 如下: /* Includes -----------------------------------*/ #include "iostm8s105s6.h" /* External variables ------------------------------*/ extern unsigned int ms_count; /* Defines an interrupt handler for TIM2_UPDATE vector. */ #pragma vector=15 __interrupt void TIM2_UPDATE_IRQHandler(void) { TIM2_SR1 &=~(0x01); ms_count++; if(ms_count == 500) /* 0.5秒中断 */ { PD_ODR ^= 0x01; ms_count = 0; } } |