让Pegasus天马座开发板吃上STM8S标准库

2023-09-19 12:43:15

WeCanStudio官方仓库的示例工程,只提供基于STM8S003寄存器方式来开发Pegasus天马座开发板。在此,我将基于官方的工程示例,将STM8S标准库移植到工程中。

先上图,看运行结果:

 main.c文件

#include "config.h"
#include "delay.h"

#define LED_GPIO_PORT       GPIOD
#define LED_PIN  			GPIO_PIN_4

#define BUTTON_GPIO_PORT    GPIOD
#define BUTTON_PIN  		GPIO_PIN_3

uint32_t count = 0;
#define TIM4_PERIOD       124

void tim4_isr() __interrupt(ITC_IRQ_TIM4_OVF)
{
    static uint16_t ctr = 0;
    if (++ctr >= 100) {
		count++;
        ctr = 0;
    }
    /* Cleat Interrupt Pending bit */
    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);    
}

static void set_timer()
{
    /* Time base configuration */
    TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
    /* Clear TIM4 update flag */
    TIM4_ClearFlag(TIM4_FLAG_UPDATE);
    /* Enable update interrupt */
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
    
    /* enable interrupts */
    enableInterrupts();

    /* Enable TIM4 */
    TIM4_Cmd(ENABLE);
}

static void init_gpio()
{
    GPIO_Init(GPIOA, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);    
    //防止I2C PB4/PB5引脚被配置
    GPIO_Init(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_7, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(GPIOC, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);    
    GPIO_Init(GPIOD, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);
    GPIO_Init(BUTTON_GPIO_PORT, BUTTON_PIN, GPIO_MODE_IN_PU_NO_IT);    
}

void main(void)
{
	static uint8_t testBuffer[32] = {0};
	static uint8_t k = 0;
    bool ioLevel = FALSE;
	disable_interrupts();
	for (uint16_t i = 0; i < sizeof(testBuffer); i++)
	{
		testBuffer[i] = i;
	}
	enable_interrupts();
	LOG("Startup...\r\n");
	DUMP(testBuffer,sizeof(testBuffer));
	init_gpio();
	set_timer();
    while (1)
    {      
        if (ioLevel)
        {
            GPIO_WriteHigh(GPIOA,GPIO_PIN_ALL);
            GPIO_WriteHigh(GPIOB,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_7);
            GPIO_WriteHigh(GPIOC,GPIO_PIN_ALL);
            GPIO_WriteHigh(GPIOD,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
        }
        else
        {
            GPIO_WriteLow(GPIOA,GPIO_PIN_ALL);
            GPIO_WriteLow(GPIOB,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_6 | GPIO_PIN_7);
            GPIO_WriteLow(GPIOC,GPIO_PIN_ALL);
            GPIO_WriteLow(GPIOD,GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);            
        }
        ioLevel = !ioLevel;        
        //GPIO_WriteReverse(LED_GPIO_PORT,LED_PIN);
        LOG("<STM8S STD LIB> app_sdcc == %u -- %lu, key %s\r\n",k++,count, GPIO_ReadInputPin(BUTTON_GPIO_PORT,BUTTON_PIN) == RESET ? "down" : "up");	
		delay(100);
    }
} 


#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) */
  LOG("Wrong parameters value: file %s on line %d\r\n", file, line);	

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

移植步骤

一、标准库下载

由于ST官方默认的标准库是没有支持SDCC编译器的,所以需要对标准库代码进行修改,增加相关代码。关于ST标准库改成支持SDCC编译器对方法,网上有教程在此不做介绍。有兴趣的小伙伴可以在网上找到相关教程,进行修改。

此次使用的STM8S库文件来自WeCanStudio团队修改的版本,其云盘的下载地址见以下链接。

Pegasus天马座开发板 开发资料下载

二、工程代码结构

我将标准库的源代码及头文件及添加STM8S标准库所需要文件,按照以下方式组织存放

.
├── LICENSE
├── README.md
├── app
│   ├── config.h
│   ├── main.c
│   └── stm8s_conf.h
├── base
│   ├── define.h
│   ├── delay.c
│   ├── delay.h
│   ├── logger.c
│   └── logger.h
├── build
│   ├── app.bin
│   ├── app.hex
│   ├── app.ihx
│   ├── app.lk
│   └── app.map
├── doc
│   ├── build.png
│   ├── download.png
│   ├── open_terminal.png
│   ├── rebuild.png
│   └── sdcc_path.png
├── flash.lua
├── include
│   ├── stm8.h
│   └── stm8s.h
├── third_party
│   └── STM8S_StdPeriph_Driver
│       ├── inc
│       │   ├── stm8s.h
│       │   ├── stm8s_adc1.h
│       │   ├── stm8s_adc2.h
│       │   ├── stm8s_awu.h
│       │   ├── stm8s_beep.h
│       │   ├── stm8s_can.h
│       │   ├── stm8s_clk.h
│       │   ├── stm8s_exti.h
│       │   ├── stm8s_flash.h
│       │   ├── stm8s_gpio.h
│       │   ├── stm8s_i2c.h
│       │   ├── stm8s_itc.h
│       │   ├── stm8s_iwdg.h
│       │   ├── stm8s_rst.h
│       │   ├── stm8s_spi.h
│       │   ├── stm8s_tim1.h
│       │   ├── stm8s_tim2.h
│       │   ├── stm8s_tim3.h
│       │   ├── stm8s_tim4.h
│       │   ├── stm8s_tim5.h
│       │   ├── stm8s_tim6.h
│       │   ├── stm8s_uart1.h
│       │   ├── stm8s_uart2.h
│       │   ├── stm8s_uart3.h
│       │   ├── stm8s_uart4.h
│       │   └── stm8s_wwdg.h
│       └── src
│           ├── stm8s_adc1.c
│           ├── stm8s_adc2.c
│           ├── stm8s_awu.c
│           ├── stm8s_beep.c
│           ├── stm8s_can.c
│           ├── stm8s_clk.c
│           ├── stm8s_exti.c
│           ├── stm8s_flash.c
│           ├── stm8s_gpio.c
│           ├── stm8s_i2c.c
│           ├── stm8s_itc.c
│           ├── stm8s_iwdg.c
│           ├── stm8s_rst.c
│           ├── stm8s_spi.c
│           ├── stm8s_tim1.c
│           ├── stm8s_tim2.c
│           ├── stm8s_tim3.c
│           ├── stm8s_tim4.c
│           ├── stm8s_tim5.c
│           ├── stm8s_tim6.c
│           ├── stm8s_uart1.c
│           ├── stm8s_uart2.c
│           ├── stm8s_uart3.c
│           ├── stm8s_uart4.c
│           └── stm8s_wwdg.c
└── xmake.lua

三、修改编译文件

通过修改项目中的xmke.lua文件,添加STM8S标准库所用到的宏定义、相关头文件及代码文件的定义。我的修改如下:

add_rules("mode.debug", "mode.release")
set_targetdir("build")
add_defines("STM8S","STM8S003","USE_STDPERIPH_DRIVER")

after_build(function(target)
    local binOut = string.gsub(target:targetfile(), ".ihx", ".bin")
    local hexOut = string.gsub(target:targetfile(), ".ihx", ".hex")
    os.exec("sdobjcopy -I ihex ./"..target:targetfile().." -O ihex "..hexOut)
    os.exec("sdobjcopy -I ihex --output-target=binary ./"..target:targetfile().." ./"..binOut)
end)    

target("app")
    set_kind("binary")
    set_extension(".ihx")
    add_cxflags("--std-c99","--stack-auto","--noinduction","--use-non-free","--code-size 0x1800")
    add_asflags("-plosgff")
    add_ldflags("--code-loc 0x8800","--out-fmt-ihx")
    add_includedirs("app","base","third_party/STM8S_StdPeriph_Driver/inc")
    add_files("base/*.c","app/*.c")
    add_files("third_party/STM8S_StdPeriph_Driver/src/stm8s_gpio.c")
    add_files("third_party/STM8S_StdPeriph_Driver/src/stm8s_tim4.c")

四、修改其他代码及头文件

为了方便往后切换回寄存器开发,我调整了原工程的一些基本代码,增加通过判断宏定义USE_STDPERIPH_DRIVER 来判断是否使用标准库。

这个修改,我稍后会将整工程分享出来,这里我就不再列出相关文件。

编译下载

通过快捷键CTRL + F7将工程进行编译后,再按F8键下载更新固件到Pegasus天马座开发板即可。

工程分享

工程下载路径

更多推荐

2023年中秋·国庆节放假通知

放假期间如有业务、技术及其他相关需求,欢迎新老客户前来咨询!放假期间如给您带来不便敬请谅解!注意事项1、放假离开公司前须全面清扫所属办公区域的卫生,收拾好桌面、保管好个人办公物品;2、关闭个人电脑等办公设备的电源,切断用电设备的插座电源开关,锁好门窗防雨,做好防火防盗工作;3、节日期间重点安全部门,如仓库,要加强对仓库

【计算机网络】网络编程接口 Socket API 解读(5)

Socket是网络协议栈暴露给编程人员的API,相比复杂的计算机网络协议,API对关键操作和配置数据进行了抽象,简化了程序编程。本文讲述的socket内容源自Linuxman。本文主要对各API进行详细介绍,从而更好的理解socket编程。connectconnect()遵循POSIX.1-20081.库标准c库,li

IP归属地应用的几个主要特点

作为一款优秀的IP地址定位工具,主题IP归属地的应用无疑是最好的选择之一。该应用可以将您需要查询的IP地址快速定位到所在的具体物理位置,并提供详细的地址和地图信息。接下来,让我们一起来看一看IP归属地应用的几个主要特点:1.快速查询IP地址归属地主题IP归属地应用的查询速度非常快,您只需要输入需要查询的IP地址点击“查

微软宣布推广数字助理 Copilot;GPT 应用开发和思考

🦉AI新闻🚀微软宣布推广基于生成式人工智能的数字助理Copilot摘要:微软宣布将基于生成式人工智能的数字助理Copilot推广到更多软件产品中。新的AI助理MicrosoftCopilot将在Windows中无缝可用,包括Windows11桌面、Microsoft365、Outlook、Edge浏览器和必应。它能

【Linux网络编程】序列化与反序列化

我们网络收发数据实际上只能接收到字符串,但是在现实生活中描述一个客观物体都是以很多属性来描述的,所以在网络中结构体类型的数据更常见,那我们如何发送结构体数据呢?这里就涉及到协议的概念了。我们想象一个场景,在特种兵执行任务时,他们有特定的战术手语,这样他们就能根据手语进行相应的战术配合了。所以协议也是一样,客户端和服务器

【计算机网络】IP协议

文章目录TCP与IP之间的关系IP地址的认识协议报头格式1.报头和有效载荷如何分离?2.8位协议3.4位版本4.8位服务类型5.16位总长度6.8位生存时间TTL网段划分IP地址的划分子网划分CIDR的提出如何理解CIDRTCP与IP之间的关系如:假设你上高中时,班里有个同学叫张三,他的老爹是学校的校长你感觉每次考试都

微前端qiankun简易上手指南

微前端架构一、什么是微前端架构微前端是一种多个团队通过独立发布功能的方式来共同构建现代化web应用的技术手段及方法策略。微前端借鉴了微服务的架构理念,将一个庞大的前端应用才分为多个独立灵活的小型应用,每个应用都可以独立开发,独立运行,独立部署,再将这些小型应用联合为一个完整的应用。微前端既可以将多个项目融合为一,又可以

Pixea Plus for Mac:极简图片浏览,高效图片管理

在处理和浏览图片时,我们往往需要一个得心应手的工具,尤其是当你的图片库包含了各种不同格式,例如JPEG、HEIC、psd、RAW、WEBP、PNG、GIF等等。今天,我们要推荐的,就是一款极简、高效的Mac图片浏览和管理工具——PixeaPlus。PixeaPlusMac版是一款专为Mac用户设计的图片浏览器和管理工具

【Linux】自动化构建工具 —— make/makefile&&Linux第一个小程序 - 进度条

​​📝个人主页:@Sherry的成长之路🏠学习社区:Sherry的成长之路(个人社区)📖专栏链接:Linux🎯长路漫漫浩浩,万事皆有期待上一篇博客:Linux编译器gcc/g++的使用&&初识动静态链接库文章目录一、前言二、概念三、代码实现四、实现原理1、依赖关系和依赖方法2、清理①.PHONY伪目标②.PHO

ZABBIX 6.4安装部署

ZABBIX6.4安装部署zabbix的主要组成:1、ZabbixServer6.4:Zabbix服务端,是Zabbix的核心组件。它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。2、ZabbixAgent:Zabbix客户端,部署在被监控设备上,负责采集监控数据,采集后的数据发送给ZabbixServ

林木种苗生产vr虚拟实训教学降低培训等待周期

林业种植管理在保护水土流失、气候变化及经济社会发展中发挥重要的作用,林业教学往往需要进入林区进行实操察验,在安全性、时间及效率上难以把控,因此有更多林业畜牧院校创新性地引进VR虚拟现实技术。在林业领域,实地调查是获取准确数据和深入了解森林生态的重要手段。然而,传统的实地调查方法存在诸多问题,如时间成本高、人力物力投入大

热文推荐