超详细教程 | Hands-On 基于 Flagchip FC4150 MCAL-按键中断控制 LED灯

简介

         本文将详细介绍如何使用 EB 工具配置 Flagchip FC4150 MCAL 按键(Key1) 中断控制 LED。并重点强调了配置 icu 模块的过程以及对 icu 模块的详细解释。其中所使用到的模块有 mcu、port、dio、icu ,本文是基于“Flagchip FC4150 MCAL-点亮 LED 灯”这篇博文中增加 ICU 的内容, mcu、port、dio 模块可参考上一篇博文。

硬件平台:旗芯微 FC4150 DEMO BOARD V2 开发板

软件平台:EB tresos 28.1.0 、Flagchip_FC_IDE 4.04

MCAL: V1.1.0 & V1.1.1

一、MCAL 配置

          1.1 配置 MCU 模块

         根据 demo board LED原理图所示,我们需要在 MCU 模块-> PCC 下添加 Port B 、C、D 的外设并配置为时钟使能

▲ 图 1.1.1

▲ 图 1.1.2 

▲ 图 1.1.3

        1.2 配置 PORT 模块

        进入 Port C  的 PortPin 界面下,添加  PTC28 引脚并命名为 KEY1,配置 PTC28 为 GPIO 、输入模式,默认电平为高。LED port 配置已在上一篇博文中配置完成。

▲ 图 1.2

1.3 配置 ICU 模块

1.3.1 在 Module Configurations 中添加  ICU 模块,在 ICU 模块中的  IcuPort 下添加 Port_C。

▲ 图 1.3.1 

1.3.2 在 ICU 模块中的  IcuChannel 下添加通道。

▲ 图 1.3.2 

            1.3.3 双击 Index 3 进入 IcuChannel 的配置界面,选择 Icu Hardware Module 为 PORT_C,Channel Of Hardware Module 修改为 28 ,选择边沿检测方式为下降沿,检测方式为信号边沿检测,填入边沿检测名字和回调函数名字

▲ 图 1.3.3

二、示例代码解析

2.1 将 EB 配置好的工程编译并更新代码至 FCIDE 中

2.2 Main 函数

       将 Bsp_Icu_Init 函数取消屏蔽

▲ 图 2.2

2.3  Icu_PBcfg.c

我们可以看到 PORTC-28 在 EB 工具配置好的属性与回调函数的声明


▲ 图 2.3

2.4 Bsp_Icu.c

       2.4.1 demo 示例中已经提供了 Icu_Key1_Edge_Detect 函数实体,我们需要添加 Dio_FlipChannel 函数使 LED 灯翻转

▲ 图 2.4.1

2.4.2 找到 Bsp_Icu_Init  这是 demo 示例对 MCAL API 的调用

▲ 图 2.4.2

三、烧录 & 调试

3.1 将工程编译并烧录到开发板

观察 3 颗 LED ,初始化时灯为亮,当按键按下时灯熄灭,再次按下灯点亮。

▲ 图 3.1

四、MCAL ICU 模块详解

FC4150 ICU 模块提供边沿计数、信号边沿检测通知、周期性信号时间测量、边沿时间戳捕获、中断唤醒等功能

4.1 General 配置

▲ 图 4.1

① IcuConfigSet

  • IcuMaxChannel:在 IcuChannel 内添加通道后需在 IcuMaxChannel 输入通道数量

② IcuGeneral

  • IcuDevErrorDetect:Icu 模块开发错误检测使能
  • IcuReportWakeupSource:开启唤醒源上报
  • IcuOverflowTimeStatistics:用来信号测量,ICU Mode 选择 Icu_mode_signal_Messurement,溢出了后还可以再计数,计数值不会清零,用来延长计时时间

       ③ 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、B、C、D、E 这些端口用于引脚中断。

▲ 图 4.4

4.5 IcuAontmr 配置

       做定时唤醒使用

▲ 图 4.5

4.6 PublishedInformation ICU 模块版本信息

4.7 ICU 模块常用接口函数

  • Icu_Init: 初始化 ICU 模块
  • Icu_DeInit:将 ICU 模块复位至默认状态
  • Icu_SetMode: 设置 ICU 工作模式
  • Icu_DisableWakeup :失能单个 ICU 通道唤醒功能
  • Icu_EnableWakeup:  使能单个 ICU 通道唤醒功能
  • Icu_EnableNotification:使能单个 ICU 通道通知功能
  • Icu_DisableNotification: 失能单个 ICU 通道通知功能
  • Icu_EnableEdgeDetection:使能单个 ICU 通道边沿检测功能
  • Icu_DisableEdgeDetection: 失能单个 ICU 通道边沿检测功能
  • Icu_GetInputState:返回单个 ICU 通道 输入引脚状态
  • Icu_SetActivationCondition:设置单个 ICU 通道 输入引脚边沿检测模式
  • Icu_ResetEdgeCount:将单个 ICU 通道的边沿计数设置为 0
  • Icu_EnableEdgeCount:使能单个 ICU 通道的边沿计数功能
  • Icu_DisableEdgeCount: 失能单个 ICU 通道的边沿计数功能
  • Icu_GetEdgeNumbers:读单个 ICU 通道的边沿计数值
  • Icu_StartTimestamp:开启单个 ICU 通道边沿捕获时间计数
  • Icu_StopTimestamp:停止单个 ICU 通道边沿捕获时间计数
  • Icu_GetTimestampIndex: 读单个 ICU 通道的时间戳
  • Icu_StartSignalMeasurement:开始对单个 ICU 通道信号进行测量
  • Icu_StopSignalMeasurement: 停止对单个 ICU 通道信号进行测量
  • Icu_GetTimeElapsed:读取单个 ICU 通道的信号周期时间
  • Icu_GetDutyCycleValues:读取单个 ICU 通道的 PWM 周期与占空比
  • Icu_GetInputLevel:读取单个 ICU 通道的当前输入电平
  • Icu_GetVersionInfo: 获取 ICU 模块版本信息

五、总结

       本文以按键中断控制 LED 为示例,详细介绍了如何配置和使用 ICU(Interrupt Control Unit)模块,通过本文的讲解,读者可以了解到如何正确配置 ICU 模块,以实现 Port 中断的功能。

六、参考文献

(1)  AUTOSAR_SWS_IcuDriver.pdf

(2)  FC4150 Reference Manual V3.0.pdf

欢迎在博文下方留言评论,我们会及时回复您的问题。

如有更多需求,欢迎联系大联大世平集团 ATU 部门:atu.sh@wpi-group.com   作者:Memory

更多资讯,请扫码关注我们!

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值