patch1582 发表于 2025-1-12 10:21:52

程序从 8A8K64S4A12 移植到 8A8K64D4

在产品中应用到 8A8K64S4A12单片机具备多路PWM、多路ADC等功能,适合进行GPIO操作、ADC采样等多种实验。
咨询厂家建议使用更强大的 8A8K64D4 代替 8A8K64S4A12单片机。

将8A8K64S4A12的程序直接写入8A8K64D4,是不能跑起来的。
仔细对比两种芯片的手册,发现差别不大。对比例程,发现头文件的差别很大。
在产品的程序主要涉及串口通信、定时器和IO输入输出控制。下面一步一步来进行移植。

首先
替换所引用单片机对应型号的头文件
由#include    "AI8xxxx.h"替换为#include    "AI8A8K64D4.h"

其次
串口移植,以串口1为例进行说明
    #include "USART.h"替换为#include "STC8A_UART.h"
其中有些结构体的定义有区别,需要一一改正


另外,AI64S4A12与64D4的同名函数和宏定义修改如下
函数USART_Configuration();      改为   UART_Configuration();
端口的宏定义由USART1改为UART1
上图提识编译错误
NVIC_UART1_Init()在#include "STC8A_NVIC.h"中
UART1_SW()在#include "STC8A_Switch.h"中
需要调用这两个头文件,解决该问题。

再次
定时器的移植,以timer0为例
更换头文件将#include      "Timer.h"更换为#include      "AI8A_Timer.h"
重新编译会出错如下图

将函数中的中断使能和优先级更换为如下函数,解决编译错误
NVIC_Timer0_Init(ENABLE,Priority_0);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_

最后,就是冲映射端口,比如usart用到的端口。
voidGPIO_config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//结构定义
GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
GPIO_InitStructure.Mode = GPIO_PullUp;//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP

GPIO_Inilize(GPIO_P0,&GPIO_InitStructure);//初始化

}


到这里
我的产品用到的资源的移植就基本结束了
重新编译
成功,没有错误
下载到64D4中测试
运行正常,至此移植结束



xiaohaha 发表于 2025-1-13 10:52:38

是不是老刘示波器也可以?
页: [1]
查看完整版本: 程序从 8A8K64S4A12 移植到 8A8K64D4