按住ctrl+?为多行注释
技巧说明
- 开启自动补全,我设置的快捷键为ctrl+z
开启参考,开启界面一直往下拉,和文章的对应就行了
时钟
控制框图及寄存器
其中普中用的晶振为30MHz的,通过PLL锁相环(PLLSTS(OSCOFF)控制开关,为1则允许通过;PLLCR设置倍频系数,一般设为10)倍频后变为300MHz;因为 F28335 芯片最高工作频率是150MHZ,通过寄存器 PLLSTS(DIVSEL) 位来设置分频系数(为了使 CPU 工作在最高频率下,通常设置分频系数为 2),最终时钟信号 CLKIN 为 150MHZ 供给 CPU。
初始化实现及外设对应时钟
外设对应时钟在InitPeripheralClocks函数里面,也就是CR1,CR2,CR3所对应的时钟
main
InitSysCtrl();
//---------------------------------------------------------------------------
// 这段函数的功能就是将系统控制寄存器初始化到想要的状态;
//具体步骤可以分成四部分:
// - 禁止看门狗电路
// - 给PLLCR寄存器赋值以获得想要的系统时钟频率
// - 给高、低速外设时钟预定标寄存器赋值以获得想要的高、低速外设时钟频率
// - 对需要使用的外设时钟进行使能
void InitSysCtrl(void)
{
// 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);
// Initialize the peripheral clocks
InitPeripheralClocks();//初始化外设时钟,作用见下,大致就是关闭了大部分时钟。0禁止,1使能开启时钟
}
//--------------------------------------------------------------------------
// 函数名:初始化外设时钟
//---------------------------------------------------------------------------
//这个是用来初始化外设模块的时钟,具体分2个步骤:
//首先设置高、低速外设预定标寄存器;
//第二是对各个外设时钟进行有选择的使能;
//为了降低功耗,尽量不使能不用的外设模块时钟;
//
//注:如果某一外设时钟没使能,则不能对其相关的寄存器进行读写;
void InitPeripheralClocks(void)
{
EALLOW;
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
SysCtrlRegs.HISPCP.all = 0x0001;
SysCtrlRegs.LOSPCP.all = 0x0002;//Lowspeedclock=SYSCLKOUT/4=150/4=37.5MHZ;
// 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;
// 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 = 0; // 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