/************************************************* ******* ****************************/ /* 檔名: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,RFDPHI = 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; }