Hands-On 基於 Flagchip FC7300 MCAL-按鍵中斷控制 LED

關鍵字 :FlagchipFC7300mcu開發板定時器

簡介

         本文詳細介紹如何使用 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   
作者:紮根地下


更多資訊,請掃碼關注我們!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論