void InitSysCtrl(void)

本文详细解释了初始化系统控制函数的各个步骤,包括关闭看门狗模块、初始化PLL、设置时钟频率、以及配置外围设备时钟启用。通过具体指令如SysCtrlRegs的设置,实现系统初始化关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void InitSysCtrl(void)

对这个函数的一点解释:

// Disable watchdog module

SysCtrlRegs.WDCR=0x0068; 关看门狗

// Initalize PLL
SysCtrlRegs.PLLCR = 0xA; CLKIN=(OSCCLK*10.0)/2
此指令将PLL使能
// Wait for PLL to lock
for(i= 0; i< 5000; i++){}
延时,等待PLL使能(直译为 锁相环上锁。。哈哈)

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.HISPCP.all = 0x0001;
高速时钟定标HSPCLK=SYSCLKOUT/HISPCP*2
SysCtrlRegs.LOSPCP.all = 0x0002;
低速时钟定标LSPCLK=SYSCLKOUT/LOSPCP*2
// Peripheral clock enables set for the selected peripherals.
// SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;EV-B
外设高速时钟有效
// SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;
// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;
// SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;

需要考察下EV是如何工作的,很显然这里用外部AD转换结束信号驱动事件管理器B

看 main() 函数:初始化顺序(时钟→GPIO→PWM→ADC→中断→外设)和 主循环 while(1) 里干啥(通常非实时任务,如保护检测)。关键线索: 找到 中断服务函数(ISR)的名字(比如 PWM1_ISR 或 adc_isr()) 代码如下: #include "DSP28x_Project.h" // Device Headerfile and Examples Include File #include <stdio.h> #include <math.h> // Prototype statements for functions found within this file. /*void InitEPwm1Example(void); void InitEPwm2Example(void); void InitEPwm3Example(void); */ interrupt void epwm1_isr(void); interrupt void adc_isr(void); /*void InitEPwm1SPWM(void); void InitEPwm2SPWM(void); void InitEPwm3SPWM(void); void InitEPwm4SPWM(void); void InitEPwm5SPWM(void); void InitEPwm6SPWM(void); */ //extern volatile Uint16 ePWM_Timer_TBPRD;//? void main(void) { InitSysCtrl(); //第一:初始化PLL得SYSCLKOUT=150MHz,看门狗。且使能ePWM模块时钟。 //更改高速时钟预定标寄存器的值。 EALLOW; SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/2*3=25MHZ EDIS; InitEPwmGpio(); InitTzGpio(); //第二:初始化GPIO口,将EPwm设为EPwm输出。 // 第三:中断初始化 Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // This function is found in the DSP2833x_PieCtrl.c file. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.EPWM1_INT = &epwm1_isr; PieVectTable.ADCINT = &adc_isr; EDIS; // This is needed to disable write to EALLOW protected registers //ePWM模块的初始化 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; InitEPwm(); InitAdc(); EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//目的就是保证ePWM各模块时钟同步 EDIS; // Step 5. User specific code, enable interrupts // Enable CPU INT3 which is connected to EPWM1-3 INT: IER |= M_INT3; IER |= M_INT1; // Enable EPWM INTn in the PIE: Group 3 interrupt 1-3 PieCtrlRegs.PIEIER3.bit.INTx1 = 1; //使能ePWM1中断,第三行,第一个 PieCtrlRegs.PIEIER1.bit.INTx6 = 1; //使能ADC中断,第一行,第六个 // Enable global Interrupts and higher priority real-time debug events: EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // Step 6. IDLE loop. Just sit and loop forever (optional): for(;;) { asm(" NOP"); } } //=========================================================================== // No more. //===========================================================================
最新发布
06-04
解释这段代码 #include "F28x_Project.h" Uint16 sdata[2]; // Send data buffer Uint16 rdata[2]; // Receive data buffer Uint16 rdata_point; // Keep track of where we are // in the data stream to check received data interrupt void spiTxFifoIsr(void); interrupt void spiRxFifoIsr(void); void delay_loop(void); void spi_fifo_init(void); void error(); void main(void) { Uint16 i; InitSysCtrl(); InitSpiaGpio(); DINT; IER = 0x0000; IFR = 0x0000; InitPieCtrl(); InitPieVectTable(); EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.SPIA_RX_INT = &spiRxFifoIsr; PieVectTable.SPIA_TX_INT = &spiTxFifoIsr; EDIS; // This is needed to disable write to EALLOW protected registers spi_fifo_init(); // Initialize the SPI only for(i=0; i<2; i++) { sdata[i] = i; } rdata_point = 0; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER6.bit.INTx1 = 1; // Enable PIE Group 6, INT 1 PieCtrlRegs.PIEIER6.bit.INTx2 = 1; // Enable PIE Group 6, INT 2 IER=0x20; // Enable CPU INT6 EINT; // Enable Global Interrupts for(;;); } void delay_loop() { long i; for (i = 0; i < 1000000; i++) {} } void error(void) { asm(" ESTOP0"); //Test failed!! Stop! for (;;); } void spi_fifo_init() { SpiaRegs.SPIFFTX.all = 0xC022; // Enable FIFOs, set TX FIFO level to 2 SpiaRegs.SPIFFRX.all = 0x0022; // Set RX FIFO level to 2 SpiaRegs.SPIFFCT.all = 0x00; SpiaRegs.SPIFFTX.bit.TXFIFO=1; SpiaRegs.SPIFFRX.bit.RXFIFORESET=1; InitSpi(); } interrupt void spiTxFifoIsr(void) { Uint16 i; for(i=0;i<2;i++) { SpiaRegs.SPITXBUF=sdata[i]; // Send data } for(i=0;i<2;i++) // Increment data for next cycle { sdata[i] = sdata[i] + 1; } SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; // Clear Interrupt flag PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ACK } interrupt void spiRxFifoIsr(void) { Uint16 i; for(i=0; i<2; i++) { rdata[i]=SpiaRegs.SPIRXBUF; // Read data } for(i=0; i<2; i++) // Check received data { if(rdata[i] != rdata_point+i) { error(); } } rdata_point++; SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ack }
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值