1 Star 0 Fork 4

C-Band / mculib4d

forked from 赵维鹏 / mculib4d 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

mculib4d

介绍

D语言原生的arm的hal操作库,直接使用LDC进行编译,无需交叉环境这种混乱东西. 通过SVD直接生成mc的底层操作,大部分功能基于D的模板进行实现,尽量实现D语言原生的实现.

本人搞单片机有点年头了,一直都是干应用的.常用开发软件用Keil,iar,一类的盗版软件,在经历2020年的时候突然发现不能在这样下去了, 各种技术上的卡脖子事情让我觉得应该 "搞点事情", 国产的MCU很多,真的不少,可为何开发软件及开发库就那么几种盗版的? 离开这些软件我们还能做自己的事情么? 所以我定下目标是搞一个D语言下的单片机开发(嵌入式的直接用就好了;~))

我认为D语言做开发有一些先天上的设计优势,比如说非常强力的编译前解释器(感觉类似很强的宏脚本解释器),把所有没必要的运算压在编译前. 资源文件无需转换直接嵌入 import(string file) , 强大的 LDC 可以支持多种MCU及结构 (aarch64,arm,avr,mips,thumb,esp32.....),很适合搞事情,其内置的LDD还可以支持直接的bin输出(当前版本 LLVM 11还是存在TLS的BUG)

欢迎搞事情的人一起出手.

软件架构

前端选择D语言,编译器使用LDC.

D语言中声明 与存储位置相关

uint t1=0x11111111;             // this goes to tdata   TLS,有初始化
int t2;                         // this goes to tbss    TLS
__gshared int t3=0x33333333;    // this goes to data    有初始化
__gshared int t4;               // this goes to bss     无初始化


shared int t5 = 0x55555555;     // this goes to data    有初始化
static int t6;                  // this goes to bss     无初始化
shared int tt6;                 // this goes to bss     无初始化

注意 当前库中并未实现 TLS的功能.

目录结构

mculib arch|Arch 目录,当前目录下包括一些Arch支持的杂项 arch.***|Arch 支持 chips|mcu 芯片型号对应 stdlib|本库自身支持 与phobos内子目录同名|调用库简单修正,不建议从D的基础库中调用.

直接调用寄存器库

import mculib.chips;
extern(C) void mloop() 
{
    RCC.CR.PLLI2SON.value = 0x00 ;  // 这里可以直接使用寄存器
    while(1){}
}

现有完成

通过svd工具直接生成总线寄存器的操作,可直接通过 设备寄存器名进行访问 如 RCC.CR.value=0x33; RCC.CR.PLLI2SON.value = 0x50;; 的方式进行访问. 当前有简单的边界限定,但还没有增加 assert

自定义中断函数方式

中断定义名可以通过 IRQName!<int 中断ID> 模板获取, 可以通过以下代码重新定义 中断

import  mcu.arm;

extern(C)
pragma(mangle, IRQnHandlerMangleof!(ExtIRQn.WWDG_IRQn)) // 这个声明将替换原始的 模板生成的默认IRQnHandler
void IRQ(){
    import ldc.llvmasm;
    __asm("nop", "");

    while(1){}
} ;

寄存器读写模板

  • Peripheral.Register.read4slice : 读取模板
  • Peripheral.Register.write4slice : 写入模板
  • Peripheral.Register[] : 索引方式读取
  • Peripheral.Register[]=x : 索引方式写入
import mculib.chips;
void test(){
    RCC.PLLCFGR.read4slice!(1,2)();
    RCC.PLLCFGR.read4slice!(1,3)();
    RCC.PLLCFGR.write4slice!(1,2)(3);
    RCC.PLLCFGR.write4slice!(1,3)(4);
    RCC.PLLCFGR[1];
    RCC.PLLCFGR[1]=1;
}

安装教程

  1. 编译器需 LDC,开发用版本为 1.24/DMD v2.094.1,因 LDD的BUG不能由ldc直接输出bin文件,需要使用 arm-none-eabi 的LD 和 objcopy.LDC2可以输出不使用abi LTS的方案.
  2. IDE可使用VScode,更多信息可参考我的文章.
  3. windows的host平台编译实现代码在 bu2.cmd中,linux的编译脚本我未实现
  4. 烧录脚本我没有实现,可自由选择烧录程序
  5. 通过tools目录下的svd工具可以转换现有svd数据.

说明

  1. 代码可自由使用,商业发布请注明来源
  2. 二次发布请告知我一下,一同开心
  3. xxxx其他的想到再写

参与贡献

  1. 开发参考的硬件为 STM32F401CC,和芯片相关的手册
  2. 代码参考 wiki ,
  3. 有讨论的发issues
  4. 开发中使用的一些不常用技巧汇总在我的博客 .

特技

  1. 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
  2. Gitee 官方博客 blog.gitee.com
  3. 你可以 https://gitee.com/explore 这个地址来了解 Gitee 上的优秀开源项目
  4. GVP 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
  5. Gitee 官方提供的使用手册 https://gitee.com/help
  6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 https://gitee.com/gitee-stars/

更新记录

  • 2021年4月9日: 开了个公司,主营是原型机开发(机械),更新这边的时间不会太多.
  • 2021年2月11日:更新 Peripheral 内模板 ,详情查看 寄存器读写模板
  • 2021年2月6日:更新目录树结构
  • 2021年2月5日:增加自定义中断函数的方式
  • 2021年2月3日:增加了一个svd转换用代码,详见tools目录下的svd.d .
  • 2021年2月2日:精简了一下生成方案,控制一下单文件的总行数,不然vscode有些不正常.
  • 2021年1月19日: 基本完成 peripheral 模板,通过简单测试 可正常应用.

空文件

简介

D语言原生的arm操作库,以简单调用,简化调用,通用封装为目标 展开 收起
D
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
D
1
https://gitee.com/C-BAND/mculib4d.git
git@gitee.com:C-BAND/mculib4d.git
C-BAND
mculib4d
mculib4d
master

搜索帮助