STM8系列单片机程序移植方法

514 阅读4分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

  STM8单片机有很多系列,有时候在一款单片机上编写的程序,然后突然又换了单片机的型号,那么不同单片机之间的程序要如何互相移植呢?

  现在就用STM8S103F3单片机和STM8S103K3单片机程序相互移植。这里使用最简单的led灯例子来演示。

STM8S103F3单片机 代码如下:

#include "iostm8s103F3.h"
#include "main.h"
#include "led.h"
#include "delay.h"

void SysClkInit( void )
{
    CLK_SWR = 0xe1;                             //HSI为主时钟源  16MHz CPU时钟频率
    CLK_CKDIVR = 0x00;                          //CPU时钟0分频,系统时钟0分频
}
void main( void )
{
    __asm( "sim" );                             //禁止中断
    SysClkInit();
    delay_init( 16 );
    LED_GPIO_Init();
    __asm( "rim" );                             //开启中断
    while( 1 )
    {
      LED = !LED;
      delay_ms(100);
    }
}

#include "led.h"
//LED 初始化
void LED_GPIO_Init( void )
{
    PB_DDR |= ( 1 << 5 );        //PB5 输出 led
    PB_CR1 |= ( 1 << 5 );        
    PB_CR2 |= ( 1 << 5 );
}
#ifndef __LED_H
#define __LED_H
#include "iostm8s103F3.h"

#define  LED  PB_ODR_ODR5            //位定义 PB5定义为输出 LED
void LED_GPIO_Init( void );
#endif

代码很简单,就是初始化系统时钟,然后初始化LED用到的IO口。LED接的是PB5口。 原理图如下:

image.png

LED灯接的是PB5口,在主函数中每100ms对LED灯取一次反,也就是实现led灯的闪烁效果。

原理图和程序都很简单,现在要将这个LED灯闪烁的代码直接移植到STM8SF103K3系列的单片机上。

首先看STM8SF103K3单片机的原理图

image.png

STM8SF103K3单片机的IO口有32个,而STM8S103F3的IO口只有20个,也就是说STM8SF103K3单片机比STM8S103F3单片机多了12个IO口,其他功能并没有多多少,而这里使用的仅仅只是普通的IO功能,没有使用其他的特殊功能,所以移植起来很简单。直接修改头文件就行。

使用IAR打开LED工程 image.png 在工程名上单击鼠标右键,选择options

image.png

在左边的选项中选择 General Optins,然后在右边选择Target,将单片机型号从STM8S103F3改为STM8S103K3,然后点击OK按钮。

接下来在程序中将头文件也替换掉

image.png 将main.c文件中的头文件替换

image.png

将led.h中的头文件也替换掉

接下来还需要修改IO口,因为STM8S103F3单片机的LED灯是在PB5口连接,而STM8S103K3单片机的LED 灯是在PE5口连接着,所以需要修改IO口初始化的寄存器。

image.png

将LED端口初始化中的寄存器由PB改为PE

image.png

将宏定义中的寄存器也改为PE

这时候替换工作就全部完成了,编译下载程序,这时STM8S103K3单片机上的LED灯也开始闪烁了,说明程序移植成功。

其实 iostm8s103F3.h 和 iostm8s103k3.h 这两个头文件的内容是一模一样的,在电脑上打开 IAR软件存放的头文件的文件夹 我这里是 D:\Program Files (x86)\IAR Systems\Embedded Workbench 8.3\stm8\inc

image.png 可以看到这两个文件的大小是一样的,下面用内容对比软件,对比一下这两个文件的内容。

image.png

通过内容对比可以发现这两个文件的内容只有一个地方不一样,也就是最开始的宏定义不一样,而其他所有的地方都是一模一样的。也就是说这两个系列单片机的头文件用的是同一个。

对文件夹中的所有头文件对比观察可以发现所有的头文件都是从iostm8.h这个头文件中分离出来的,也就是说iostm8.h这个头文件包含了stm8系列单片机中所有的寄存器定义。

image.png

那么直接使用iostm8.h这个头文件行不行呢?将这两款单片机的头文件都换成iostm8.h测试

image.png 经过测试后发现,将头文件统一换成iostm8.h,两款单片机都可以正常工作。说明 iostm8.h 这个头文件 可以兼容所有系列的单片机,这样以后在编写stm8系列单片机的程序时,就可以直接使用iostm8.h这个头文件了。