简介
本文详细介绍如何使用 EB 工具配置 Flagchip FC7300 MCAL 按键(Key3)中断控制 LED。首先以实例的方式介绍 Icu 功能的配置过程,对于这个实例中的相关模块(MCU、EcuC、Common、OS、Port、Dio)的功能介绍,请查看本网站的其他相关博文。
硬件平台:旗芯微 FC7300 Demo Board V2 开发板
软件平台:EB tresos 28.1.0 、Flagchip_FC_IDE 4.07
AUTOSAR 版本:V4.6.0
FC7300 MCAL版本:0.4.0
一、MCAL 配置
1.1 配置 MCU 模块
如图 1.1.2 所示为 demo board LED 原理图,为了进行点亮 LED 灯的配置,我们需要确保 Port A 、PortD 的外设时钟配置为使能。
▲ 图 1.1.1
▲ 图 1.1.2
1.2 配置 PORT 模块
进入 Port A 的 PortPin 界面下,添加 PTA11 引脚并命名为 KEY3,配置 PTA11 为 GPIO 、输入模式,默认电平为低。LED port 配置请查看本网站的其他相关博文。
▲ 图 1.2
1.3 配置 ICU 模块
1.3.1 在 Module Configurations 中添加 ICU 模块,在 ICU 模块中的 IcuPort 下添加 Port_A。
▲ 图 1.3.1
1.3.2 在 ICU 模块中的 IcuChannel 下添加通道。
▲ 图 1.3.2
1.3.3 双击 Index 2 进入 IcuChannel 的配置界面,选择 Icu Hardware Module 为 PORT_A,Channel Of Hardware Module 修改为 11 ,选择边沿检测方式为上升沿,检测方式为信号边沿检测,填入边沿检测名字和回调函数名字。
▲ 图 1.3.3
二、示例代码解析
2.1 将 EB 配置好的工程编译并更新代码至 FCIDE 中。
2.2 Main 函数
调用 Bsp_Icu_Init 函数。
▲ 图 2.2
- Bsp_Mcu_Init(); MCU 初始化。
- Bsp_Port_Init(); PORT 初始化,将 LED1、LED2、LED3 对应的 PORT 引脚初始化为 GPIO 模式,初始状态为高电平,所以这个初始化程序结束之后 LED 被点亮。
- Bsp_Icu_Init(); Icu 初始化,将 Key3 IO 配置为 PORT_A_11,选择边沿检测方式为上升沿,检测方式为信号边沿检测,使能 PORT_A 中断,使能 Key3 回调函数。
2.3 Icu_PBcfg.c
我们可以看到 PORTA_11 在 EB 工具配置好的属性与回调函数的声明。
▲ 图 2.3
2.4 Bsp_Icu.c
2.4.1 demo 示例中已经提供了 Icu_Key3_Edge_Detect 函数实体,我们需要添加 Bsp_FlipLed 函数使 LED 灯翻转。
▲ 图 2.4.1
2.4.2 找到 Bsp_Icu_Init 这是 demo 示例对 MCAL API 的调用。
IntMgr_SetPriority(PORTA_IRQn, 4);设置 PORTA 中断极性。
IntMgr_EnableInterrupt(PORTA_IRQn);使能 PORTA 中断。
▲ 图 2.4.2
三、烧录 & 调试
3.1 将工程编译并烧录到开发板
观察 3 颗 LED ,初始化时灯为亮,当按键 Key3 按下时灯熄灭,再次按下灯点亮。
▲ 图 3.1
四、MCAL ICU 模块详解
FC7300 ICU 模块提供边沿计数、信号边沿检测通知、周期性信号时间测量、边沿时间戳捕获、中断唤醒等功能。
4.1 General 配置
▲ 图 4.1
① IcuConfigSet
- IcuMaxChannel:在 IcuChannel 内添加通道后需在 IcuMaxChannel 输入通道数量
②IcuGeneral
- IcuDevErrorDetect:Icu 模块开发错误检测使能
- IcuReportWakeupSource:开启唤醒源上报
- IcuOverflowTimeStatistics:用来信号测量,ICU Mode 选择 Icu_mode_signal_Messurement,溢出了后还可以再计数,计数值不会清零,用来延长计时时间
- Icu MultiCore Support :Icu 支持多核
③IcuNonAUTOSAR
- IcuGetInputLevelApi :启用后,该函数可以返回输入引脚状态
- IcuOverflowNotificationApi:使能溢出后的回调通知函数
④IcuOptionalApis
根据功能需要,配置某个 API 使能,如 IcuDeInitApi 取消初始化 ICU 模块、Icu(Disable/Enable)WakeupApi 禁用或启用某个 ICU 通道的唤醒源、IcuSetModeApi 设置 ICU(正常/睡眠)模式等。
4.2 IcuChannel配置
添加对应 ICU 的通道来配置测量模式
▲ 图 4.2
- Icu Hardware Module :选择外设模块,选择外设模块前需要在 IcuFtu 或 IcuPort 中先添加
- Channel Of Hardware Module:选择外设通道
- IcuDefaultStartEdge :选择信号触发边沿
- IcuMeasurementMode:选择信号测量方式
- IcuOverflowNotification:填写定时溢出后的回调函数名称,需联合配置 IcuOverflowTimeStatistics, IcuOverflowNotificationApi
- IcuWakeupCapability:启用该通道的唤醒源
①IcuSignalEdgeDetection
当选择信号边沿触发时,需要在 IcuSignalNotification 填入回调函数名称
②IcuSignalMeasurement
当选择信号测量时,需要在 IcuSignalMeasurementProperty 填入测量类型,此类型不能在运行时更改
③IcuTimestampMeasurement
当时间戳测量时,在 IcuTimestampMeasurementProperty 选择循环缓冲区或线性缓冲区模式。在 IcuTimestampNotification 中填入回调函数名称,如果获取了请求时间戳的数量(时间戳通知>0)时,会调用回调函数的使用
④IcuWakeup
当 IcuWakeupCapability 启用,且 IcuChannelWakeupInfo 启用后,则会将唤醒源信号传递给 ECU 抽象层
4.3 IcuFtu 配置
▲ 图 4.3
- Ftu Hardware Module:选择 Ftux 外设
- Icu FlexTimer clock source:选择 Ftu 模块的时钟源
- Icu FlexTimer Prescale:配置 Ftu 模块的分频系数
- Icu FlexTimer Period Value:设定周期值
- Icu FlexTimer Channel Filter Prescaler:配置 Ftu 通道滤波器的分频系数
- Icu FlexTimer - Channel 0、1、2、3 Input Filter value:Ftu 通道滤波时间,0-15 可选,0 则不滤波
4.4 IcuPort 配置
可以添加 Port A 这些端口用于引脚中断。
▲ 图 4.4
4.5 IcuAontmr 配置
做定时唤醒使用
▲ 图 4.5
- IcuAontmrChannelClkSrc:Icu 定时器通道时钟源选择
- IcuAontmrPrescalerEnable:定时器计数器模式下使能预分频器,在脉冲模式下使能脉冲滤波器
- IcuAontmrPrescaler:配置脉冲计数器模式下的毛刺过滤器时钟源的预分频
- IcuAontmrPinSelect:配置脉冲计数器模式下使用的时钟输入源
- IcuAontmrPartitionRef:将 lcu Aontimer 实例映射到 ECU 分区
4.6 Icu Cmp
比较器
▲ 图 4.6
- Icu Cmp Hardware Module:Icu 比较器硬件模块选择,CMP0、CMP1、CMP2
- IcuCmpFunctionMode:功能模式选择
- IcuCmpPositiveInputSrc:选择比较器正输入源,数模转换器或多路复用器
- IcuCmpNegativeInputSrc:选择比较器负输入源,数模转换器或多路复用器
- IcuCmpPositiveInputMuxSelect:选择正输入多路复用器
- IcuCmpNegativeInputMuxSelect:选择负输入多路复用器
- Icu Filter Sample Period:指定比较器输出滤波器的采样周期(以总线时钟周期为单位)
- IcuCmpFilterCnt:选择 CMP 过滤器计数号。注意:过滤器计数器可能在某些功能模式下禁用
- IcuCmpHystCtrlType:选择比较器硬块滞环控制
- IcuCmpStopModeEnable:在 STOP 模式下启用模拟比较器或 DAC
- IcuCmpHighSpeedMode:比较器高速模式,加快了转换速度,但同时也增加了功耗
① IcuCmpDacConfig:数模转换器的配置
- IcuCmpDacEnableSrc:如果选择 ICU_CMP_DACENABLE_DCR,则 DCRIDAC_EN] 启用 CMP DAC。如果选择 ICU_CMP_DACENABLE_CCRO,则 CCR O[EN] 启用 CMP DAC
- IcuCmpDacDcrEnable:通过使能 DCR[DCR_EN] 使能 Dac
- IcuCmpDacReference:Dac 参考电压源选择
- Icu Dac Voltage:DAC 输出电压选择,该位从 256 个不同电平中选择一个输出电压 DACO=(Vin/256)*(DAC_DATA+1),所以 DACO 的范围是从 Vin/256 到 Vin
②IcuCmpOutPinConfig:比较器输出引脚配置
- IcuCmpOutPinEnable:CMPO 输出使能
- IcuCmpDacReference:CMPO 输出源选择,滤波比较器输出或未过滤的比较器输出
③IcuCmpWindowConfig:比较器窗口配置
- IcuCmpWinOutUserDef:当窗口关闭时,用户可以定义 CMPOUT_WIN 级别
- IcuCmpOutWinUserDefLevel:选择 CMPOUT_WIN 级别
- IcuCmpCloseWindowEnable:使能比较器关闭窗口
- IcuCmpCloseWinEvent:选择导致 Cmp 窗口关闭的事件,上升沿、下降沿、双边沿
- IcuCmpInvSampleEnable:反转 WINDOW/SAMPLE 信号(仅用于窗口模式)
- IcuCmpPartitionRef:将 lcu Cmp 实例映射到 ECUC 分区
4.7 PublishedInformation ICU 模块版本信息
4.8 ICU 模块常用接口函数
- Icu_Init: 初始化 ICU 模块
- Icu_DeInit:将 ICU 模块复位至默认状态
- Icu_SetMode: 设置ICU模块的模式,Sleep 或者是 Normal
- Icu_DisableWakeup :禁用单个 ICU 通道唤醒功能
- Icu_EnableWakeup: 使能单个 ICU 通道唤醒功能
- Icu_CheckWakeup: 检查具有唤醒功能的 ICU 通道是否是唤醒事件的源,如果是有效的 ICU 通道唤醒事件,则调用 ECU 状态管理器服务 EcuMSetWakeupEvent
- Icu_SetActivationCondition:设置单个 ICU 通道 输入引脚边沿检测模式
- Icu_DisableNotification: 失能单个 ICU 通道通知功能
- Icu_EnableNotification:使能单个 ICU 通道通知功能
- Icu_GetInputState:返回单个 ICU 通道 输入引脚状态
- Icu_StartTimestamp:开启单个 ICU 通道边沿捕获时间计数
- Icu_StopTimestamp:停止单个 ICU 通道边沿捕获时间计数
- Icu_GetTimestampIndex: 读单个 ICU 通道的时间戳
- Icu_ResetEdgeCount:将单个 ICU 通道的边沿计数设置为 0
- Icu_EnableEdgeCount:使能单个 ICU 通道的边沿计数功能
- Icu_EnableEdgeDetection:使能单个 ICU 通道边沿检测功能
- Icu_DisableEdgeDetection: 失能单个 ICU 通道边沿检测功能
- Icu_DisableEdgeCount: 失能单个 ICU 通道的边沿计数功能
- Icu_GetEdgeNumbers:读单个 ICU 通道的边沿计数值
- Icu_StartSignalMeasurement:开始对单个 ICU 通道信号进行测量
- Icu_StopSignalMeasurement: 停止对单个 ICU 通道信号进行测量
- Icu_GetTimeElapsed:读取单个 ICU 通道的信号周期时间
- Icu_GetDutyCycleValues:读取单个 ICU 通道的 PWM 周期与占空比
- Icu_GetVersionInfo: 获取 ICU 模块版本信息
- Icu_GetInputLevel:读取单个 ICU 通道的当前输入电平
五、总结
本文以按键中断控制 LED 为示例,详细介绍了如何配置和使用 ICU(Interrupt Control Unit)模块,通过本文的讲解,读者可以了解到如何正确配置 ICU 模块,以实现 Port 中断的功能。如果有问题,可以发送邮件 atu.sh@wpi-group.com与我们联系。
六、参考文献
(1) AUTOSAR_SWS_IcuDriver.pdf
(2) FC7300 Reference Manual V0.6.pdf
如有疑问,欢迎点击此处在原文下方留言评论,我们会及时回复您的问题。
如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com 作者:扎根地下