APM/Air32F103/CH32F203/STM32F103程序互通说明

news2024/7/6 19:20:55

APM/Air32F103/CH32F203/STM32F103程序互通说明


✨感觉国内中低端芯片就像 春秋时期,各诸侯群雄纷争的局面。各厂商都推出相关的替代竞品方案。这对于嵌入式开发从业者来说,有更多的开发方案可选。同时开发者不得不面对不同方案,项目移植工作。

  • 🎉个人觉得同架构,同内核的芯片百花齐放百家争鸣是一件好事,任何产品方案都有可替代性,才不会被别人掐脖子和一家垄断独大的局面发生。同时保持产品差异化,面对不同应用场景和个性化需求方案。对于共有的功能外设应该建立统一的标准。
  • 🔖目前的局面,谁的资料越多越开放,学习的和使用的人就越多,反馈给上层芯片设计制造企业的信息也就越多,这就是一个循环的生态。不要把自己的产品资料搞的神神秘秘的,什么都不对外公布,让学习和使用的人望而却步,这种傲慢的厂商迟早都会被淘汰掉。

🚩 注意:这里只针对通用外设寄存器地址相同的程序的互换性,不包含差异化内容。

  • ⚡需要注意一点:APM/Air32F103/CH32F203/STM32F103各自的SDK工程中的有些个别寄存器定义的名称有个别的差异,大部分名称都是一样的。

⛳APM/Air32F103/CH32F203/STM32F103主频说明

  • 🌿Air32F103最高216MHz(最高256MHz)6;CH32F203最高144MHz,APM最高96MHz,在通用的主频下,通用外设部分基本通用,只选更换对应的芯片型号。
    在这里插入图片描述

APM/Air32F103//STM32F103转CH32F203程序

  • 🌿例如匹配CH32F203的96MHz或144MHz主频时,需要在定义主频的地方补充96MHz以及144MHz的相关宏定义和时钟初始化函数代码。
    • 📋以Air32F103为例,在system_air32f10x.c中添加如下代码:
  • 时钟初始化函数代码
#elif defined SYSCLK_FREQ_96MHz
/*********************************************************************
 * @fn      SetSysClockTo96_HSE
 *
 * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
 *
 * @return  none
 */
static void SetSysClockTo96(void)
{
    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
    RCC->CR |= ((uint32_t)RCC_CR_HSEON);


    /* Wait till HSE is ready and if Time out is reached exit */
    do
    {

        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
    }
    while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

    if((RCC->CR & RCC_CR_HSERDY) != RESET)
    {
        HSEStatus = (uint32_t)0x01;
    }
    else
    {
        HSEStatus = (uint32_t)0x00;
    }

    if(HSEStatus == (uint32_t)0x01)
    {

        /* HCLK = SYSCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

        /* PCLK2 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

        /* PCLK1 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


        /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8Mhz)
         *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8Mhz)
         *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 12 = 96 MHz(HSE=32Mhz)
         */
//        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE |
//                                    RCC_PLLMULL ) );
//        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12 );

        /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                            RCC_CFGR_PLLMULL));
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE | RCC_CFGR_PLLMULL12);

        /* Enable PLL */
        RCC->CR |= RCC_CR_PLLON;

        /* Wait till PLL is ready */
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }

        /* Select PLL as system clock source */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

        /* Wait till PLL is used as system clock source */
        while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
        {
        }
    }
    else
    {
        /*
         * If HSE fails to start-up, the application will have wrong clock
        * configuration. User can add here some code to deal with this error
         */
    }
}
#elif defined SYSCLK_FREQ_144MHz
/*********************************************************************
 * @fn      SetSysClockTo144_HSE
 *
 * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.
 *
 * @return  none
 */
static void SetSysClockTo144(void)
{
    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
    RCC->CR |= ((uint32_t)RCC_CR_HSEON);


    /* Wait till HSE is ready and if Time out is reached exit */
    do
    {

        HSEStatus = RCC->CR & RCC_CR_HSERDY;
        StartUpCounter++;
    }
    while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

    if((RCC->CR & RCC_CR_HSERDY) != RESET)
    {
        HSEStatus = (uint32_t)0x01;
    }
    else
    {
        HSEStatus = (uint32_t)0x00;
    }

    if(HSEStatus == (uint32_t)0x01)
    {

        /* HCLK = SYSCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

        /* PCLK2 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

        /* PCLK1 = HCLK */
        RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;


        /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8Mhz)
         *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8Mhz)
         *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 12 = 96 MHz(HSE=32Mhz)
         */
//        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE |
//                                    RCC_PLLMULL ) );
//        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12 );

        /*  PLL configuration: PLLCLK = HSE * 18 = 144 MHz */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                            RCC_CFGR_PLLMULL));
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE | RCC_CFGR_PLLMULL18);

        /* Enable PLL */
        RCC->CR |= RCC_CR_PLLON;

        /* Wait till PLL is ready */
        while((RCC->CR & RCC_CR_PLLRDY) == 0)
        {
        }

        /* Select PLL as system clock source */
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
        RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

        /* Wait till PLL is used as system clock source */
        while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
        {
        }
    }
    else
    {
        /*
         * If HSE fails to start-up, the application will have wrong clock
        * configuration. User can add here some code to deal with this error
         */
    }

}

🌿STM32F103转CH32F203也是一样。

  • 📌具体案例工程可以参考《【WCH】基于STM32标准库程序烧录到CH32F203中运行方法》
  • 🌿对于极海的APM32应该也是差不多,这个没有具体去使用SDK工程验证。

📓CH32F203转APM/Air32F103//STM32F103

  • 🌿反过来使用也就是调整对应的主频。
  • 🌿对于操作PC端口存在差异,具体看下面的内容。

🎯APM/Air32F103//STM32F103转CH32F203程序GPIO端口差异

  • 🎈可以参考相关篇《【WCH】基于Keil环境CH32F203 GPIO点灯实验》
  • 📗CH32F203芯片的PC端口上的引脚都需要右移13位才可以。其他端口引脚不需要,具体操作可以打开CH32F203查看相关SDK工程demo案例,也可以去翻阅上面的相关参考篇内容里做了使用说明。

⛳烧录工具差异

  • 🚩针对SWD下载的话,它们之间的烧录工具没有通用的统一的,都存在一定的差异。个别的可以相互直接烧录使用,没有一款通用的,网上有售卖兼容通用的烧录器,具体的没有购买测试过。
  • 🌿目前合宙AIR32F103CBT6的DAP-LIN固件(最新的V2版本支持)可以烧录自家的和STM32的,其他家的没有做具体的测试,但是不支持WCH的CH32F203的。
  • 🔖相关篇《合宙AIR32F103CBT6刷回CMSIS-DAP固件和DAP升级固件以及刷ST-LINK V2-1固件方法》
  • 🌿WCH的WCH-DAPLink(CH549G版本)值针对自家的使用,不兼容其他家的,其他家的也不支持他家的。烧录配置:
    在这里插入图片描述
  • 🍁不管是烧录到哪一家的同型号芯片里面,都需要配置各自的FLM文件。

📓程序烧录差异

  • 🔖具体各型号的烧录器支持情况,需要根据各自芯片厂商相关烧录资料说明。
  • ✨目前手上使用的芯片情况来看,APM的支持ST-LINKV2,但是不支持合宙的DAP-LINKV2。CH32只能用他们自家的DAP-LINK工具下载。STM32支持合宙的DAP-LINKV2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

724. 寻找数组的中心下标

力扣724. 寻找数组的中心下标 一、题目描述: 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和…

express + TS :解决 TypeScript 报错:“无法重新声明块范围变量”的问题

问题描述 使用 Express TS 开发项目,在两个不同的文件引入相同的依赖,红色波浪线 虽然程序可正常运行 其他问题 无法重新声明块范围变量函数实现重复标识符重复 问题原因 项目中使用 CommonJS 规范,进行模块间的导入导出操作 因为在 Co…

八、Python结合Qt实现点击按钮保存并生成自定义word详细讲解(相信我,耐心看完,一定会有收获的)

一、需求介绍 因为我的毕设需要设计一个系统,然后把结果生成检测报告供企业下载。模型大概已经训练好了,也就差个导出word功能,把模型识别的数据结果输入到word导出即可。 二、最终实现效果 这里随便整个模板来对所需要的函数进行说明&…

Linux常用命令——iperf命令

在线Linux命令查询工具 iperf 网络性能测试工具 补充说明 iperf命令是一个网络性能测试工具。iperf可以测试TCP和UDP带宽质量。iperf可以测量最大TCP带宽,具有多种参数和UDP特性。iperf可以报告带宽,延迟抖动和数据包丢失。利用iperf这一特性&#x…

怎样搭建游戏服务器,传奇复古版手游是怎样搭建的,用云服务器架设游戏技术详细教程

本教程以战神传奇复古修复装备版为例: 本教程资源提供:海盗空间 --------------------------------------------------------------------------------------------------- 系统:Windows Server 2012 R2 x64 -----------------------------…

Python - 优先队列(queue.PriorityQueue heapq)

目录 什么是优先队列 为什么需要优先队列? 优先队列是个啥? 优先队列的工作原理 Python实现一个优先队列 Python内置库中的queue.PriorityQueue的使用 基本操作 多条件优先级实现 Python内置库中的heapq heapq的常用操作 基于heapq实现一个优…

通过AI生成的视频分发了难以检测的恶意软件加载程序

安全研究人员警告说,一种新的恶意软件加载程序被用作 Aurora 信息窃取程序感染链的一部分。 加载程序使用反虚拟机 (VM) 和不寻常的编译技术,这些技术似乎使其非常成功地避免了安全解决方案的检测。 Aurora 信息窃取器是用 Go 编写的,作为恶…

高速下载Arxiv论文的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【微服务笔记19】微服务组件之Nacos注册中心基础环境搭建

这篇文章,主要介绍微服务组件之Nacos注册中心基础环境搭建。 目录 一、Nacos注册中心 1.1、Nacos注册中心 1.2、搭建NacosServer服务端 (1)下载Nacos Server服务端工程 (2)修改配置信息 (3&#xff0…

【Hello Network】网络编程套接字(三)

作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍下各种类型的Tcp协议 各种类型Tcp服务器 多进程版的TCP网络程序捕捉SIGCHLD信号让孙子进程执行任务 多线程TCP网络程序线程池版多线程TCP网络…

Elasticsearch学习,请先看这篇!

目录 一、初始elasticsearch 1、概述 简介 发展 2、倒排索引 3、基本概念 文档 索引 Mysql和es的区别 4、分词器 初始分词器 Ik分词器-扩展词库 二、索引库操作 1、mapper属性 2、创建索引库 3、查询、删除索引库 三、文档操作 1、新增文档 2、查询、删除文档…

计算机网络科普

文章目录 1、集线器2、CSMA/CD协议3、交换机3.1 交换机的桥接 4、 路由器5、 路由表6、IP地址7、MAC地址8、ARP协议9、关于网络层次模型10、路由器 1、集线器 计算机之间的相互通信,你会怎么设计? 如果是两台计算机,之间拉一条线,…

ClickHouse性能优化

目录 1 Explain查看执行计划优化sql1.1 基本语法1.2 案例实操1.2.1 查看 PLAIN1.2.2 AST 语法树1.2.3 SYNTAX 语法优化1.2.4 查看 PIPELINE 2 ClickHouse建表优化2.1 数据类型2.1.1 时间字段的类型2.1.2 空值存储类型 2.2 分区和索引2.3 表参数2.4 写入和删除优化2.5 常见配置2…

分享一些提升效率的小工具

1、 IObit Uninstaller IObit Uninstaller是一款简单专业的卸载工具,可以帮我们卸载电脑中顽固难卸的软件和浏览器插件,支持强制一键卸载和文件粉碎功能。 除了卸载软件,它还可以自动帮我们检测软件安装、检测软件更新、查看工具栏和插件。 …

IDEA22.3.3的三个常用经常遇到的配置问题

1、期待效果:【打开iDEA的时候,让开发者选择需要打开的项目】 设置如下 2、期待效果:配置默认的Maven,避免每次新建项目后,都需要去修改Maven配置 同理,修改默认的java版本和自己本地java环境一致 3、新建…

数据库SQL语句优化技巧

当今世界,数据量不断增长,数据库的使用变得越来越普遍。虽然数据库提供了很多强大的功能,但是它们也需要被优化以确保它们的性能得到最大化。在本篇博客中,我们将探讨SQL语句优化的几种技巧,这些技巧可以帮助您提高数据…

零、网络基础概述(TCP/IP模型、端口、网关、DNS、ARP、IP编址与子网划分、UDP、VRP)

文章目录 前言一、网络基础1、TCP/IP模型2、端口的作用:3、MAC 地址4、网关(gateway)5、域名解析服务(DNS)6、TCP端口、UDP端口区别:7、交换机与路由器 二、ARP 理论1、定义2、查看ARP缓存3、ARP 报文种类&…

Linux基础——远程访问及控制(SSH)

Linux基础——远程访问及控制 一、OpenSSH服务器二、sshd_config配置文件三、SSH服务端1.查询版本—— ssh -V2.SSH远程登录3.监听端口修改4.设置黑白名单5.远程复制——scp6.安全性传输——sftp 四、SSH服务的验证1.SSH服务的两种验证方式密码验证密钥验证 3.公钥与私钥的关系…

ORA-04021:等待锁定对象时发生超时

现场人员反馈问题,drop表报错,如下图 是个rac环境,处理过程 1、2个节点上查看锁表,没任何输出 SYSorcl2> select name from v$db_object_cache where ownerUSR_DATAI and type in(PROCEDURE,FUNCTION) and locks > 0 and …

软件版本号

版本号 上图是在MVN仓库中随便找的一个依赖的历 史版本 我们可以发现版本号一般是由 数字英文 组成 数字 一般大家都会看到1.x或者1.xx.xxx.Beta这种版本号,前面是数字 以 1.xx.xxx 为例 1是major号,一般重大更新会更新major号.xx或者.xx.xxx称为min…