本文记录dsp28335的各种外设的配置方法:
目录
1、时钟配置
1.0 关闭看门狗和写使能
1.1 系统时钟源配置
1.2 外设时钟
1.3 外部扩展接口时钟
1.4 其他外设时钟使能
2、GPIO配置
1、时钟配置
1.0 关闭看门狗和写使能
代码语言:javascript复制EALLOW; //写使能,写寄存器之前必须有
SysCtrlRegs.WDCR= 0x0068; //关闭看门狗
EDIS; //写失能,写完之后关闭
DSP的寄存器是有保护的,修改所有寄存器,写使能都必须要打开,写完要关闭。
1.1 系统时钟源配置
时钟通道图,CPU最高支持150M,需要配置的地方:OSCOFF、PLLCR、DIVSEL。
外部晶振是30M,CPU需要150M,所以需要5倍频。
PLL只有2,4,6,8,10倍频,所以通过先10倍频,再2分频,最后得到150M
代码语言:javascript复制// Initialize the PLL control: PLLCR and DIVSEL
// DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
InitPll(DSP28_PLLCR,DSP28_DIVSEL);
DSP28_PLLCR = 10
DSP28_DIVSEL = 2
1.2 外设时钟
外设时钟分两种:高速外设时钟,低速外设时钟。
- SPI-A、SCI-A/B/C的基时钟来源是主频通过LOSPCP(低频时钟寄存器)的分频而得到的。
- I2C-A的基时钟来源是直接来源于主时钟。
- GPIO的时钟不通过分频,直接为主频时钟。
- eCAN-A/B的基时钟来源于主频时钟的二分频。
- EPWM1~6、HRPWM 16、ECAP16、EQEP1~2的基时钟,直接来源于主时钟。
- McBSP-A/B的基时钟来源是主频通过LOSPCP(低频时钟寄存器)的分频而得到的。
- 12的通道的 12-Bit ADC 的基时钟来源是主频通过HISPCP(高频时钟寄存器)的分频而得到的。
- DMA的基时钟来源是直接来源于主时钟。
PS:LSPCLK最高为37.5Mhz、HSPCLK最高为75Mhz
1.3 外部扩展接口时钟
代码语言:javascript复制// XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = 1/4 SYSCLKOUT
// XTIMCLK = SYSCLKOUT/2
XintfRegs.XINTCNF2.bit.XTIMCLK = 1;
// XCLKOUT = XTIMCLK/2
XintfRegs.XINTCNF2.bit.CLKMODE = 1;
// Enable XCLKOUT
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
1.4 其他外设时钟使能
代码:1:使能。0:关闭
代码语言:javascript复制// Peripheral clock enables set for the selected peripherals.
// If you are not using a peripheral leave the clock off
// to save on power.
//
// Note: not all peripherals are available on all 2833x derivates.
// Refer to the datasheet for your particular device.
//
// This function is not written to be an example of efficient code.
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC
// *IMPORTANT*
// The ADC_cal function, which copies the ADC calibration values from TI reserved
// OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the
// Boot ROM. If the boot ROM code is bypassed during the debug process, the
// following function MUST be called for the ADC to function according
// to specification. The clocks to the ADC MUST be enabled before calling this
// function.
// See the device data manual and/or the ADC Reference
// Manual for more information.
ADC_cal();
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // SCI-B
SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 1; // SCI-C
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // SPI-A
SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 1; // McBSP-A
SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 1; // McBSP-B
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1; // eCAN-A
SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=1; // eCAN-B
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; // ePWM2
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1; // ePWM5
SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 1; // ePWM6
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1; // eCAP3
SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1; // eCAP4
SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1; // eCAP5
SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1; // eCAP6
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1; // eCAP1
SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1; // eCAP2
SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1; // eQEP1
SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1; // eQEP2
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2
SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 1; // DMA Clock
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1; // XTIMCLK
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock
其中,
ADC配置:
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC时钟开启,必须在ADC_cal()前。
ADC_cal(); // 须要有!,勇于ADC校准值、OTP进入ADCREFSEL和ADCOFFTRIM寄存器等预处理工作。
ePWM配置:必须先关闭TBCLK,修改寄存器,再打开TCBCLK。
代码语言:javascript复制SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM
2、GPIO配置
GPIO的配置步骤: 1,写使能 2,配置系统是时钟源 3,使能GPIO外设时钟 4,配置IO口属性 5,设置IO口数值 6,关闭写使能
28335共有88个IO口,配置寄存器分成3组:GPAxxx,GPBxxx,GPCxxx
IO口的属性:
- 复用选择,xxxMUX。00:普通IO;01,10,11:分别复用1,2,3。详见手册。
- 输入输出方向选择,xxxDIR。0:输入模式(默认);1:输出模式。
- 是否上拉,xxxPUD。0:使能上拉(GPIO 12~87的默认配置);1:关闭上拉(GPIO 0~11的默认配置)。
- 量化滤波(仅A,B组IO有)采样周期,xxxCTRL。
- 量化滤波(仅A,B组IO有)采样次数,xxxQSEL。
其中,
- 复用选择,xxxMUX分MUX1配置GPIO 0~15,MUX2配置GPIO 16~31。
- 量化滤波采样次数,xxxQSEL分为2组:xxxQSEL1配置GPIO 0~15,xxxQSEL2配置GPIO 16~31。 00:为同步时钟输入,不采样。 01:3采样 10:6采样 11:设置模式为外设时提供异步时钟信号
- 量化滤波采样周期,xxxCTRL属性: xxxCTRL定义为结构体,细分出4个寄存器: QUALPRD0,QUALPRD1,QUALPRD2,QUALPRD3 分别配置GPIO 0~7,8~15,16~23,24~31。 赋值0x00~0xFF,物理意义:采样周期T=(2^n)*Tsysclkout ( 0x00<=n<=0xff)。
IO口的赋值操作:
- xxxDAT寄存器:直接把一组IO整体赋值
- xxxSET寄存器 1:输出高电平 0:忽略
- xxxCLEAR寄存器 1:输出低电平 0: 忽略
- xxxOGGLE寄存器 1:输出翻转电平 0:忽略
例程:简单使IO口输出高电平
库函数版:
代码语言:javascript复制 // Disable the watchdog
DisableDog(); //关闭看门狗
// Initialize the PLL control: PLLCR and DIVSEL
// DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
InitPll(DSP28_PLLCR,DSP28_DIVSEL); //配置时钟源
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
GpioDataRegs.GPCSET.bit.GPIO68=1; //端口置为1
EDIS;
纯寄存器方式:
代码语言:javascript复制 EALLOW;
SysCtrlRegs.WDCR= 0x0068; //关闭看门狗
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0; //PLLCR配置前,将DIVSEL赋值0
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; //PLLCR配置前,关闭时钟丢失检测
SysCtrlRegs.PLLCR.bit.DIV = 10; //10倍频
while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1); //配置PLL之后等待稳定
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; //开启时钟丢失检测
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2; //切换到1,2直接切换。切换到3时,先切换2,等待PLL稳定后(50us),在切换到3
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
GpioDataRegs.GPCSET.bit.GPIO68=1; //端口置为1
EDIS;
待续。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180136.html原文链接:https://javaforall.cn