dsp28335杂记1
生活随笔
收集整理的這篇文章主要介紹了
dsp28335杂记1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- F28335 的外設中斷源
- PIE 級中斷表。。。。。非常有用
- 每一組 ePWM 模塊
- GPIO輸出配置LED
- GPIO輸入配置KEY
- 外設中斷PIE配置
- 定時器0配置,1與2類比即可
- EPWM配置,外加PIE中斷
- ADC單路配置
F28335 的外設中斷源
遠遠不止 12 個,共用 58 個。那么如何將這 58 個外設中斷源分配給這 12 個中斷線呢,
這就需要 F28335 的 PIE 外設中斷擴展模塊來完成。
PIE 級中斷表。。。。。非常有用
每一組 ePWM 模塊
GPIO輸出配置LED
void LED_Init(void) {EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 開啟GPIO時鐘//LED1端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//設置為通用GPIO功能GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//設置GPIO方向為輸出GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉電阻//LED2端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;GpioCtrlRegs.GPCDIR.bit.GPIO67=1;GpioCtrlRegs.GPCPUD.bit.GPIO67=0;//LED3端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;GpioCtrlRegs.GPCDIR.bit.GPIO66=1;GpioCtrlRegs.GPCPUD.bit.GPIO66=0;//LED4端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;GpioCtrlRegs.GPCDIR.bit.GPIO65=1;GpioCtrlRegs.GPCPUD.bit.GPIO65=0;//LED5端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;GpioCtrlRegs.GPCDIR.bit.GPIO64=1;GpioCtrlRegs.GPCPUD.bit.GPIO64=0;//LED6端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;GpioCtrlRegs.GPADIR.bit.GPIO10=1;GpioCtrlRegs.GPAPUD.bit.GPIO10=0;//LED7端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;GpioCtrlRegs.GPADIR.bit.GPIO11=1;GpioCtrlRegs.GPAPUD.bit.GPIO11=0;GpioDataRegs.GPCSET.bit.GPIO68=1;GpioDataRegs.GPCSET.bit.GPIO67=1;GpioDataRegs.GPCSET.bit.GPIO66=1;GpioDataRegs.GPCSET.bit.GPIO65=1;GpioDataRegs.GPCSET.bit.GPIO64=1;GpioDataRegs.GPASET.bit.GPIO10=1;GpioDataRegs.GPASET.bit.GPIO11=1;EDIS; }GPIO輸入配置KEY
void KEY_Init(void) {EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 開啟GPIO時鐘//KEY端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;GpioCtrlRegs.GPADIR.bit.GPIO12=0;GpioCtrlRegs.GPAPUD.bit.GPIO12=0;GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;GpioCtrlRegs.GPADIR.bit.GPIO13=0;GpioCtrlRegs.GPAPUD.bit.GPIO13=0;GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;GpioCtrlRegs.GPADIR.bit.GPIO14=0;GpioCtrlRegs.GPAPUD.bit.GPIO14=0;GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;GpioCtrlRegs.GPBDIR.bit.GPIO48=1;GpioCtrlRegs.GPBPUD.bit.GPIO48=0;GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;GpioCtrlRegs.GPBDIR.bit.GPIO49=1;GpioCtrlRegs.GPBPUD.bit.GPIO49=0;GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;GpioCtrlRegs.GPBDIR.bit.GPIO50=1;GpioCtrlRegs.GPBPUD.bit.GPIO50=0;EDIS;GpioDataRegs.GPBSET.bit.GPIO48=1;GpioDataRegs.GPBSET.bit.GPIO49=1;GpioDataRegs.GPBSET.bit.GPIO50=1; }char KEY_Scan(char mode) {static char keyl1=1;static char keyl2=1;static char keyl3=1;//第1列掃描KEY_L1_SetL;KEY_L2_SetH;KEY_L3_SetH;if(keyl1==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);keyl1=0;if(KEY_H1==0){return KEY1_PRESS;}else if(KEY_H2==0){return KEY4_PRESS;}else if(KEY_H3==0){return KEY7_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl1=1;}if(mode)keyl1=1;//第2列掃描KEY_L2_SetL;KEY_L1_SetH;KEY_L3_SetH;if(keyl2==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);keyl2=0;if(KEY_H1==0){return KEY2_PRESS;}else if(KEY_H2==0){return KEY5_PRESS;}else if(KEY_H3==0){return KEY8_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl2=1;}if(mode)keyl2=1;//第3列掃描KEY_L3_SetL;KEY_L1_SetH;KEY_L2_SetH;if(keyl3==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);keyl3=0;if(KEY_H1==0){return KEY3_PRESS;}else if(KEY_H2==0){return KEY6_PRESS;}else if(KEY_H3==0){return KEY9_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl3=1;}if(mode)keyl3=1;return KEY_UNPRESS; }外設中斷PIE配置
interrupt void EXTI1_IRQn(void); void EXTI1_Init(void) {EALLOW;SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clockEDIS;EALLOW;//KEY端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;GpioCtrlRegs.GPADIR.bit.GPIO12=0;GpioCtrlRegs.GPAPUD.bit.GPIO12=0;GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; // 外部中斷1(XINT1)與系統時鐘SYSCLKOUT同步GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;GpioCtrlRegs.GPBDIR.bit.GPIO48=1;GpioCtrlRegs.GPBPUD.bit.GPIO48=0;GpioDataRegs.GPBCLEAR.bit.GPIO48=1;//LEDIS;EALLOW;GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; // XINT1是GPIO12EDIS;EALLOW; // 修改被保護的寄存器,修改前應添加EALLOW語句PieVectTable.XINT1 = &EXTI1_IRQn;EDIS; // EDIS的意思是不允許修改被保護的寄存器PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE組1的INT4XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿觸發中斷XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能XINT1IER |= M_INT1; // 使能CPU中斷1(INT1)EINT; // 開全局中斷ERTM; }interrupt void EXTI1_IRQn(void) {Uint32 i;for(i=0;i<10000;i++); //鍵盤消抖動while(!KEY_H1);LED2_TOGGLE;PieCtrlRegs.PIEACK.bit.ACK1=1; }定時器0配置,1與2類比即可
interrupt void TIM0_IRQn(void);//定時器0初始化函數 //Freq:CPU時鐘頻率(150MHz) //Period:定時周期值,單位us void TIM0_Init(float Freq, float Period) {EALLOW;SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0EDIS;//設置定時器0的中斷入口地址為中斷向量表的INT0EALLOW;PieVectTable.TINT0 = &TIM0_IRQn;EDIS;//指向定時器0的寄存器地址CpuTimer0.RegsAddr = &CpuTimer0Regs;//設置定時器0的周期寄存器值CpuTimer0Regs.PRD.all = 0xFFFFFFFF;//設置定時器預定標計數器值為0CpuTimer0Regs.TPR.all = 0;CpuTimer0Regs.TPRH.all = 0;//確保定時器0為停止狀態CpuTimer0Regs.TCR.bit.TSS = 1;//重載使能CpuTimer0Regs.TCR.bit.TRB = 1;// Reset interrupt counters:CpuTimer0.InterruptCount = 0;ConfigCpuTimer(&CpuTimer0, Freq, Period);//開始定時器功能CpuTimer0Regs.TCR.bit.TSS=0;//開啟CPU第一組中斷并使能第一組中斷的第7個小中斷,即定時器0IER |= M_INT1;PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能總中斷EINT;ERTM; }interrupt void TIM0_IRQn(void) {EALLOW;LED2_TOGGLE;PieCtrlRegs.PIEACK.bit.ACK1=1;EDIS; }EPWM配置,外加PIE中斷
interrupt void epwm1_timer_isr(void); void EPWM1_Init(Uint16 tbprd) {EALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Disable TBCLK within the ePWMSysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1EDIS;// Interrupts that are used in this example are re-mapped to// ISR functions found within this file.EALLOW; // This is needed to write to EALLOW protected registersPieVectTable.EPWM1_INT = &epwm1_timer_isr;EDIS; // This is needed to disable write to EALLOW protected registersEALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocksEDIS;// Setup SyncEPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // Pass through// Allow each timer to be sync'edEPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;EPwm1Regs.TBPHS.half.TBPHS = 0;EPwm1Regs.TBPRD = tbprd;EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count upEPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero eventEPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INTEPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1st eventEALLOW;SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Start all the timers syncedEDIS;// Enable CPU INT3 which is connected to EPWM1-6 INT:IER |= M_INT3;// Enable EPWM INTn in the PIE: Group 3 interrupt 1-6PieCtrlRegs.PIEIER3.bit.INTx1 = 1;// Enable global Interrupts and higher priority real-time debug events:EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGM }interrupt void epwm1_timer_isr(void) {static Uint16 cnt=0;cnt++;if(cnt==5000){cnt=0;LED3_TOGGLE;}// Clear INT flag for this timerEPwm1Regs.ETCLR.bit.INT = 1;// Acknowledge this interrupt to receive more interrupts from group 3PieCtrlRegs.PIEACK.bit.ACK3 = 1; }ADC單路配置
void ADC_Init(void) {// Specific clock setting for this example:EALLOW;SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADCEDIS;// Specific clock setting for this example:EALLOW;SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK)EDIS;InitAdc(); // For this example, init the ADC// Specific ADC setup for this example:AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded modeAdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous runAdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0;// Start SEQ1AdcRegs.ADCTRL2.all = 0x2000;}Uint16 Read_ADCValue(void) {while (AdcRegs.ADCST.bit.INT_SEQ1== 0);AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;return AdcRegs.ADCRESULT0>>4; }總結
以上是生活随笔為你收集整理的dsp28335杂记1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 色即是空之临时演员[韩国]
- 下一篇: 开源 android 播放器