AutoSar点灯
各位一灯大师,还在打电动哦,点个灯吧
-
硬件环境: S32K144Q176EVB
-
软件环境:(App)->Vector Davinci Developer
(BSW)->Vector Davinci Config
(MCAL)->EB treos + S32K14X_MCAL_4.2_RTM_HF3_1.0.1
如果你没有Vector工具链, 我也帮不了你 EB和MCAL可以在NXP官网免费下载安装激活
这篇文章只记录我在配置第一个Autosar工程中遇到的问题,至于软件安装请参考其他地方,至于其中的原理我也不是很懂,我也是初学者,我是参考了Vector的例程和一些网上的资料 -
1.MCAL配置
打开EB,File->New->Config Proj
这里注意选4.2.2,这里MCAL和EB已经关联起来
这里注意ECU ID应该和.dbc中对应 Target 选ARM/S32K14X 并勾选Auto add…(不勾选貌似会出错,我没勾选之后无法添加一些模块)
添加需要用到的MCAL模块,这里BASE和Resource默认添加就好,由于我们只需要点个灯所以Port和Dio是必要的,Mcu(时钟配置,电源模式配置)也是必要的,但是我不理解的是Can模块在例程中使用到了,为啥不在这里配置?
熟悉的界面兄弟们, 这里MCU这个模块就不配置了,因为现在还没仔细研究怎么配置,等会直接拷贝例程里面的Mcu_PBCfg.c就行,总之保持这里的默认配置待会肯定用不了会卡在时钟初始化
改一下名吧阿伟,EVB上LED GREEN对应引脚为PTE22
这里PCR = 32*PortE(4)+22
PortE对应ID=4
添加一个Ch 对应id为22 刚刚说了LED GREEN对应PTE22引脚
Generate Project一下
新建一个文件夹如图,待会用来存放总的配置工程
右键这儿, 选Im- and Exporter到处MCAL的配置文件xx.arxml
导出到刚刚新建的文件夹, 在里面新建一个文件MCAL_Config.arxml并选择
至此MCAL配置完成 -
2.App配置
这里先配置SWC这些
但是这里呢新建工程要先在Davinci Config中新建
在Cfg中新建工程,目录选刚建好的文件夹
选single file,其他保持默认
编译器我选iar,因为我装的是iar
在这里找到input files导入DBC,不导入dbc貌似工程啥都没有,我的dbc是直接用的例程里面的里面包含了诊断和网络管理报文
可以看到解析dbc过后有三个ECU节点,这里我们的ECU命名为MyECU
导入过后可以看到一些模块就自动生成好了,但还有很多错误,待会解决,然后倒入MCAL配置
先把这里Mcu模块删了,待会导入MCAL时会重新生成,怎么删呢?
点setting进去就可以delete单独模块
选中点红叉就行
选择我们刚刚在EB中导出的MCAL_Config.arxml
大家注意看Import Mode是Add,如果是在EB里面做了修改,这里可以选Merge或者Replace
可以看到Davinci cfg 已经导入了MCAL
这里先不要关Cfg,打开Davinci Developer待会可以同步
developer里选open work
目录如下,这个是在CFG里面生成的
新建一个SWC Type
再新建一个
新建一个Interface
这里的话IoHwAb 会有一个Runable(函数)SetLed(led_ch, led_state)供client调用,最终调用Dio驱动
双击编辑IoHwAb
新建一Pp供Rp调用,选择刚刚建立的Interface
Port Interface等概念呢只是抽象,最终要调用的是Runable
在IoHwAb SWC中新建Server Runable
好了兄弟们IoHwAb好了,那么Server通过Interface 端口 Pp提供给Client Rp Operations,那么这路就该配置Client LedBlinkSWC了
铁子们懂了吧
新建一个Runable 并设置Trig为周期性500ms触发
设置一下Access Point
新建个Irv用来记录LED 状态,是可以用Dio Flip来实现闪灯,但是我这里是在学习下Irv使用方法
点击这玩意,这是工程自动创建的
拖过来吧阿伟
Graphic->Draw Connector
developer 点一下保存
CFG就可以同步,App设计就完成,现在配置BSW
- 3.BSW配置
兄弟们,我是初学者我现在也不是很懂怎么配,所以大多数参考例程
可以看到Task没有,需要自己创建
先配置Isr好了,为啥是这几个Isr呢(根据导入的DBC生成,或许MCAL也会影响这里的生成),因为我们用了Can 然后SysTimer提供必要的Systick(心跳),为Alarm提供基准,所以也是默认生成的
这里的interrupt source
对比startup.s 和例程中的Os_Hal_Entry_Lcfg.c就可以看出中断源分别为94 97 98
优先级设为小于32(数字大于32,数字越高,优先级越低,比如NMI的优先级为0),因为这里是CAT2中断,优先级高于32的是CAT1不受OS管理,没有统一的入口函数,低于32的为CAT2受OS管理,入口统一,中断下半部都放到一个Thread中跑
为BSW搞一个Task吧,具体怎么配现在不知道
再搞一个Task 跑LED灯吧
再搞一个InitTask吧,里面要进行EcuM_StartupToo 进行BSW初始化和RteStart, 当时调试发现如果不调用SchM_Init 和 Rte_Start 配置好的Alarm没有被设置周期,也就不会周期性触发事件,Task得不到运行
待会再回来配置OS,这个Task搞成Basic(只调用一次),并且要AutoStart(不然不会加入Schedule),由于它优先级比较高,所以会在StartOS后首先被调用并执行一次
直接根据提示设置
这里要把Entry 改为 Reset_Handler 因为在Os_Hal_Entry_Lcfg.c中会重建中断向量表,这个函数定义在Startup.s
这里SysTimer的 Tick Per Base设置为8000(参考例程) 否则这个定时器中断太快,会发生Overload(来不及处理,当时我没配置这里在Error_Hook里面发现了这个问题)
Can里面添加Clock Ref
波特率按照推荐配置
添加Counter Ref
由于闪个灯不需要网络管理,所以这里直接删除CanNm 和Nm模块,由于诊断功能这里也不配置,删除CanTp和Dcm
由于删除了Nm所以这里改为NONE
可以看到I-PDU里面很多消息没有被匹配(网络管理和诊断),在EcuC 和PduR中删除即可
PduR就保留这么几帧消息
Rte里面把BSW Runable map到Task中去
验证通过了,表示可以生成代码了,其实中间还有一些步骤主要是根据CFG提升修改,为什么这么修改我现在也不是很懂,这篇文章只是做一下笔记,记录我遇到的问题,下篇文章将用IAR进行工程集成,编译,调试