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

news2024/12/24 8:18:28

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天马座开发板即可。

工程分享

工程下载路径

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

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

相关文章

灯具欧盟CE认证,EMC/LVD/MD等欧盟指令介绍

CE认证产品范围 ​1.灯具类产品; ​2.家用电器设备、电动工具; ​3.个人电脑及其周边设备; ​4.音视频产品; ​5.无线产品; ​6.通讯类类产品; ​7.玩具类产品; ​8.安防产品; ​9.工业机械。 CE认证所需资料 ​1.一般2-3个测试样品; ​2.电路原理图; ​3.产品说明…

基于哈希表对unordered_map和unordered_set的封装

本章完整代码gitee仓库&#xff1a;对unordered_map和unordered_set的封装、unordered_map和unordered_set源码 文章目录 &#x1f36d;1. 哈希表的改造&#x1f36c;1.1 模板参数的改造&#x1f36c;1.2 增加迭代器&#x1f36c;1.3 返回值的修改 &#x1f37c;2. 对unordered…

[计算机入门] 电源选项设置

3.10 电源选项设置 有时候我们的电脑一段时间没有用&#xff0c;会自己关掉屏幕或者直接睡眠&#xff0c;这是电源选项没有设置好导致的。 1、打开控制面板&#xff0c;打开其中的电源选项 2、点击左侧上方的选择关闭显示器的时间 3、进入到编辑计划设置界面&#xff0c;在…

听GPT 讲Istio源代码--pilot(6)

在 Istio 中&#xff0c;Pilot 是 Istio 控制平面的一个重要组件&#xff0c;它具有以下作用&#xff1a; 流量管理: Pilot 负责管理和配置服务之间的网络流量。它通过与底层的服务发现机制&#xff08;如 Kubernetes 或 Consul&#xff09;集成&#xff0c;监测服务注册和注销…

C数据结构二.练习题

一.求级数和 2.求最大子序列问题:设给定一个整数序列 ai.az..,a,(可能有负数).设计一个穷举算法,求a 的最大值。例如,对于序列 A {1,-1,1,-1,-1,1,1,1,1.1,-1,-1.1,-1,1,-1},子序列 A[5..9](1,1,1,1,1)具有最大值5 3.设有两个正整数 m 和n,编写一个算法 gcd(m,n),求它们的最大公…

WhatsApp无法收到验证码怎么办?别急,我来教你

最近收到好多小伙伴的问题咨询&#xff0c;而且大多是同一个问题&#xff1a;“WhatsApp无法验证手机号&#xff0c;也就是手机接收不到6位数字的短信验证码&#xff0c;这可如何是好&#xff1f;” 短信验证码收不到&#xff0c;连点几次重复短信后等待时间越来越久点击致电给…

B-小美的子序列(贪心)-- 牛客周赛 Round 12

示例1 输入 3 3 abc def ghi 输出 NO 示例2 输入 8 2 nm ex it td ul qu ac nt 输出 YES 说明 第1行选择第2个字母。 第2行选择第1个字母。 第3行选择第1个字母。 第4行选择第1个字母。 第5行选择第2个字母。 第6行选择第2个字母。 第7行选择第1个字母。 第8行选择第…

Idea创建springboot项目

1、选择file—>new –->project 2、选择“Spring Initializr”&#xff0c;点击“next”&#xff0c;进入工程信息配置界面修改配置信息. 备注&#xff1a;type类型选择“Maven(Generate a Maven based project achieve)”&#xff0c;生成工程路径。 3、点击next按钮&a…

【uniapp+vue3+u-picker】获取中国省市区数据结构,省市区数据三级联动json文件完整版,已实现三级联动效果

前言: 这个功能的实现,中间耽误了几天,在大佬的帮助下终于实现效果,匿名感谢xx大佬 要实现的效果如下: 1、首先需要获取省市区的数据,不考虑后端返数据,自己使用json文件的话,需要获取到完整的中国省市区数据 有个很不错的github源码可供参考,Administrative-divisio…

RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133021990 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

few shot目标检测survey paper笔记(迁移学习)

paper: Few-Shot Object Detection: A Comprehensive Survey (CVPR2021) meta learning需要复杂的情景训练&#xff0c;而迁移学习仅需在一个single-branch结构上做两步训练。 常用的结构是Faster R-CNN&#xff0c;下面是Faster R-CNN的结构图。 RPN的修改 当样本数量很少时…

Vue的进阶使用--模板语法应用

目录 前言 一. Vue的基础语法 1.插值 1.1文本插值 1.2HTML插值 1.3属性插值 1.4Vue演示三元条件运算 2 指令 2.1if&&else指令&#xff08;v-if/v-else-if/v-else&#xff09; 2.2 v-for 指令 2.3 v-on指令(动态参数) 2.4知识点补充之v-if与v-show的区别 3.过…

著名书法家傅成洪在香港第八届“一带一路”高峰论坛上展示艺术与合作的融合

香港第八届“一带一路”高峰论坛于9月13日至14日在香港隆重举行&#xff0c;吸引了来自海内外的6000多名嘉宾&#xff0c;共同回顾“一带一路”倡议的历程&#xff0c;并展望未来的投资和商贸机遇。这一庆祝活动恰逢“一带一路”倡议的10周年&#xff0c;主题定为“携手十载 共…

[Python进阶] Pyinstaller打包模式

5.3 Pyinstaller打包模式 Pyinstaller将Python源码打包成程序有2种打包的方式&#xff1a; 单文件夹模式&#xff1a;指打包后将所有的程序文件放在一个文件夹内。 单文件模式&#xff1a;打包后只有一个可执行文件&#xff0c;全部的依赖文件都已经被打包进去了。 5.3.1 单文…

Linux 信号相关

int kill(pid_t pid, int sig); -功能&#xff1a;给某个进程pid 发送某个信号 参数sig可以使用宏值或者和它对应的编号 参数pid&#xff1a; >0 &#xff1b;将信号发给指定的进程 0&#xff1b;将信号发送给当前的进程组 -1&#xff1b;发送给每一个有权限接受这个信号的…

Postman应用——Variable变量设置(Global、Environment和Collection)

文章目录 Global变量设置Environment变量设置Collection变量设置Global、Environment环境变量预览 Global、Environment和Collection变量使用&#xff0c;点击查看。 Global变量设置 全局变量设置&#xff0c;作用域是所有Collection、Folder和Request&#xff0c;全局变量只有…

混淆矩阵和数据不平衡 (1/3)

一、说明 如果数据集数据不平恒&#xff0c;如何评估分类器的效果&#xff1f;如果分类器不好&#xff0c;如何改进分类器&#xff1f;本篇将讲述不平衡数据下&#xff0c;混淆矩阵的应用。 二、混淆矩阵的基本概念 2.1 连续数据分布 LET将数据视为连续的&#xff0c;分类的或有…

阿里云服务器价格更新,轻量应用服务器108元,云服务器182.04元起

阿里云服务器价格更新了&#xff0c;不同时期阿里云服务器的租用价格不同&#xff0c;目前阿里云在官网活动中新增加了一款经济型e实例规格的云服务器&#xff0c;现在购买阿里云轻量应用服务器最低为108元&#xff0c;购买云服务器最低为182.04元&#xff0c;换算到每天只要0.…

零基础学前端(四)3. 重点讲解 CSS:实战补全百度网站首页

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 3. 初学者切忌&#xff0c;不要眼花缭乱&#xff0c;不要四处找其它文档&#xff0c;要坚定一个教授者的方式&#xff0c;将其学通透&#xff…

前端学习路线,带你入门程序猿

相信很多想学前端的小伙伴是非常迷茫的 前端知识体系很多&#xff0c;不知从何学起 而且框架也有不少&#xff0c;不知道该如何下手 很多学习前端的小伙伴都没有一个很好的学习路线图&#xff0c;简直可以说是看见啥学啥 而且自己在学习的时候非常吃力&#xff0c;感觉总是学不…