# mculib4d **Repository Path**: C-BAND/mculib4d ## Basic Information - **Project Name**: mculib4d - **Description**: D语言原生的arm操作库,以简单调用,简化调用,通用封装为目标 - **Primary Language**: D - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2022-08-30 - **Last Updated**: 2022-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mculib4d ## 介绍 D语言原生的arm的hal操作库,直接使用[LDC](https://github.com/ldc-developers/ldc)进行编译,无需交叉环境这种混乱东西. 通过**SVD**直接生成mc的底层操作,大部分功能基于D的模板进行实现,尽量实现D语言原生的实现. 本人搞单片机有点年头了,一直都是干应用的.常用开发软件用Keil,iar,一类的盗版软件,在经历2020年的时候突然发现不能在这样下去了, 各种技术上的**卡脖子**事情让我觉得应该 "**搞点事情**", 国产的MCU很多,真的不少,可为何开发软件及开发库就那么几种盗版的? 离开这些软件我们还能做自己的事情么? 所以我定下目标是搞一个D语言下的单片机开发(嵌入式的直接用就好了;~)) 我认为D语言做开发有一些先天上的设计优势,比如说非常强力的[编译前解释器](https://blog.csdn.net/sdv/article/details/113239316)(感觉类似很强的宏脚本解释器),把所有没必要的运算压在编译前. 资源文件无需转换直接嵌入 **`import(string file)`** , 强大的 LDC 可以支持多种MCU及结构 (aarch64,arm,avr,mips,thumb,esp32.....),很适合**搞事情**,其内置的LDD还可以支持直接的bin输出(当前版本 LLVM 11还是存在TLS的BUG) 欢迎**搞事情的人**一起出手. ## 软件架构 前端选择D语言,编译器使用LDC. D语言中声明 与存储位置相关 ```c 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的基础库中调用. 直接调用寄存器库 ```c 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!** 模板获取, 可以通过以下代码重新定义 中断 ```c 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` : 索引方式写入 - ```c 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,更多信息可参考[我的文章](https://blog.csdn.net/sdv/article/details/112453911). 3. windows的host平台编译实现代码在 bu2.cmd中,linux的编译脚本我未实现 4. 烧录脚本我没有实现,可自由选择烧录程序 5. 通过**tools**目录下的**svd**工具可以转换现有svd数据. ## 说明 1. 代码可自由使用,商业发布请注明来源 2. 二次发布请告知我一下,一同开心 3. xxxx其他的想到再写 ## 参与贡献 1. 开发参考的硬件为 STM32F401CC,和芯片相关的手册 2. 代码参考 [wiki](https://wiki.dlang.org/Minimal_semihosted_ARM_Cortex-M_%22Hello_World%22) , 4. 有讨论的发issues 5. 开发中使用的一些不常用技巧汇总在[我的博客](https://blog.csdn.net/sdv) . ## 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](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 模板,通过简单测试 可正常应用.