User Tools

Site Tools

blog:2023-12-01_nxp_mpc5744p_adc_isr_sample_not_complete



2023-12-01 NXP MPC5744P ADC_ISR Sample (Not Complete)

  • This sample is NXP MPC5744P ADC_ISR Sample
  • It should have some problem, but the comments can be a reference

Reference Code

  • /************************************************* ******* ****************************/
    /* 檔名:intc_SW_mode_isr_vectors_MPC5744P.c COPYRIGHT(c) Freescale 2015 */
    /* 保留所有權利*/
    /* 描述:軟體向量模式下 INTC 的 MPC5744P ISR 向量 */
    /* 基於 MPC5744P 參考手冊 rev 5.1 表 7-20。*/
    /* 用法:對於所需的向量 #,將“dummy”替換為 ISR 名稱並聲明 */ /
    * 您的 ISR 名稱 extern 如下例所示: */ /
    * extern void MyPeripheralISR(void); */
    /* */
    /******************************************* ***** **********************************/
    /* 修訂作者日期 變更說明 */
    / * --- ----------- ---------- --------------------- */
    /* 1.0 S 米哈利克03 2015 年 8 月 初始版本 */
    /*********************************** ************* **********************************/
    #include "typedefs.h"
    /*====== ======================================= ============== ===============*/
    /* 原型 */
    /*============ ============== ====================================== =============*/
    void dummy(void);
    //extern void ETimer_ISR(void);
    extern void ADC_ISR(void);
    
    /*================================================== == ========================*/
    /* 全域變數 */
    /*============== == ================================================== === ======*/
    
    const uint32_t __attribute__ ((section (".intc_vector_table"))) IntcIsrVectorTable[] = {
    
    (uint32_t) &dummy, /* 向量 # 496 ADC_EOC ADC_0 */
    (uint32_t) &dummy, /* 向量 # 497 ADC_ER ADC_0 */ (
    uint32_t) &dummy, /* ADC_ER ADC_0 */
    ( uint32_t) &dummy, /* 向量 # 498 ADC_m # 499 保留給ADC ADC_0 */
    
    (uint32_t) &ADC_ISR, /* 向量 # 500 ADC_EOC ADC_1 */
    (uint32_t) &dummy, /* 向量 # 501 ADC_ER ADC_1 */ (uint32_ /* 向量
    # 501 ADC_ER ADC_1 */ (uint32_ /
    (uint32_t) &dummy, /* 向量# 503 為ADC ADC_1 保留*/
    (uint32_t) &dummy, /* 向量 # 504 ADC_EOC ADC_2 *
    /
    (uint32_t) &dummy, /* 向量 (205) * 矢量# 506 ADC_WD ADC_2 */
    (uint32_t) &dummy, /* 矢量 # 507 為 ADC ADC_2 保留 */ (uint32_t
    ) &dummy, /* 矢量 # 508 ADC_EOC ADC_3 */
    (uint32_t) &dummy, /* 矢量 # 509 ADC_ER ADC_3 */
    (uint32_t) &dummy, /* 向量 # 510 ADC_WD ADC_3 */
    
    };
    
    
    void dummy (void) { /* 用來捕捉未定義 ISR 的虛擬 ISR 向量 */
    while (1) {}; /* 永遠等待或看門狗超時 */
    }
    
    “main.c”
    
    
    #include "derivative.h" /* 包含週邊宣告 */
    
    #include“project.h”
    #include“mode_entry.h”
    #include“adc.h”
    
    /************************************************* ******* ******************************
    * 常數和巨集
    ********** ****** ******************************************** ********** *************/
    #define LED1_pin 43
    
    
    /************************************************* ******* ******************************
    * 函數原型
    ********** ******** ****************************************** ************ ************/
    static void SysClk_Init(void);
    //static void InitPeriClkGen(void);
    static void GPIO_Init(void);
    static void HW_Init(void);
    static void ETimer_Init(void);
    static void FlexPWM_Init(void);
    void ETimer_ISR(void);
    void CTU_Init(void);
    static void ADC_Init(void);
    
    // 對於 adc
    
    void update_LEDs(void); /* 使用縮放後的 chan 9 結果更新 LED */
    extern uint16_t Result[3]; /* ADC 頻道轉換結果 */
    extern uint16_t ResultInMv[0];
    
    
    extern void xcptn_xmpl (void);
    
    
    #define AUX0_clk_DIV1 7
    #define SGEN_IOFREQ 1600
    
    #define AUX0_clk_DIV0 0
    #define PWM_PRESCALER 0
    #define PWM_MODULO 1600
    
    //etimer
    int adc_count=0;
    int etimer_cnt = 0;
    uint16_t result[3];
    float Duty=0.7,ADC_SCALE_I=0;
    float VHsen = 0,VLsen = 0;
    float VHfil = 0,VLfil = 0;
    float Isen[3] = {0,0,0};
    
    
    /************************************************* ******* ******************************
    * 本機函數
    ********** ******** ****************************************** ************ **********/
    
    
    /************************************************* ******* ******************************
    函數名稱:HW_init
    工程師:Martin Kovar
    日期:2015 年12月29 日
    參數:
    修改:
    返回:
    註解:為本範例目的而初始化硬體
    問題:
    ****************************** ****** ******************************************** **/
    static void HW_Init(無效)
    {
      xcptn_xmpl (); /* 設定並啟用中斷 */
      SysClk_Init();
      // InitPeriClkGen();
      GPIO_Init();
      FlexPWM_Init();
    }
    
    
    /************************************************* ******* ******************************
    函數名稱:Sys_Init
    工程師:Martin Kovar
    日期:2015 年12月29 日
    參數:無
    修改: NONE
    返回:NONE
    註釋:啟用 XOSC、PLL0、PLL1 並進入 RUN0,其中 PLL1 作為 sys clk (200 MHz)
    問題:NONE
    ************** ********** **************************************** ************** ******/
    // 啟用 XOSC、PLL0、PLL1 並進入 RUN0,PLL1 作為 sys clk (200 MHz)
    void SysClk_Init(void)
    {
    
      MC_CGM.AC3_SC.B.SELCTL = 0x01;//將40 MHz XOSC連接到PLL0輸入
    
      //MC_CGM.AC4_SC.B.SELCTL = 0x11; //將40 MHz XOSC連接到PLL1輸入 
    
      /* 將 PLL1 編程為與 PLL0 相同的頻率。
      * MFD 將輸入至少乘以 10。因此乘以 10 再除以 10。
      * 10/10 = 1,因此頻率與 PLL0 相同
      */
      PLLDIG.PLL1DV.B.RFDPHI = 10;
      PLLDIG.PLL1DV.B.MFD = 10;
    
      // 將 PLL0 設定為 60MHz(PHI)、50MHz(PHI1),具有 40MHz XOSC 參考 // PLL0 時脈分頻 -> 60MHz(PHI)、50MHz(PHI1) 
      // PLLDIG.PLL0DV.R = 0x3008100A; 
      // PREDIV = 1,MFD = 10,RFDPHI = 8,RFDPHI1 = 6
      PLLDIG.PLL0DV.B.RFDPHI1 = 8;//6 4. 320MHz -div 8-> 40MHz PHI1
      PLLDIG.PLL0DV.B.RFDPHI = 1; //8 3. 320MHz -div 1-> 320MHz PHI
      PLLDIG.PLL0DV.B.PREDIV = 2; //1 1. 40MHz -div 2 -> 20MHz
      PLLDIG.PLL0DV.B.MFD = 16; //10 2. 20MHz-乘16-> 320MHz'
    
      // MC_ME.RUN0_MC.R = 0x00130071; // RUN0 cfg: IRC ON,OSC0 ON,,PLL1 OFF, PLL0 ON, sysclk=XOSC(40MHz) 
      MC_ME.RUN0_MC.B.PWRLVL = 0; // 功率等級 -> 
      MC_ME.RUN0_MC.B.PDO = 0; // I/O 輸出掉電控制 -
      MC_ME.RUN0_MC.B.MVRON = 1; // 主電壓調節器控制 -> 
      MC_ME.RUN0_MC.B.FLAON = 3; // Flash掉電控制 -> 11:Flash處於正常模式 
      MC_ME.RUN0_MC.B.PLL1ON = 0; // PLL1 停用
      MC_ME.RUN0_MC.B.PLL0ON = 1; // PLL0 啟用
      MC_ME.RUN0_MC.B.XOSCON = 1; // XOSC 啟用 -> MC_CGM.AC3_SC.B.SELCTL = 0x01; 
      MC_ME.RUN0_MC.B.IRCON = 1;// IRCON 啟用 -> MC_CGM.AC3_SC.B.SELCTL = 0x00; 
      MC_ME.RUN0_MC.B.SYSCLK = 1;// 系統時鐘選擇器 -> 系統時鐘
    
      //MC_CGM.SC_DC0.R = 0x80030000; // PBRIDGE0/PBRIDGE1_CLK 在 syst clk 除以 1 ... (20 MHz)
    
      // 模式轉換進入 RUN0 模式:
      MC_ME.MCTL.R = 0x40005AF0; // 進入 RUN0 模式 & 按鍵
      MC_ME.MCTL.R = 0x4000A50F; // 進入 RUN0 模式並反轉按鍵 //
      while (MC_ME.GS.B.S_MTRANS) {}; // 等待模式轉換完成
      while(MC_ME.GS.B.S_CURRENT_MODE != 4) {}; // 驗證 RUN0 是目前模式
    
      // 使用 40MHz XOSC 參考將 PLL1 設定為 200 MHz
      PLLDIG.PLL1DV.R = 0x00020014; // MFD = 20,RF​​DPHI = 2
      MC_ME.RUN_PC[0].R = 0x000000FE;// 啟用週邊在所有模式下執行
      MC_ME.PCTL239.B.RUN_CFG = 0; //使SGEN遵循RUN_PC[0]
      MC_ME.PCTL255.B.RUN_CFG = 0; //使FlexPWM0遵循RUN_PC[0]
      MC_ME.RUN0_MC.R = 0x001300F4; // RUN0 設定:IRCON、OSC0ON、PLL1ON、syclk=PLL1
    
      //adc_ 為所有 RUN 模式啟用外圍時脈
      MC_ME.RUN_PC[1].R = 0x000000FE; // 啟用週邊在所有模式下執行
      MC_ME.PCTL126.B.RUN_CFG = 0x1;
      MC_CGM.AC0_DC2.R = 0x80040000;//啟用ADC_CLK並將PLL0_PHI來源除以5(即4+1)
    
      // 模式轉換進入 RUN0 模式:
      MC_ME.MCTL.R = 0x40005AF0; // 進入 RUN0 模式 & 按鍵
      MC_ME.MCTL.R = 0x4000A50F; // 進入 RUN0 模式並反轉按鍵
      while (MC_ME.GS.B.S_MTRANS) {}; // 等待模式轉換完成
      while(MC_ME.GS.B.S_CURRENT_MODE != 4) {}; // 驗證 RUN0 是目前模式
    
      // 設定週邊時脈
      MC_CGM.AC0_SC.R = 0x02000000; // 選擇 PLL0 作為輔助時脈 0
      MC_CGM.AC0_DC0.B.DE = 1;
      MC_CGM.AC0_DC0.B.DIV = 1; // MOTC_CLK : 啟用 aux clk 0 除以 1 
      MC_CGM.AC0_DC2.B.DE = 1;
      MC_CGM.AC0_DC2.B.DIV = 3; // ADC_CLK:啟用輔助時脈 0 除以 3 (80 MHz)
    
    
      MC_ME.DRUN_MC.R = 0x00130072;
      MC_ME.MCTL.R = 0x30005AF0;
      MC_ME.MCTL.R = 0x3000A50F;
      while(MC_ME.GS.B.S_MTRANS == 1); /* 等待模式轉換完成 */
    }
    
    /************************************************* ******* ******************************
    函數名稱:SUIL2_Init
    工程師:Martin Kovar
    日期:2015 年12月29 日
    參數:無
    修改: NONE
    返回:NONE
    註解:SIUL2 初始化(連接埠),
    問題:NONE
    *************************** ********* ***************************************** *****/
    static void GPIO_Init(無效)
    {
      SIUL2.MSCR[LED1_pin].R = 0x32000000; //PC[11] GPIO - 紅色 LED
      SIUL2.GPDO[LED1_pin].R = 0x00000001;
    
      // SIUL2.MSCR[55].R = 0x02000000; // D[7]引腳作為SGEN輸出
    
      SIUL2.MSCR[11].R = 0x02800002;// A[11] 腳位作為 FlexPWM A[0] 輸出
      SIUL2.MSCR[10].R = 0x02800002; // A[10] 腳位作為 FlexPWM B[0] 輸出
    
    }
    
    
    /************************************************* ******* ******************************
    函數名稱:ETimer_Init
    工程師:Martin Kovar
    日期:2016 年1月12 日
    參數:無
    修改: NONE
    返回:NONE
    註釋:ETimer0 通道 0,延遲計數模式,主要來源是 MOTC_CLK 除以 128
    問題:NONE
    ****************** ******* ******************************************* *********** ****/
    static void ETimer_Init(void)
    {
      ETIMER_0.ENBL.R = 0x0; // 停用 Timer0 頻道
      ETIMER_0.CH[0].CTRL1.R = 0x3E40; // 僅計數 MC_CLK 的上升沿(RUN0 中為 160MHz),除以 128,向上計數,重複計數,計數直至比較,然後重新初始化 
      ETIMER_0.CH[0].COMP1.R = 0x007c; // 比較 1 秒延遲的值 (160MHz/2 = 80MHz)
      ETIMER_0.CH[0].INTDMA.R = 0x0002; // 啟用 COMP1 中斷
      ETIMER_0.CH[0].CCCTRL.R = 0x0240; //向上計數時比較COMP1,上升沿比較CAPT1,
      ETIMER_0.ENBL.R = 0x0003; // 啟用Timer0頻道
    
    }
    
    
    //416.7k
    /********************************************* *** ************************************
    函數名稱:ETimer_ISR
    工程師:Martin Kovar
    日期:2016 年1月12 日
    參數: NONE
    修改 : NONE
    回傳 : NONE
    註解 : ETimer 中斷程式
    問題 : NONE
    ***************************** ***** ********************************************* ****/
    /*
    void ETimer_ISR (空白)
    {
    
      ETIMER_0.CH[0].STS.R = 0x0002; //清除中斷標誌
      SIUL2.GPDO[LED1_pin].R = ~SIUL2.GPDO[LED1_pin].R; //用引腳切換(LED 閃爍)
      etimer_cnt++;
    
    }*/
    
    void ADC_ISR(void)
    {
      ADC_1.ISR.R = 0x0000001f;//清除 Endof CTU INT 服務程式
      //SIUL2.MSCR[PE12].B.APC = 1; //配置ADC1_AN6為類比pad控制功能。模擬是預設功能,因此 SSS 表示 0
    
      //ADC_1.NCMR0.B.CH6 = 1; //啟用頻道6以在ADC1上進行正常轉換
      //result[3] = ADC_1.CDR[6].B.CDATA; //讀取ADC1_AN6轉換結果數據
    
    
      adc_count++;
    }
    
    
    static void FlexPWM_Init(void)
    {
      /* 子模組 0 初始化 */
      FlexPWM_0.OUTEN.R = 0x110; // 啟用子模組 0 上的 A 和 B 輸出
    
      FlexPWM_0.SUB[0].CTRL1.R = 0x0400|(PWM_PRESCALER<<4); // 全週期重載,每次機會
      FlexPWM_0.SUB[0].CTRL2.R = 0xA000; // 獨立輸出,除錯啟用
      FlexPWM_0.SUB[0].DTCNT0.R = 0x0000; // 死區時間值
      FlexPWM_0.SUB[0].DTCNT1.R = 0x0000;
      //FlexPWM_0.SUB[0].INIT.R = 0x1;
      FlexPWM_0.SUB[0].VAL0.R = 0x0; // PWM 啟動
      FlexPWM_0.SUB[0].VAL1.R = PWM_MODULO; // PWM A0 最大值
      FlexPWM_0.SUB[0].VAL2.R = 0x0; // out_trig(CTU MRS 事件的觸發點)
      FlexPWM_0.SUB[0].VAL3.R = PWM_MODULO*Duty; // PWM A0 下降沿
      FlexPWM_0.SUB[0].VAL4.R = PWM_MODULO*Duty; // PWM B0 上升沿
      //FlexPWM_0.SUB[0].VAL5.R = 0x0; // PWM B0 下降沿
    
    
      /* FlexPWM_0.SUB[0].INIT.R = 0x1;
      FlexPWM_0.SUB[0].VAL1.R = PWM_MODULO; // PWM 模
      FlexPWM_0.SUB[0].VAL2.R = PWM_MODULO*Duty; // PWM A0 上升沿
      FlexPWM_0.SUB[0].VAL3.R = 0x1; // PWM A0 下降沿
      FlexPWM_0.SUB[0].VAL4.R = 0x1; // PWM B0 上升沿
      FlexPWM_0.SUB[0].VAL5.R = PWM_MODULO*Duty; // PWM B0下降沿*/
    
      FlexPWM_0.SUB[0].DISMAP.R = 0x0000; // 停用故障引腳條件
    
      FlexPWM_0.MCTRL.B.LDOK = 0x1;// 將 CTRL1 的 PRSC 位元和 INIT 以及 VALx 暫存器載入到一組緩衝區中 Load OK
    
      //對於CTU
      FlexPWM_0.SUB[0].TCTRL.B.OUT_TRIG_EN = 3; // 輸出觸發啟用 (OUT_TRIG_EN2 = 1 )
      FlexPWM_0.MCTRL.B.RUN = 0x1; // 運行脈寬調製
    
    
    }
    
    void CTU_Init(void)
    {
      //選擇CTU模組的輸入觸發來源(主機重載間隔)與CTU模組的時鐘
      CTU_0.TGSISR.B.I0_RE = 0x1; // 選擇 CTU 的 MRS - PWM 重新載入 - 週期 50usec
      CTU_0.CR.B.TGSISR_RE = 0x1; // TGS 輸入選擇暫存器重載啟用
      CTU_0.TGSCR.B.ET_TM = 0; // 脈衝模式
      CTU_0.TGSCR.B.TGS_M = 0; // 順序模式
      CTU_0.TGSCR.B.PRES = 0x0; // CTU預分頻器設定為1
    
      //填入CTU觸發比較暫存器。(在我們的例子中,只有 1 個暫存器 (T0CR) 填入了值 1)。
      //一旦計數器達到值 1,來自 TGS(觸發生成器子模組)的時間觸發就會連結到一個 ADC 指令序列觸發。
      //ADC指令序列觸發點指向指令清單中的第一個指令。
      CTU_0.TCR[0].R = 0x1; // CTU定時器比較暫存器0值
    
      //計數器將停止並等待 PWM 在值 0xFFFF 處重新載入觸發。
      CTU_0.TGSCCR.R = 0xFFFF;// TGS 計數器比較暫存器
    
      //計數器重新載入後從0開始計數。
      CTU_0.TGSCRR.R = 0; // TGS 計數器重載暫存器
    
      //啟用觸發器0並啟用ADC指令輸出。
      CTU_0.THCR1.B.T0_E = 1; // 觸發0輸出使能
      CTU_0.THCR1.B.T0_ADCE = 1; // 觸發 0 ADC 指令輸出啟用
      CTU_0.CLCR1.B.T0_INDEX = 0; // 觸發0指令清單-第一個指令位址
    
      //FIFO DMA控制暫存器(FDCR)設定。
      (*(volatile uint16_t *)0xFFE0C06C) = 1; // CTU.FDCR = 1 - FIFO 上的 ebable DMA (頭檔中缺少!)
      CTU_0.FCR.R = 0; // 先進先出控制暫存器
    
    
      //ADC 指令序列清單的範例如圖 7 - CTU ADC 指令//序列清單所示。選擇要轉換的 ADC 模組和通道,如下面的範例
      //程式碼所示。使用值為 0x4000 的附加命令結束命令列表,以停止執行下一個命令。
      // CTU 觸發 ADC - ADC 指令清單
      // SU : ADC 指令清單
      CTU_0.CLR[0].AR = 0x0; // ADC_0 模組,通道 0 第一個指令 - CTU 在此指令後開始向 ADC 傳送指令
      CTU_0.CLR[1].AR = 0x1; // ADC_0 模組,通道 1
      CTU_0.CLR[2].AR = 0x2; // ADC_0 模組,通道 2
      CTU_0.CLR[3].AR = 0x3; // ADC_0 模組,通道 3
      CTU_0.CLR[4].AR = 0x4; // ADC_0 模組,通道 4
      CTU_0.CLR[5].AR = 0x5; // ADC_0 模組,通道 5
      CTU_0.CLR[6].AR = 0x6; // ADC_0 模組,通道 6
      CTU_0.CLR[7].AR = 0x7; // ADC_0 模組,通道 7
      CTU_0.CLR[8].AR = 0x8; // ADC_0 模組,通道 8
      CTU_0.CLR[9].AR = 0x9; // ADC_0 模組,通道 9
      CTU_0.CLR[10].AR = 0xA; // ADC_0 模組,通道 10
      CTU_0.CLR[11].AR = 0xB; // ADC_0 模組,通道 11
      CTU_0.CLR[12].AR = 0xC; // ADC_0 模組,通道 12
      CTU_0.CLR[13].AR = 0xD; // ADC_0 模組,通道 13
      CTU_0.CLR[14].AR = 0xE; // ADC_0 模組,通道 14
      CTU_0.CLR[15].AR = 0xF; // ADC_0 模組,通道 15
      CTU_0.CLR[16].AR = 0x4000; // 第一個指令 - 該指令不傳送到 ADC
    
      //將 FIFO 閾值設為 0xE,以便當 FIFO 達到//深度為 15 時,將自動觸發 eDMA 傳輸,測量結果將由 eDMA 狀態機自動傳輸。
      CTU_0.FTH.B.TH0 = 0xE;// FIFO 0 閾值。最大值為 15,因為閾值必須小於 FIFO 0 條目的數量。
    
      //如果需要 FIFO 溢位中斷,請在 FCR 暫存器中啟用 FIFO 溢位中斷。
      CTU_0.FCR.B.OF_EN0 = 1; // FIFO 0 閾值 溢位中斷啟用 - 在此中斷中讀取 FIFO 0
    
      //為了確保一致性,透過設定CTU控制暫存器中的GRE(通用重載啟用)位元來啟用所有雙緩衝暫存器的重載。
      //使用者必須確保在新的 MRS 發生之前更新所有預期的雙緩衝暫存器。
      CTU_0.CR.B.TGSISR_RE = 1;/* MRS 訊號을 발생 시킬꺼냐? PWM 事件重載啟用 */
      CTU_0.CR.B.GRE = 1; // 通用重載啟用
    }//CTU_Init
    
    
    void DMA_Init (void)
    {
      //EDMA.CR.R = 0x00000002; /* 啟用偵錯模式 */
      DMA_0.EEI.R = 0x00000000; /* 所有頻道停用錯誤中斷 */
      DMA_0.ERQ.R = 0x11111111; /* 啟用 eDMA 請求 0 -> CTU FIFO_0 觸發 */
      //DMA_Init
    
    }
    
    void DMA_TCD_0(void)
    {
      (*(volatile uint16_t *)0xFFF4501C) = 0x0; //Clear DMA.TCD[0]0.WORD7
    
      //選擇轉帳的來源位址。資料將從 CTU FIFO_0 傳輸。
      DMA_0.TCD[0].SADDR.R = 0xFFE0C080; /* 來源位址 - CTU FIFO_0 */
    
      //選擇來自CTU FIFO_0的資料將會傳送的目標位址
      DMA_0.TCD[0].DADDR.R = (uint32_t) &result[0]; /* 目標位址 - SRAM */
      DMA_0.TCD[0].ATTR.B.SMOD = 0x0; /* 來源位址取模 */
      DMA_0.TCD[0].ATTR.B.DMOD = 0x0; /* 目標位址取模 */
      DMA_0.TCD[0].ATTR.B.SSIZE = 0x2; /* 來源傳輸大小:32 位元*/
      DMA_0.TCD[0].ATTR.B.DSIZE = 0x2; /* 目標傳輸大小:32 位元*/
    
      //由於 FIFO 緩衝區,始終從相同來源位址讀取。
      DMA_0.TCD[0].SOFF.R = 0x0; /* 有符號來源位址偏移調整*/
    
      //在小循環中傳輸 64 位元組。
      DMA_0.TCD[0].NBYTES.MLNO.R = 0x40; /* 內部「次要」位元組計數 */
      DMA_0.TCD[0].SLAST.R = 0x0; /* 最後簽章的來源位址調整 */
    
      //設定目標位址偏移量為4位元組。
      DMA_0.TCD[0].DOFF.B.DOFF = 0x4; /* 有符號目標位址偏移 */
      //主循環完成後,目標位址減少 64 個位元組。這會將目標位址設定為結果緩衝區的開頭
      DMA_0.TCD[0].DLASTSGA.R = 0xFFFFFFC0; /* 有符號目標位址偏移 -64 */
      DMA_0.TCD[0].BITER.ELINKYES.B.ELINK = 0x0; /* 小循環完成時的通道到通道連結:停用*/ // ??
    
      //使用的是一個主要循環。
      DMA_0.TCD[0].BITER.ELINKYES.B.LINKCH = 0x1; /* 目前主要迭代計數或連結頻道號碼 */
      DMA_0.TCD[0].CITER.ELINKYES.B.ELINK = 0x0; /* 小循環完成時通道間連結:停用*/
      DMA_0.TCD[0].CITER.ELINKYES.B.LINKCH = 0x0; /* 小循環上通道間連結的頻道號碼:未完成*/
      DMA_0.TCD[0].CITER.ELINKYES.B.CITER = 0x0001; /* 目前主要迭代計數或連結頻道號碼 */
      DMA_0.TCD[0].CSR.B.BWC = 0x00; /* 頻寬控制 */
      DMA_0.TCD[0].CSR.B.MAJORLINKCH = 0x00; /* 主頻道號碼 */
      DMA_0.TCD[0].CSR.B.MAJORELINK = 0x00; /*主循環完成時通道間連結:停用*/
      DMA_0.TCD[0].CSR.B.DONE = 0x00; /* 頻道完成位元 */
      DMA_0.TCD[0].CSR.B.ACTIVE = 0x00; /* 頻道活動位元 */
      DMA_0.TCD[0].CSR.B.ESG = 0x00; /* 啟用分散/聚集:停用*/
      DMA_0.TCD[0].CSR.B.DREQ = 0x00; /* 完成後停用 DMA 頻道:停用*/
      DMA_0.TCD[0].CSR.B.INTHALF = 0x00; /* 半主計數完成時中斷:停用*/
      DMA_0.TCD[0].CSR.B.INTMAJOR = 0x01; /* 主循環完成時中斷:停用*/
      DMA_0.TCD[0].CSR.B.START = 0x00; /* 顯式通道起始位元 */ //eDMA
    }
    
    ////////////////////////////////////////////////// ///////// /////////////////
    static void ADC_Init(void)
    {
    
      //ADC_0.MCR.R = 0x80020000; // 啟用結果覆蓋,啟用 CTU 觸發注入轉換
      //ADC_0.CTR0.R = 0x00000016; // 設定轉換時間,使用預設值
      //ADC_1.MCR.B.PWDN = 0x1; // 進入掉電狀態
    
      //來自 誘餌
      ADC_1.MCR.B.PWDN = 0x1; /* 進入掉電狀態 */
      ADC_1.MCR.B.ABORT =0x1; // 中止正在進行的所有轉換
    
      /* ADC0 焊盤配置。*/
    
      // SIUL2.MSCR[29].R = 0x2000; // B[13] : ANP0 : 目前 2
      // SIUL2.MSCR[30].R = 0x2000; // B[14] : ANP1 : 目前 3
      //SIUL2.MSCR[31].R = 0x2000; // B[15] : ANP2 : 當前1
    
      /* ADC 設定啟動 */
      //ADC_0.MCR.R = 0x00000000; /* 初始化 ADC0(主配置暫存器)為單次模式 */
      ADC_1.ISR.R = 0x0000001F; /* 清除所有中斷狀態標誌 */
    
      /* 取樣時序設定 */
      // CTR0 : ADC 0 - 14 頻道, Tck = (1/2 * ADC peri Clock) : ADC 120Mhz PLL 時脈 --> ref 8.4.4 //ADC_1.CTR0.B.INPLATCH
      // ADC_1.CTR0.B.INPLATCH = 1; //鎖定此值的時鐘依INPLATCH值而變化,請參考第150頁圖23
      // ADC_1.CTR0.B.INPCMP = 3; //Tbiteval = INPCMP * Tck = 3 * 1/60MHz = 50nsec
      ADC_1.CTR0.B.INPSAMP = 0x14; //Tsample = (INSAMP - 1) * Tck(如果 INSAMP 大於 8)= 19 * 1/60MHz = 316nsec
      //Teval = 12 * Tbiteval
      // 總轉換持續時間:Tconv = Tsample + Teval + Tck
    
      ADC_1.MCR.B.PWDN = 0; /* 退出掉電模式 */
      ADC_1.PDEDR.R = 0x00000000; /* 掉電復位後,在退出實際掉電之前會有多少延遲?: 0 時鐘週期 */
      ADC_1.MCR.B.CTUEN = 0x1; /* ADC0 交叉觸發單元(注入轉換):啟用 */
    
      /*ADC 中斷屏蔽 */
      ADC_1.IMR.B.MSKEOCTU = 1; //CTU 完成時呼叫?
      //ADC_0.IMR.B.MSKEOC = 1; /* 鏈結束 INT */
      //ADC_0.IMR.B.MSKECH = 1;
    
      // ADC_0.CIMR0.B.CIM2 = 1; /* 通道 2 */
      ADC_1.CIMR0.B.CIM1 = 1; /* 通道 1 */
      //ADC_0.CIMR0.B.CIM0 = 1; /* 頻道 0 */
      INTC_0.PSR[82].R = 0x01; /* ADC中斷優先權8 */
    
      /* ADC 設定停止 */
      ADC_1.MCR.B.ABORT =0x0; /* 不要中止正在進行的轉換 */
      ///////
    }
    //////////////////////////////// /// //////////////////////////////////////////////// //////
    
    
    __attribute__ ((section(".text")))
    int main(void)
    {
      int counter = 0;
    
      HW_Init();
      CTU_Init();
      ADC_Init();
      //ADC_ISR();
      ADC1_PadConfig_ChanSelect(); /* 配置 ADC 焊盤並選擇掃描通道 */
      ADC1_Calibration(); /* 校準以補償變化 */
    
      INTC_0.PSR[611].R = 0x8001;//設定中斷優先權
    
      ETimer_Init();
      FlexPWM_0.MCTRL.B.RUN = 0x1;// 子模組 0 PWM 產生器啟用
    
      /* 永遠循環 */
      while (1)
      {
        counter++;
      }
    
      return 0;
    }

TAGS

  • 58 person(s) visited this page until now.

Permalink blog/2023-12-01_nxp_mpc5744p_adc_isr_sample_not_complete.txt · Last modified: 2023/12/01 17:44 by jethro

oeffentlich