最重要的东西当然要放在最开始,项目 git repo地址
https://gitee.com/DarberLinCC/DA14531.git
最简单拉取方式:
git clone https://gitee.com/DarberLinCC/DA14531.git
为了方便项目工程代码的管理,我习惯了使用git,远程的仓库托管则选择国内的Gitee,
主要是不想每次操作都为网速蛋疼。
首先,给几个图,意思意思。
后面会详细说明一些相关的操作
初始状态:
就是原始的SDK——目前DA14531最新的SDK版本号为 6.0.20.1338
本帖最后由 辛昕 于 2024-1-22 20:56 编辑
DA14531 SDK6(non-ble)peripheral_project 的简单结构
在讲述我自己基于SDK例程构建自己的项目工程的思路之前,我觉得,
有必要简单先讲一下SDK例程(目前是非蓝牙部分的基础外设例程)——
NON-BLE peripheral_project 的结构。
其实,它也很简单。
只有 main.c user_periph_setup.c 是有变化的。
实际上,这两个源文件也放在不同例程文件的src文件夹下——
也就是说,这是每个例程项目的不同部分。
而我们往下简单地追一下代码,就会知道——
system_init() 这个函数,它位于sdk的arch的 arch_system.c里
从它的位置和具体实现的意图来看,
它实际上是一个统一的,和任何不同功能例程的这个函数实现都是一模一样的。
只在这个函数最后调用的是每个项目自己不同的 periph_init() 实现
而这个periph_init()的实现,每个例程项目,当然是不一样的,因此,它位于
本帖最后由 辛昕 于 2024-1-22 19:46 编辑BSP组织思路:一封到底
而我使用我自己的 BSP,简单地说一下我的思路——四个字:一封到底
管你MCU的初始化还是外设接口,我都一步封到我的BSP里
把包括MCU初始化,外设的接口封装都做在这里,并最终只以一系列函数
接口的方式给上层提供。
这些函数接口的形式也必须是 ansi C的
也就是说,它不会暴露 DA14531 SDK自身的自定义数据类型、宏定义。
尽管,在实际封装BSP的过程中,往往不可避免地要自定义一些数据类型、
宏定义——
然而,BSP对外开放的这些接口,它和DA14531(MCU)的SDK提供的不
同的是,它会让这些定义是基于用户功能语境的,而做到与MCU无关;
也可以简单说,这就是 BSP和HAL的区别,BSP是对板级的,而HAL是针对MCU中间层的。
咱们就着代码一点点说——
撑着一开始只是改写blinky这个非常简单的例程作为入手说明
自建的BSP组织方式对原始SDK例程唯一的修改——
这个periph_init()在 DA14531 SDK里,它原本就是可以根据不同的项目外设使用而改变的。
唯一只是保证使用相同名字的函数接口声明而已。
因此,在我自己的BSP接口里,我把periph_init() 里的具体实现全部注释掉
然后,我只在这个原始的例程框架上,添加自己的main.c 和 bsp
最后贴上我的main.c(忽略其中的 FreeRTOS代码部分)
本帖最后由 辛昕 于 2024-1-22 19:56 编辑
在这个过程中,我同时会介绍一下我使用SDK,和构建自己项目工程的一些个人思路。
当然,这种事情属于个人习惯,你们要不喜欢,问题不大。
我后面会把我如何快速创建自己的项目工程也写在这里,你们可以愉快的自己改成你喜欢的样子;
后面我会简单介绍一下 Keil5 MDK 的项目工程文件 的 文本结构,对这些没技术含量
的知识了解以后,你可以非常迅速地——想怎么魔改你自己的项目工程都可以。
Git 的 .gitignore 和 Keil 的 *.uvoptx 和 *.uvprojx
在往gitee上传 model_project 的放在顶层的 工程项目 前,先简单讲一下
和 .gitignore 有关的一些操作
首先讲一下,.gitignore 是个什么东西。
在我们日常频繁地往git保存代码修改的时候——
这里要说,尤其是在git这种工具下,
请大胆、频繁地保存你的代码修改版本。
不必像以前,在公司,因为使用SVN P4V等集中式的版本管理工具时那样小心翼翼,
非得是很完整的功能点修改才上传——
如果你在公司的项目中使用,实在不行,你就新建一个自己用的分支来保存呗——
实际上,在git上,在公司这种多人共同开发环境下,实际上,我们也需要使用这种
方式,来保证自己的开发环境、代码和上传的公司支线的同步问题。
这个,我们后面有机会单独开贴说。
.gitignore的语法这里不多说,建议百度。
这里,只对本个项目里使用的(到目前为止)很简单的.gitignore 说明。
在一般情况下,我们实际需要上传的代码,往往只是 .c(.cpp) .h,其他的任何修改,都基本不用上传;
然而,无论是Keil还是IAR,或者其他IDE工具,基本上,都无可避免会产生很多中间文件。
这里面,有 IDE本身的项目文件、中间文件
还有编译过程产生的各种 .o .d 等
而这些,是我们不应该保存和上传的变化;
为了方便,我们可以把我们不想要跟踪和保存的文件变化,写在 .gitignore里。
这可以在每次 git status git add 时,大幅简化我们的操作。
——只有操作简单快速,我们才会乐于做频繁提交代码保存中间修改这种有益于开发的行为。
这里,另外要说一下的是 *.uvoptx 和 *.uvprojx 的问题。
理想情况下,只有我们在修改 keil 工程 的设置,增删编译文件 等行为时, 这两个文件会发生变化。
这种变化,当然是需要保存、提交的;
然而,实际上,几乎每一次,编译、调试,乃至啥设置都没动,啥文件都没增删变化。
你一关掉keil,它的这两个文件就发生了变化。
这是挺烦的。
所以,我把这两个文件类型也写在了 .gitignore 里予以忽略。
当然了——如我们前面所说,有的时候,你总不可能避免真的会做一些需要保存的 改变。
这个时候怎么办呢?
为了这种不得不,但又其实基本很少需要的行为,我专门写了两个简单的 bat脚本
从名字就可以看到各自会在什么时候用。
两个脚本也非常简单,只有几句cmd命令,你只要看了名字和我的解释,再简单百度一下
你就会明白每一句命令的意思。
以下是我目前的工程 放在顶层的 model_project
它包含了一个我需要的项目基础——
1、以 jlink-rtt 作为 调试信息输入输出,替代和节省两个串口io口
2、同时,移植FreeRTOS(Kernel)
其中,关于 RTT 我在本系列教程帖子的 配套教程 之一 里写过
关于 FreeRTOS我将在写完本帖子以后,继续回头写 这个 配套教程 之二——我之所以先写这个三,
是因为我觉得有必要先写,顺序我搞错了。
对不熟悉git的朋友,给大家一个简单的命令
git clone https://gitee.com/DarberLinCC/DA14531.git
以文本格式打开 uvoptx uvprojx...是可以对keil项目文件夹 为所欲为的快速行为
最后,我们讲一下,这个 model_project,简单介绍一下我对它做了什么——
首先,我嫌它烦——瑞萨要管好几个MCU型号,但,我只管DA14531
这个地方怎么改呢?
简单——
兄弟,你就说你想做什么吧?
真的,你可以为所欲为的。
当然,最左侧的 Project Targets 在这里搞,是很痛快的。
但如果是最右侧的要增加文件,或者说——比方说,我就把
blinky 复制到 根目录下,如果要一个一个源文件地改........
对不起,我们码农是真的不能干这种低水平的重复行为的。
所以,我们只要以文本形式 打开 uvprojx 再来看一眼吧。
你看看这个——
你就说熟不熟?
然后,怎么改最快?
怎么,够快了吧?
这是 头文件搜索路径,当然还有一个是源文件
改的方法,当然也是 replace all 大法......
怎样,这就很爽了,很快了吧。
所以,你想把它放哪都行,你喜欢就可以。
哦,对了,,blinky 改成 model_project
我都不用截图,我就教你一招,你 ctrl+F “blinky” 不就完事了?
毕竟,这个文本,说的都是人话,是一种 xml格式的文本。
用相同的方法,你可以同样处理 uvoptx
因为,以一种我们不能理解,其实也没有必要理解的原因——
有一些设置项,它,是出现在 uvoptx 这个文件里的
所以,我才说,为什么,当我们在对项目设置进行修改,增删文件啥的时候——
爽快点,两个一起保存好了。
实际上,这也是最初SDK下载下来时,每个工程文件夹里的样子。
本帖最后由 辛昕 于 2024-1-22 21:24 编辑很喜欢这么详细得技术帖子
引用: eew_cT3H5d 发表于 2024-1-22 23:19 很喜欢这么详细得技术帖子
这些内容——前期的,基本不止对于 DA14531或者DA145XX系列的MCU有效。
基本上,是对于 ARM内核 用Keil 以及 JLink 统统有效的基础技能。
欢迎关注