分析完硬件定时器框架和瑞萨已经适配的硬件定时器部分,接下来就是实际地适配硬件定时器了。
硬件资源
从RA6M5规格书上可以看到,RA6M5支持6个32位通用定时器 和 4个16位通用定时器(支持pwm输出功能)。
软件配置
Kconfig增加硬件定时器选项
通过查看瑞萨驱动目录中地SConscript文件,会发现硬件定时器对应地宏名为BSP_USING_TIM,因此只需要搜索瑞萨平台仓库,找到适配过硬件定时器地板卡,将其对应地Kconfig配置中硬件定时器部分复制到启明6M5板卡上即可,具体修改如下。
从RA6M3目录拷贝timer_config.h至ra6m5目录下
因为找到的带硬件定时器的板卡为RA6M3,因此就从此芯片的配置中拷贝文件。
menuconfig打开定时器开关
配好后保存再在emu环境中运行scons --target=mdk5
FSP设置
以timer0为例
修改代码
由于drv_hwtimer.c中已经写好了硬件定时器测试接口,因此不需要再去写新的测试代码,直接使用即可。但是由于原始的hwtimer定时器驱动仅仅适配了RA6M3,因此需要修改一下代码配置(在数组const rt_uint32_t PLCKD_FREQ_PRESCALER[PLCKD_PRESCALER_MAX_SELECT]中添加RA6M5配置)
const rt_uint32_t PLCKD_FREQ_PRESCALER[PLCKD_PRESCALER_MAX_SELECT] = { #ifdef SOC_SERIES_R7FA6M3 PLCKD_PRESCALER_120M, PLCKD_PRESCALER_60M, PLCKD_PRESCALER_30M, PLCKD_PRESCALER_15M, PLCKD_PRESCALER_7_5M, PLCKD_PRESCALER_3_75M, PLCKD_PRESCALER_1_875M, #endif #ifdef SOC_SERIES_R7FA6M5 // 添加部分 PLCKD_PRESCALER_120M, PLCKD_PRESCALER_60M, PLCKD_PRESCALER_30M, PLCKD_PRESCALER_15M, PLCKD_PRESCALER_7_5M, PLCKD_PRESCALER_3_75M, PLCKD_PRESCALER_1_875M, #endif };
另外,由于目前plld时钟配置是100M,明显速率过高(32位计数器都不够用了),需要手动将PLLD时钟降下来,我改成配置在6.25M(rtthread框架曾看,是要求设置到1M,但实在设不下去了,再低串口打印就乱码了),具体修改如下:
功能验证
Hello RT-Thread! msh > msh > msh >hw hwtimer_sample msh >hwtimer_sample Read: Sec = 1, Usec = 0 msh >this is hwtimer timeout callback fucntion! tick is :3422 ! this is hwtimer timeout callback fucntion! tick is :3718 ! this is hwtimer timeout callback fucntion! tick is :4014 ! this is hwtimer timeout callback fucntion! tick is :4310 ! this is hwtimer timeout callback fucntion! tick is :4606 ! this is hwtimer timeout callback fucntion! tick is :4902 ! this is hwtimer timeout callback fucntion! tick is :5198 ! this is hwtimer timeout callback fucntion! tick is :5494 ! this is hwtimer timeout callback fucntion! tick is :5790 ! this is hwtimer timeout callback fucntion! tick is :6086 ! this is hwtimer timeout callback fucntion! tick is :6382 ! this is hwtimer timeout callback fucntion! tick is :6678 ! this is hwtimer timeout callback fucntion! tick is :6974 !
此时会发现硬件定时器的计数明显偏快(按照msh测试代码的写法,tick is的差值应该在1000左右才是正确的),但目前配置已经不能更慢了,只能到这程度(也可能是自己没找到正确的适配方法,毕竟看测试代码,那打印逻辑,像是在ra6m3上正确跑起来的)。验证完timer0后,仅需要将测试文件中的定时器指定成timer1,便可测试timer1 。
总结 至此,硬件定时器部分已经适配完毕,遗留一个硬件定时器定时不准的问题待解决。由于瑞萨目前驱动文件仅仅适配了timer0和timer1,若需要适配剩余的8个timer,则需要自行修改drv_hwtimer.c和板级的timer_config.h和Kconfig文件,修改量不算大,仅仅是复制粘贴罢了。