# SimpleBedsideLamp
瑞萨?瑞士卷?披萨?傻傻分不清.只闻其名未能用过瑞萨的Arm芯片,恰好遇到这个机会那就不能错过.
那...点个灯吧,问了下训练营管理员.小白萌新能点灯就可以结营,太棒了!
(下文为了便于理解,对于一些硬件参数和软件环境等均使用流行的友商ST产品进行比较)
## 规划分析
基本上就是对训练营例程的简单删减.**希望橘子姐姐能评定为新手区**
先看一下训练营案例功能
1. 采用R7FA2E1A72DFL作为电子时钟的主控芯片
2. 采用一个四位0.56寸共阴极数码管用来显示时间
3. 通过DHT11温湿度传感器进行环境温度采集
4. 采用四个按键进行时钟设置按键
5. 引出一路复位按键、串口电路、SWD下载电路,方便下载调试
6. 瑞萨芯片集成了触摸引脚,引出一路触摸引脚出来用来作为触摸按钮使用
7. 通过无源蜂鸣器作为时间达到等提示
8. 通过AO3401A+1N5819二极管组成电源切换电路
9. 通过TP4056来给电池充电
##### 芯:heart:
训练营要求使用RA2E1系列的`R7FA2E1A72DFL`芯片,这点不能改.
##### 电:electric_plug:
要让主控运行起来最重要的是什么? 嘉然!!!
咳咳.是电源.灯应该会很费电吧,所以先把训练营里面的电池和充电部分删掉!(●'◡'●)电什么的最可怕了
直接插充电器,嘿嘿,无穷趋近的电能滚滚而来
##### 光:sunny:
点灯自然要有灯.数码管本质上也是灯,所以只能算是*平替*.
*搞个亮亮的白光灯,亮堂堂*
*搞个缤纷的小彩灯,加性能*
四位数码管一共32个灯,这里进行了一点点小小的缩减数量11颗灯
##### 测:eyes:
时钟搭配温湿*度传感器*,怎么看都不那么搭配.**平替**成加速*度传感器*,仅仅改动两个字,小改动.
白天要看时钟吧,亮度低肯定看不清.晚上也要看时钟吧,那么亮很刺眼.是不是搞个自动适应环境亮度的功能好一点,加一个亮度传感器.可是...官方例子也没有,俺一个种田的,俺也不会,俺就留个位置等着官方吧.看清.**只是预留位置没增加功能的啊**
##### 手:muscle:
总要有个手开灯吧(万一拍不亮呢).例子有四个物理按键和一个触摸按键.小删除四个按键吧(*^_^*)
##### 乱&&
还剩下蜂鸣器,叫起来很吵哎,删掉!
什么复位按键/串口电路/SWD下载电路奇奇怪怪的,都删掉!
最后橘子说最好弄个外壳,那个建模小白也不会.只好搞个小月球啦
综上所述,小灯本质上就是例子做了一点点小改动,这一定是个**新手营**的!
## 电路设计
### MCU
MCU是这块电路的核心,因此优先看MCU手册.看看DS,这颗:heart:有啥不一样:
- 推荐查看英文手册!官方提供的中文机翻版本完全没有校对,纯纯的机翻,强迫症"狂喜"
![image.png](//image.lceda.cn/pullimage/l9J06KpdKFFKaBvA4srxVi90EJpVbo7EhEtvSFz8.png)
- 第一行开头就是`Ultra Low Power`,哇,超低功耗芯片哎,那是不是可以搞一个纽扣电池供电的小家伙了?直接跳转到电源参数部分查看.越看越感觉不对,掏出本ST的老版本M0+芯片对照一下,差距有点大.去瑞萨官网深造一番,了解到其低功耗系列是RA2L1(开头也是UltraLowPower,猜测是同一个模板忘记改了),而RA2E1是入门线产品,其对标应当是ST的F0系列.查看RA2L1的价格,立创20+,淘宝6.50.好吧,还是乖乖用RA2E1吧(尽管也在训练营期间涨价了)
- M23内核,这点不错,比很多国产厂还在用免费授权的古董M0/M3强.不过,M23也不算新,2016年末发布.M23定位还是低端入门MCU,同级别是M0<M0+<M23.因此可以理解M23就是M0ultra(据说M0固件可以直接烧M23,未测试).相较于M0支持硬除法,TZ安全扩展和MPU结构优化(这点是好事,MPU更灵活了,但是M23体现不大要看M33应用).后面两点本次开源项目基本用不到
关注完整体与核心参数,开始关注细节外设.
#### RTC&CGC
时钟精度,内置SOSC(LSI)在DS中表明其在全电压域时钟范围(DS内未提及温度环境)在27.8528~37.6832KHz,按中心频率32.768KHz计算误差约为±15%.对比友商G030,其全电压域(2.0~3.6V)全温度域(-40~85℃)LSI范围在29.5~34KHz,按范围中心31.75计算误差约为7%(按32.768KHz最大误差约为10%).可见RA2E1这颗料内置RTC性能并不好,尽管训练营例程使用内置RTC,这里仍使用外置晶振以提升精度(CGC: xcin&xcout).
![image.png](//image.lceda.cn/pullimage/Q6VFjL0DPtXSHqmfaXgVLFcC0hGWUFRDsTMfSSHT.png)
掉电走时,毕竟谁也不想每次插拔电源都要重新设定时间,那就麻烦死了.RA2E1这颗料没有外置Vbat引脚,一般小封装或对芯片低功耗有信心的芯片都不会单独将Vbat引出,而是要求软件上识别到外部电源掉电切换到电池后立即进入低功耗模式,算是秀肌肉的强制要求吧.这对电路设计有些要求,必将电池将为整个MCU供电.由于使用固定电源供电因此外部电源恒为3.3V要固定高于纽扣电池电压的,电路设计简单了一些.唯一需要注意的就是二极管需要选择正向压降小漏电流小的.给予芯片一个外部电源插入信号来唤醒芯片(内置PVD检测也可以).这里将信号给Wakeup引脚即NMI中断引脚.官网上没找到对应的应用手册,因此具体电路参考友商的AN4718.
配置RTCOUT输出1pps信号,用来测量RTC走时精准度.
便于测试新芯片一般都会把MCO引出,这里复用为白光LED的使能引脚.
#### CTSU
CTSU其实就是触摸外设.虽然这颗芯片支持互电容方案,但查看官方几块开发板都没有使用,想找个参考在训练营群里问了两次FAE都被忽略.官方都没设计互电容的板子,俺也不冒失了,老老实实搞自电容方案吧
触摸识别本质是对电容频率检查,芯片对触摸电极充电(电容),引脚电压低于低阈值开始充电,到达高阈值开始放电,一充一放为一个周期,每个周期捕获一次计数.当系统静态时电容恒定因此充放电周期恒定即计数值恒定.当手指/其他物品同电极靠近时,增加了系统电容进而导致充放电周期增加.
那么这个系统电容都包含哪些呢?PCB上一般存在Ctrace(线路同参考地),Cgroud(MCU参考地和大地),Celectrode(电极同参考地),Ccomponet(芯片内寄生电容),Ctouch(手指和电极在参考地和大地形成的电容)几个电容,可见`ΔC==Ctouch`,Cgroud为固定值,其余可统称为Cp.Cp增加则灵敏度降低,Ctouch增加则灵敏度提升,同时受限于芯片能力,C总值应小于芯片上限(50pF)
先说简单的触摸电极优化方向:(开源平台Markdown没有对公式的支持,公式就不贴了)
- 电极需要紧密连接至覆盖层,间隙大于2mm要使用弹簧等方式
- 覆盖层的介电常数越大越好,通常使用介电常数2~8之间的材料,传导材料不可用.**需小心含金属微粒的油漆/涂层**
- 覆盖层厚度越小越好,触摸电极的面积越大越好.
然后是重头戏,PCB设计中减少寄生电容的方式:
- 对于Cp影响大小的排序一般为:线路长度>电极附近覆铜>线路同覆铜距离>>过孔数量>电极面积≈线路宽度.
- 芯片封装影响,不同芯片封装导致金线键合差异,芯片内部外设的电流变化以及高频动作都会对触摸外设部分造成影响.此部分需要对芯片进行测试,部分专业厂商会在手册中进行提及(如ESP32的IO32).推荐选择受此影响小的触摸引脚以及其他设计上减小芯片上的瞬间电流波动.
- PCB基材常见为FR4材质,当板厚降低时应减少电极背面覆铜或之间取消.这里讨论的均是基于此,毕竟FPC啥的咱也没用过.
- 线路长度不应超过300mm(实际不会有这种案例吧),每增加100mm长度计数值下降15%左右
- 线路离覆铜(参考地)间隙应大于1mm.
- 线路应被覆铜环绕以增加抗干扰能力.线路同覆铜应间隔1mm以上(此值受覆盖层厚度影响),推荐覆铜比例20%下(6mil线宽,50mil间距)覆铜网格应同线路45度相交.同实心覆铜间隔5mm以上.电极底面使用实心覆铜时计数值下降15%左右,使用网格覆铜将降低10%左右.同时,覆铜应合理否则推荐分割覆铜区,免得实际覆铜成为某高频信号的天线.
> 覆铜这部分很多人对这点持反对态度,莫工就提醒过不要背面覆铜.因为覆铜图案会同电极/线路电容耦合,进而增加Cp影响灵敏度.实际应用中推荐增加网格覆铜,可以抑制一些噪声增加抗波动能力(电极此时可视为天线).应用环境存在电磁噪声或射频环境时应增加底面覆铜.但应严格按照手册推荐设计,如RA的设计指南要求电极与网格覆铜间距5mm,覆铜宽度小于5mm.
>
> RA有芯片支持有源屏蔽,推荐使用.但训练营指定芯片RA2E1不支持.
- 线路过孔数量越少越好,过孔应在电极边缘以减少不同层线路间寄生电容.增加10个过孔时计数值下降8%左右
- 线路/电极下方尽量不走线,走线应予触摸线路90度相交,平行走线至少间隔4mm以上减少同线路的正对面积.高功率信号线(载波)如电极驱动电源线,射频线路等应尽可能原理并做好屏蔽.(实际把触摸电路按照弱模拟信号布线规则即可)
- 多路线路间距1.27mm以上.
- 电极尺寸应贴合手指尺寸,当覆盖层厚度增加时应酌量增加电极尺寸,通常在12mm上下.电极造型圆形最佳,不推荐使用存在尖角造型(电荷会聚集在尖角).电极间距应大于5mm以上(覆盖层厚度增加时也应增加)
> 滑条中每条宽度应大于8mm,滑条间距0.5mm~2mm,高度12mm左右.常见造型为V,W型
>
> 双工滑条(一维矩阵),滑条上为同一个引脚布置两个块,软件上比较相邻块值来确定实际触摸位置.
>
> 矩阵键盘,同机械按键键盘,使用N+M个IO识别N*M个按键.电极图案使用四叶草🍀造型,上下叶连接IO0,左右页连接IO1.
- 线路不应存在90度走线,尽量直线拉.
> 多句嘴,现在网络上直角走线已经被妖魔化了,实际上低频场景毫无影响,问十个喷子为啥不能直角走线九个都讲不清楚.多数都是跟风而已,并没有自己的见解.简述一下此设计中为啥不推荐直角走线.首先和什么EMI电磁发射并没有关系,转角位置线宽为线宽的1.414倍.线宽增加则阻抗减小,阻抗变化一般在10%左右因此反射系数在0.1上下,因此实际造成的EMI发射可忽略不计(这部分有论文测试过1Ghz信号内常见90度45度圆弧三种走线方式造成的EMI差异是测量不到的).这里实现的影响是因为直角走线会增加0.02pf左右的寄生电容(根据线宽可计算得出),触摸系统总体Cp也是pf级因此存在一些影响.另外还有一个常见论证直角走线的影响就是酸角问题,能说出这句话的至少90前的老工程师吧,这是个工艺问题,现代板厂工艺早就升级了甚至早就不用酸性腐蚀液了...
- 线路宽度推荐6mil,越小越好.实际影响最小,增加10mil计数值下降仍小于1%
- 线路上一般推荐增加RC电路实现滤波功能,R过大将导致信号失真降低灵敏度,过小则滤波效果差通常范围在470R~2KR范围内,具体应实际测试综合全部参数分析.布局应靠近芯片引脚.
一般的,还会给触摸电极位置提供照明,需遵守下述规则:
- LED线路应遵从上述原则,同触摸线路90度相交.引线应远离电极,平行走线间距4mm以上
- LED不可使用PWM等高频方式驱动
- LED开关瞬间其线路上电压变化耦合在Cp中,推荐LED线路上增加电容(104,视LED而定)同LED限流电阻来实现LED的缓亮缓灭.
- 当LED侧贴使用导光片来照明电极区域时,LED布置在电极附近(3mm以上),同上LED亮灭变化将影响触摸电容.可在LED两端并联一个1nf旁路电容
尽管已经使用了反贴灯,这里还是没设计触摸电极的照明灯(PS: 就是懒得画,略).RA2E1在使用触摸外设时需要连接TSCAP电容.
#### ADC
设计用来测量系统耗电参数.需要注意的是,使用ADC外设时提供Vref参考值可配置不同阈值.这里同AVCC连接.信号布线时应遵循模拟信号布线标准.测量电路中推荐使用开尔文接法.
> 其实选用的加速度传感器也包含ADC采集电路.但精度要低于RA2E1标称精度
> 注意: 此处设计存在问题.由于比较穷,习惯性的未使用专门的电流检测芯片,使用便宜的通过运放来做放大电路.但使用通用运放的Vcmr较低,一般需要低于VCC-1.5V左右,很明显在电流采集电路中,这很难实现.本例通过一些小手段即增加线端电阻以降低输入电压和缩小放大倍数来规避此问题.缺点是降低了检测范围,因此可将隔壁电压跟随那路拿过来再做一级放大即可.由于本例点的灯功耗都不大因此范围小一点也足够用.
> 注意: 原理图上任何参数均可能与实际电路无关,大部分都是随手选的,实际焊接时才会进行计算
#### Debug
调试电路,由于引脚够用,因此独立使用SWD接口没做复用.
#### SCI
由于M23同M0一样阉割了SWD,没有SWO.因此引出一路串口用作调试.RA2E1的串口属于SCI外设.逻辑层级上多嵌套了一层,本质没区别.
为预留的亮度传感器接口提供IIC接口,同串口一样同属于SCI外设.RA2E1提供了一路独立的IIC外设,相较于SCI内的IIC来说,功能更加全面.SCI内IIC接口满足基础功能使用,软件上也少研究一个外设.
#### SPI
其实也想使用SCI内置的基础SPI即可.但是SCI复用关系扫两眼没看懂,索性直接用SPI外设吧.应用上SPI外设负责的东西也比较多,因此使用全功能外设也合理.
为两个SPI设备分配CSN选中和各分配一个中断脚.
#### ICU
够吓人的名字,实际就是外部中断.共使用了三个:
- NMI: wakeup,快速指示外部电源掉电时事件,便于及时切换电源,减少非必要的消耗纽扣电池那么微末电量.
- IRQ002&IRQ007: 给两个外设,用来主动提示事件
#### KINT
专门的按键中断,这外设还是挺少见的.PCB仅引出接口,实际上并不会使用,调试的时候可能会玩一下,有点好奇.
#### SYSTEM
芯片特殊功能引脚.实际上RA2E1能修改的只有MD引脚(其他厂商叫Boot).Boot一般在复位后的第四个时钟周期所存后就可以随便配置成通用引脚使用了(上述参数来此友商,瑞萨手册没有提及此等细节).但是实际应用中为了防止偶然事件,只要引脚够用就不会优先复用这些特殊引脚
#### GPT
瑞萨芯片分为GPT和AGT,这里优先使用GPT.
- GPT4: GTIOCA和GTIOCB分别为LED1的RGB控制和白光灯控制.
- GPT6: GTIOCA配置为LED2的使能控制
- GPT9: GTIOCA和GTIOCB分别为LED0的RGB控制和白光灯控制.
#### I/O port
- LED_ERR: 故障报警灯
- LED_RUN: 运行指示灯
- LED_LNK: 远控指示灯
- LED0_ENA: LED0电源使能
- LED1_ENA: LED1电源使能
- LED0_IRO: 预留红外输出接口(写文档时才发现这不是个Timer引脚,哎)
- VER0&VER1: 硬件版本识别
- CSN_xx: SPI选通使能
#### DTC&DMAC
DMA很常见,直接内存访问控制器.作用是不经过CPU的情况下传输数据从一个内存地址到另一个内存地址(外设地址本质也是内存地址)
DTC数据传输控制器.作用是在中断触发时传输数据.
是不是感觉有点重合有些相似,都是不占用CPU来传输数据.简单对比了两者的模式,触发方式,中断事件,传输位宽方向范围等等,两者均很相似,DMAC的功能更多.可以浅显的认为DTC就是DMAC的青春版
### Power
通过外部TypeC供电.尽管MCU支持5V电压,但其余芯片电压域不支持因此还是增加了LDO电路.
### LEDs
本质就是一堆Mos控制电路.为了省事这里全用PMOS上管控制.提供了如下接口:
- 板载白光LED
- 板载6颗WS2812E灯珠
- 板载2颗5mm红外灯珠
- 上面三种LED提供外部加高层引出
- 伪装成USB-A的外置LED1输出接口,其中D+/D-分别为RGB和WHT调光接口.
- 伪装成USB-A的外置LED2输出接口,仅支持开关(允许PWM)
> 注意: 此处设计存在问题.原意出于省事且MCU耐压5V,也就无所谓直接开漏即可.搞好才发现,只有P400,P401,P407三个引脚耐受5V,其余耐受极限为VCC+0.3.有点尴尬,尽管MCU可以跳线VCC到5V这样能保证引脚耐受5V.但同MCU通信的传感器不支持5V电平,此处陷入了循环.
>
> 理论上,开漏就是将内部mos暴露出来,由于MCU耐压5V因此MOS一定耐压5V.IO超过VCC比较容易出现的情况是IO电压通过内部二极管反灌到VCC(似乎也没事).瑞萨手册描述的比较模糊,给的GPIO框图甚至钳位二极管都没画(或许真的没有??).按照ST的手册,特殊情况要超过VCC时需要保证电流小于特定值.因此尝试增加较大限流电阻来临时抵消此问题.目前测试无影响.
### PCB
实在被训练营诸位大佬喷怕了,按要求高标准要求修改线路.总结群中核心观点`圆弧>45°>>>>90°`,因此优先选择圆弧走线.
板框采用公式(1)曲线变形适应器件空间而实现.为了降低难度,且外壳空间足够,因此布局密度较低,望理解.
$$
z(u)=-\frac{i(1+iu)}{1+4iu-u^2}(1)
$$
信号线及元件主要分布于Bottom层,此处应为top层,受限于空间方向感很差,因此按照实际场景进行布局.
加速度被安放在发热量较大的LED背面,将导致较大误差.且未按照传感器布局要求安放在定位孔连线上,将降低识别灵敏度.以上受限于空间位置,无能力修改
射频电路未作信号隔离,还整体铺铜.受限于射频设计水平低下,毫无电磁兼容性测试经验,无能力修改.
丝印层,本着清晰明了的原则, 对丝印进行了精心布置,只用多种指示方式来明确对应关系.按照训练营要求,添加电赛logo及芯片厂商logo,相关logo已尽力放大凸显.
以至于线路回环,引线方向错误,电容从大到小排序以及对于线距线宽避空等等高级设计要求,本设计受限于水平,均无法满足,望大佬绕路.
幸运的是,在初步绘制完成后的两天后被审核临幸,予以通过,但没有给予任何评价内容
终于收到PCB啦,快乐.管不得卡在测试一天多,5片样板全部存在掉桥
![IMG_3801(1).JPG](//image.lceda.cn/pullimage/SBfkrdGe1QhKhmwRorHNoSBGhcC01JXmsuZuDeht.jpeg)
> PCB实际检查仍存在大量问题,标记为废弃 ^_^
最终焊接效果如下(仅焊接已测试部分):
![IMG_3836.JPG](//image.lceda.cn/pullimage/4E0jJcPtKduTCcvbd0PD8tj6qZ68Cl4kcOZy5U7A.jpeg)
## 软件CV
### 基础测试
#### 最小系统
由于PCB下单晚,可能赶上晚高峰了,发货比较慢,因此先跳线测试一下MCU性能参数.
![IMG_3783(20230717-003742).JPG](//image.lceda.cn/pullimage/U3RAu86762IdUtXJDoatbVHdjvKtgRbDy4JTzMPs.jpeg)
- 测量两对电源引脚导通,因此跳线一边即可.跳线调试接口.这一般是MCU的最小环境了,测试发现无法识别到
- 查看手册发现这颗料存在名为VCL的电源引脚,测量电压为1.50V,为内核供电的LDO提供滤波(话说,常见内核都是1.8V,猜测降压是为了更宽的电压域和功耗).类似老家伙STM8的Vcap引脚,但瑞萨没有给出此电容值推导过程和其他参数影响,仅提供4.7uf容值参数,据经验推荐选择低ESL电容并靠近MCU防止,注意对此处信号屏蔽,否则很容易被外部干扰直冲内核搞死机.飞线电容后发现仍无法识别
- 怀疑是没有模拟域电压内核无法启动,因此飞线模拟域电源引脚(AVCC0,AVSS0)至电源引脚,发现仍无法识别
- 此时就比较离奇了,电源环境满足,MD(其他厂商叫boot)引脚存在内置上拉,即默认从flash引导,此脚无需理会.另外一个特殊的引脚就是nRESET了,不过一般芯片都会内置POR复位,不接外置复位也是没影响的况且测试电源纯净.尝试跳线外部复位后,居然可以识别到了,那么初步猜测是瑞萨内置的POR有问题,无法独立良好复位.因此推荐必须设计外置复位电路.
- 跳线一颗led用来测试代码运行情况.
#### 官方软件
##### e2studio
官方推荐环境为e2studio,同友商STM32CubeIDE一样,基于开源的Eclipse编辑器进行魔改,编译器使用GCC.由于曾受到各种厂商的各种魔改eclipse在同一PC内大乱斗的毒害(那场面和装几个电脑管家一样),至今心有余悸,况且gcc优化生成固件尺寸始终要比其他编译器大一些,使用的RA2E1仅有64KBFlash也不是很富裕,因此更推荐使用其他编译器.e2studio调试器支持类型较少,只能使用瑞萨e2和jlink
##### fsp
FSP(灵活软件包)等同于友商的HAL库,是厂商提供的芯片基础外设驱动.尽管瑞萨在CortexM芯片领域刚刚起步,但是并没有走国产厂商那种对标ST库函数以提升移植便利性降低学习成本的路.而是继承瑞萨一贯的编程风格,通过上面外设命名也可以看出,对于功能相同的外设给出了不用的名称.因此,学习曲线还是比较陡峭的,需要理解瑞萨的FSP的分层概念.和ST的HAL库一样,都是推荐使用配置工具进行工程配置,而不是像标准库一样自己复制文件制作工程模板(当然,也见过大佬这么用HAL的).另外,FSP使用的是C99标准,使用非官方编译器时注意切换版本.
##### rasc
RASC芯片外设配置工具,等同于友商STM32CubeMx.图形化芯片外设配置工具,与友商不同的是,瑞萨提供了stack堆叠的概念,即在pin页面配置了相关外设如iic,实际仅仅分配了引脚而不会输出任何外设相关代码(仅IO配置),需要配置stack才会复制生成外设代码.也支持外部插件,如RTOS和一些常用软件包.能够配置生成cmake,iar,keil工程,但新建选择类型后无法再次修改,要想创建多个工程时只能新建,这点比较麻烦.
> 分别创建了三个RASC配置,对比其配置文件`configuration.xml`,可见三者在13行的` <option key="#SELECTED_TOOLCHAIN#" value="xxx"/>`参数存在差异:
>
> - IAR: "iar.arm.toolchain"
> - Keil: "com.arm.toolchain"
> - CMake: "com.renesas.cdt.managedbuild.gnuarm.toolchain."
>
> 另外,隐藏文件`.api_xml`,`.secure_azone`,`.secure_xml`内也有相关toolchain记录.进行相关更改后发现并未生成新编译链文件.进一步测试发现,即使将当前工程文件删除,rasc配置也不会重建工程文件.rasc应该仅在新建时才会创建工程文件,后续增量修改都只变更fsp的几个文件夹内容.
上述工具,部分基于java环境,依赖于java sdk,安装时需要注意系统内sdk版本.同时,eclipse不支持中文路径,即使开启系统全局UTF-8选项仍存在兼容问题.另,e2studio手册明确写了仅支持windows的10和11系统,这里复述一遍,因为看到有人win7系统在尝试安装.
[使用手册](https://renesas.github.io/fsp/_s_t_a_r_t__d_e_v.html#RASC-MDK-IAR-user-guide)
#### link支持
群友上官之前要求帮忙测试keil环境link兼容性.使用rasc工具配置keil工程,手里各厂link比较多,挑选手边常见的进行测试
- J-Link V11: 可以正常识别,下载,仿真调试(前面验证能否识别都是用jlink作为标准进行测试的)
- ST-Link V2: 可以识别到ID.但无法正常下载,调试.报TargetDll错误,还不是no stm32错误,不确定是否和内置判断ID机制有关.
- 山寨ST-Link V2: 最常见那种U盘款.报错同上.
- 梁山派附赠DAPLink: 无法识别.后测试其与梁山派调试发现也出现这问题,因此这应该是这个link本身存在问题
- WCH-LinkE: 可以正常识别,下载.仿真调试.就是标准的DAPLink嘛,arm家固件支持arm内核芯片合情合理.(LinkE记得从RISCV切到arm模式)
- PWLinkV2: 可以正常识别,下载.仿真调试.防止单一个例,又找个DAPLink内核的魔改link测试通过.不过,PWLink自带的客户端没成功,之前从没用过,应该是操作不对.
测试时,发现个问题,RASC生成的keil工程只是一个本成品.没有配置下载算法,需要自己手动添加算法(keil安装pack就有了).需要注意的是需要提供给下载算法的RAM大小,RA2E1的RAM起始地址不是常见的0x2000 0000,其实option里很多细节都没做配置,一些推荐自己手动设定一下.不是很清楚这里rasc为啥偷懒没把功能做全,keil的工程文件本质上就是个xml文件,修改对应位置即可.
#### 启动流程
由于第一次碰FSP这个库,因此要读一遍.读代码呢,要从第一行开始读.那么FSP的第一行在哪里呢.
对于Arm芯片来说,启动都是从复位开始.寻找`Reset_Handler()`中断入口即可.发现其在`startup.c`文件内.可见复位后先执行`SystemInit(`)函数,后调用`main()`.往下可以看到,使用编译器关键字来对栈区和堆区初始化.再往下是中断向量表.
跟踪`system.c`中的`systeminit()`.逐行看下去,先配置中断向量位置(startup.c内定义)然后是个启动回调函数`R_BSP_WarmStart()`,可以在SB模式唤醒或其他重启后调用来判断重启事件来源.之后配置系统时钟,配置完时钟才开始复制`.bss`和`.data`region数据,这里比较有趣,看过的几个MCU的启动流程上,这步都是在resethandle头部在配置时钟前,倒也合理,此时用户代码还未执行(除了那个回调).最后更新一次`SystemCoreClockUpdata()`变量然后初始化中断后结束,结束这里还有个`bsp_init()`的回调.
> 跟踪过程中,发现飞线环境会卡在SystemCoreClockUpdate后的R_BSP_Init_RTC()初始化,尽管配置测试工程中并未使能RTC外设,此初始化固定存在(上面几行还有个Trng外设初始化).由于仅为点灯工程,直接注释掉此函数,并未继续跟踪查找具体问题点(万一过两天焊PCB上它还捣乱,再去看看).很明显,这函数没啥用,起码未对点灯造成影响.
时钟这里命名方式有些绕,每次都要看眼手册才知道说的是哪个时钟源.这里做个笔记:
| 瑞萨命名 | 常用名 | 频率 | 备注 |
| -------- | ------ | ----------------- | ------------------- |
| MOSC | HSE | 1~20MHz | 主时钟,外部高速时钟 |
| SOSC | LSE | 32.768KHz | 副时钟,外部低速时钟 |
| HOCO | HSI | 24/32/48/64MHz(1) | 高速片上时钟 |
| MOCO | / | 8MHz | 中速片上时钟 |
| LOCO | LSI | 32.768KHz | 低速片上时钟 |
> (1) 核心Max48MHz所以最高只能到48MHz,64MHz需要分频
然后是一些总线时钟的名称:
| 瑞萨命名 | 可选时钟源 | 频率 | 受控域 | 备注 |
| -------- | ---------- | --------------- | --------------------- | -------------------------- |
| ICLK | All | Max48MHz | 内核,Flash,SRAM | 系统时钟 |
| PCLKD | All | Max64MHz | GPT(计数源),ADC(转换) | |
| PCLKB | All | Max32MHz | 全部外设 | |
| AGTCLK | SOSC/LOCO | 32.768KHz | AGT | |
| RTCCLKs | SOSC/LOCO | 32.768KHz/128Hz | RTC | RTCSCLK/RTCS128CLK/RTCLCLK |
| IWDTCLK | IWDTLOCO | 15KHz | IWDT | |
| CLKOUT | All | Max16MHz | CLKOUT pin | |
| SWCLK | SWCLK pin | Max12.5MHz | Debug | |
> 其实还包含CAC外设的测量源时钟和基准时钟,本例暂不使用,上表忽略
上述时钟在配置时存在限制关系:
- ICLK >= PCLKB
- PCLKD >= PCLKB
- PE(操作flash)时,ICLK需要大于1MHz
> RA2E1无PLL,只有分频器,只能对时钟源进行分频无法倍频,因此使用MOSC是最高只能跑到20MHz,本例为获取更高性能只能选用HOCO.
>
> RA2E1具备UM中描述了两种时钟树(TypeA和B).由于瑞萨是同系列公用数据手册的且手册中没有标明具体型号使用哪种时钟树.咨询了群内FAE训练营使用型号具体是哪种时钟树,没有任何回应.只好自己对比一下,主题大部分都是一样的,只有在外设时钟部分存在差异,按照手册描述A型可按照1:1:1标准而模拟为B型,所以统一按照B型处理是比较保险的做法.
>
> 上述这些时钟配置在RASC配置后将生成` bsp_clock_cfg.h `文件内宏定义.
跟踪`main.c`中的`main()`函数.发现其只调用`hal_entry()`入口函数就返回了.需要注意,main.c属于rasc生成的文件,所有rasc生成的文件中做的修改均会在重新生成工程时被覆盖掉(没有像友商一样预留位置),因此不要在`main.c`文件内编写代码.要去`hal_entry()`所在的`hal_entry.c`文件内修改(似乎有点绕).
好啦,现在开始点灯,在hal_entry()函数内指明的注释下方添加代码:
```c
while(1) {
R_BSP_PinWrite(BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
R_BSP_PinWrite(BSP_IO_PORT_01_PIN_00, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
}
```
由于gpio在配置时已经在启动阶段通过`R_IOPORT_Open()`初始化,因此无需手动初始化.初始化信息见`pin_data.c`内的`g_bsp_pin_cfg_data[]`.这部分代码似乎不大需要解释.其中`R_BSP_SoftwareDelay()`是纯软件阻塞式延迟,最开始还以为fsp帮忙初始化Systick了呢
#### FSP
Flexible Software Package是瑞萨提供的芯片驱动包.具体架构请移步查看[官方描述](https://github.com/renesas/fsp)(可能访问异常,当官方FAE表示不能接受国内审核因此不能上传至gitee).
FSP提供了分层的概念:
- 底层为一些以`bsp_`开头的文件,其内定义以`BSP_`开头的宏定义和以`R_BSP_`开头的函数.用于适配不同RA芯片和内核配置以及一些常用函数/常量.
- HAL抽象层,以外设为单位的一组以`r_`开头的文件.内容以`R_XXX`开头的外设控制函数.
- 模块层,以`rm_`开头的一组文件.内容是对bsp和一些常见开源软件项目的移植接口.
RASC配置工具本质上就是按用户选择将勾选的文件copy到新工程文件夹内,同时也会按照用户配置生成一些文件,实际生成的文件夹格式如下:
```shell
.
├── ra
│ ├── arm // CMSIS接口
│ └── fsp // FSP核心文件
├── ra_cfg
│ └── fsp_cfg // FSP配置文件 宏定义开关
├── ra_gen // RASC生成的文件
└── src // 用户可修改文件夹
```
整体看起来还是很清晰的,实际文件夹内容要略乱一点.rasc将工程根目录作为keil等工具的根目录,以keil为例,将会工程根目录生成7个文件和4个文件夹.上面`ra`开头的文件夹都不要进行修改,因为当再次生成工程时将被覆盖掉.
RASC只会拷贝配置过的外设的驱动文件,这么做的好处是生成的工程是最简的没有多余的文件, 缺点是当增删功能时就必须重新使用RASC进行配置.
FSP内关键概念:
- Modules模块: 外设驱动程序或软件算法.可能存在互相引用
- Module Instance模块实例: 模块的独立配置.如配置两个GPT即基于GPT module的两个Module instance.
- Interfaces接口: 即模块提供的外部接口.
- Instance实例: 接口功能的具体实现.
- Stacks堆: 模块可能需要互相配合,将模块与其相关的依赖合成为stack
### 软件设计
#### BSP
对于开发环境,每个人都有自己的选择.
首先,由于对各种eclipse魔改大乱斗的沉重心理阴影,对e2studio表示丑拒.其次,Rasc默认给出的配置结构不符合个人审美,无法同时生成多个IDE工程.况且,破电脑很旧了,能少装一个软件就少一个吧
##### FSP拆分
从[官方源](https://github.com/renesas/fsp)拉取最新的fsp驱动包.对于新入行的厂商和新发布的芯片,都推荐尽可能使用最新的官方驱动包,避免碰到官方已经修复的问题.当然,瑞萨肯定不算新厂商,但瑞萨19年才接触Arm内核发布RA系列,总体上看积累还是相较于其他一线大厂有差距.
```shell
.
└── ra
├── aws // Amazon FreeRTOS
├── board // 官方开发板支持包
├── fsp
│ ├── inc // 驱动头文件
│ ├── lib
│ └── src // 驱动源码
└── tes // Dave2D 图形库
```
fsp/lib/这个目录只有rm_zmod4xxx一个文件夹且里面只有一份"**瑞萨最终用户许可协议**.pdf".这让人很迷惑啊,回github网页看了下LICENSE,似乎是license的补充?这也不是文档的位置啊
##### AddFile
补充文件,官方源拉取的包内没有CMSIS部分,因此需要从arm那里搞一份复制过来.
FSP库整体的宏很多,主要用来通过RASC进行定义控制,没有找到有体系的介绍文件,因此只能碰到一个查找一个读代码.
代码使用了api封装,封装层存在多级嵌套,函数指针对查找不是很友好,而且一些位置引用风格不统一会隔层引用api,读起来有点慢.
初步实现脱离RASC配置的keil/iar/gcc(make,xmake)的简单点灯工程
![image.png](//image.lceda.cn/pullimage/vLxhaUYHEgBoFiQjg44gi91PZa6O1gNSOhtcljui.png)
#### Periph
##### ioport
RASC: FSP默认提供了ioport的stack.无需手动修改
没啥具体需要说的,初始化的时候需要注意一下,RA2E1的开漏需要按照端口接口设定NMOS/PMOS(RASC用户忽略此句).
##### sci->uart
RASC: 增加Connectivity->uart
默认发送方式为中断发送,调用`R_SCI_UART_Write`实际底层传递指针,并在发送中断中压入TDR(或TDRHL:9bit).因此提供给api的变量需要保持直到发送完成.且这个api是可覆盖的,即先发送"hello"后立即发送"world"时,world将覆盖hello中未发送的字节.甚至这就是个裸api连中断锁都没有,使用的时候需要注意一下.
默认接收方式为中断接收,可在中断回调事件`UART_EVENT_RX_CHAR`中读取
##### adc
RASC: 增加analog->adc
adc采集外部两路信号(供电电压,电流),和内部温度传感器和参考电源.要注意的是,RA2E1不支持同时采集内部温度传感器和参考电源.懒得分组,放弃采集温度了.
本来想着用连续模式+DMA(DTC)的,看了FAE的文章发现DTC使用的时候需要将缓冲buffer按照通道宽度定义,这很坑.比如使用通道0和通道7的时候,需要设定`uint16_t adc_buffer[8]`才可以,即使中间6个变量完全没用上都是0.
> 本质是,RA2E1内部为每路提供缓冲寄存器,而不是公用同一个数据寄存器.因此DTC需要从ADC->ADDR[0]地址增加至ADDR[7].
##### rtc
RASC: 增加timers->realtimeclock
- Parameter Checking->enable: 软件库自动配置星期数,也可自己通过蔡勒公式计算.
- Set soucre clock in open->enable: 在open函数内自动配置时钟.
- Clock Source->Sub-Clock: 配置为外部LSE时钟源.
- RTCOUT: P407
由于使能了RTCOUT,希望输出1pps信号点灯.实际发现FSP居然没有实现这功能,要不要这么半成品
> 功能不复杂就三行,先关闭RCR2的START位,置位RTCOE后再重新置位RCR2即可.
```c
R_RTC->RCR2_b.START = 0x00;
FSP_HARDWARE_REGISTER_WAIT( R_RTC->RCR2_b.START, 0x00 );
R_RTC->RCR2_b.RTCOE = 0x01;
FSP_HARDWARE_REGISTER_WAIT( R_RTC->RCR2_b.RTCOE, 0x01 );
R_RTC->RCR2_b.START = 0x01;
FSP_HARDWARE_REGISTER_WAIT( R_RTC->RCR2_b.START, 0x01 );
```
配置RTC后,首先要解决的是重复配置时间的问题,不然MCU重启后RTC就被重新配置成默认值了.一般的,通过使用Backup寄存器写入特定值来识别RTC已经配置过.但RA2E1没有Backup寄存器,因此需要使用其他方案.
- Flash: 这也是训练营官方方案.需要注意的是flash是有寿命的,且浪费2KB/1KB空间就存储个标志位,多少有点大材小用.
- Codeflash: 64KB,32bit写入,2KB擦除.擦写次数1000次(是的,只有一千次)
- dataflash(4KB),8bit写入,1KB擦除.擦写次数100000次
- SRAM: 由于RA2E1没有Vbat,因此当MCU掉电(SRAM清空)RTC也会停止.因此使用RTC期间需保持MCU持续运行,因此可将标志位写入SRAM中即可,通过`__no_init`配置变量在MCU软重启时不受影响即可.需注意部分低功耗模式下SRAM也会掉电.
##### ctsu
RASC: 增加CapTouhc->CTSU
> 注意: RASC仅能配置基础接口.官方提供里调参工具QE for touch但是只能在e2studio内使用(尽管都是eclipse的jar包,可能为了增加官方工具下载量吧),因此使用keil/IAR等工具的小伙伴们就需要手动调参啦(或者下载安装e2studio配置后将配置文件copy出来).
不想装软件,因此只好自己手动扣代码,无非就是调节几个阈值出来.串口先移植一个shell命令行会比较方便,推荐使用jscope等输出变量波形查看,调试会比较直观舒服一点.
##### gpt
RASC: 增加Timers->timer,general pwm
由于需要驱动WS2812,因此使用GPT的比较输出功能.
##### spi
未完待续.
### 总结
![image.png](//image.lceda.cn/pullimage/pRMZWvooCYKrzgWcW2fwuNt0MuAGpVXCKe7Qroae.png)
> 由于整体功能暂未完成,为符合训练营要求因此提交基础测试版本.附件提供附件仅包含:RTC1pps输出,LED信号灯闪烁,LED_WHT闪烁,电流电压检测,RTC,触摸按键,串口调试等简单功能
总体上来说,M23内核和M0开发模式相差不大,主要需要克服的难点为瑞萨的开发环境.由于瑞萨布局Arm内核不久,从工具链到手册都存在一些不足,但瑞萨更新频率很高,如DS当前版本为1.30在22年末更新,年初发布的1.20,20年末发布的1.10.软件驱动更新的频率还要更高,因此推荐时常关注一下更新(可以在官网订阅通知)