Hands-On 基于 Flagchip FC7300 MCAL-按键中断控制 LED

简介

         本文详细介绍如何使用 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   作者:扎根地下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值