好久没更新博客了,有一段时间觉得更新博客是浪费时间,所以就停下了,现在觉得得不偿失,尤其是对我这种很少做正规的笔记的人来说。我的记忆力实在是太差劲了。前不久买了cortex-m3的开发板,开始了硬件之旅。好吧,就如同beyond在《不再犹豫》中唱道“亲手写上每段得失乐与悲与梦儿”。
要写一个点亮led的程序,首先要做的开发板的初始化工作。要初始化哪些部分呢?
一.开发板初始化操作
1.首先要配置的是:引脚模式选择寄存器。
#define PINMODE0(*(volatile unsigned long *)0x4002C040)
PINMODE0寄存器控制 port0口p0.0---p0.15的上拉电阻/下拉电阻配置
PINMODE1寄存器控制 port0口p0.16---p0.26的上拉电阻/下拉电阻配置
PINMODE2寄存器控制 port1口p1.0---p1.15的上拉电阻/下拉电阻配置
PINMODE3寄存器控制 port1口p1.16---p1.31的上拉电阻/下拉电阻配置
PINMODE4寄存器控制 port1口p2.0---p2.15的上拉电阻/下拉电阻配置
PINMODE5寄存器控制 port1口p2.16---p2.31的上拉电阻/下拉电阻配置
PINMODE6寄存器控制 port1口p3.0---p3.15的上拉电阻/下拉电阻配置
PINMODE7寄存器控制 port1口p3.16---p3.31的上拉电阻/下拉电阻配置
PINMODE8寄存器控制 port1口p4.0---p4.15的上拉电阻/下拉电阻配置
PINMODE9寄存器控制 port1口p4.16---p4.31的上拉电阻/下拉电阻配置
配置方式为:32位寄存器对应管脚的位置0,选择片内上拉电阻方式。
2.禁止全部中断。
__asm int32s IrqDisable (void)
{
CPSIDI
MOVR0, #0
BXLR
}
3.存储器加速模块配置。
#define FLASHCFG(*(volatile unsigned long *)0x400FC000)
FLASHCFG = ((0x05ul << 12) & (~(0x003f))) | 0x003a;
这样将该寄存器的位配置为:0101 0000 0011 1010,使用一个缓冲区可用于指令取指缓冲操作,使用一个缓冲区来处理数据访问的缓冲操作,加速时能,flash访问使用6个cpu时钟。
4.为每个部件设置系统时钟。
#define PCLKSEL0(*(volatile unsigned long *)0x400FC1A8)
#if (FPCLK / (FCCLK / 4)) == 1
PCLKSEL0 = 0x00000000;
PCLKSEL1 = 0x00000000;
#endif
CLKOUTCFG = 0;
5.关闭锁相环PLL0,避免调速错误。
if ((PLL0STAT >> 24) == 1)
{
PLL0CON = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
}
PLL0CON = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
while(PLL0STAT & (3 << 24))
{}
6.设置主要时钟。
SCS = (SCS & 0x04) | 0x20;
while ((SCS & (1ul << 6)) == 0)
{}
CLKSRCSEL = 0x01;
PLL0CFG= (((PLL_NVALUE - 1) << 16) | (PLL_MVALUE - 1));
PLL0FEED= 0xAA;
PLL0FEED= 0x55;
PLL0CON= 1;
PLL0FEED= 0xAA;
PLL0FEED= 0x55;
while ((PLL0STAT & (1ul << 24)) == 0)
{}
CCLKCFG = (FCCO / FCCLK) - 1;
while (((PLL0STAT & (1ul << 26)) == 0))
{}
while (((PLL0STAT & 0x00007FFF) != (PLL_MVALUE - 1)) &&
(((PLL0STAT & 0x00FF0000) >> 16) != (PLL_NVALUE - 1)))
{}
PLL0CON= 3;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
while ((PLL0STAT & (1ul << 25)) == 0)
{}
7.设置usb时钟。
#if FUSBCLK_EN == 1
#if (FCCO % (FUSBCLK * 2)) != 0
PLL1CON = 1;
PLL1CFG = ((FUSBCLK / FOSC) - 1) | (1 << 5);
PLL1FEED = 0xaa;
PLL1FEED = 0x55;
while ((PLL1STAT & (1 << 10)) == 0)
{}
PLL1CON= 3;
PLL1FEED = 0xaa;
PLL1FEED = 0x55;
#else
USBCLKCFG = (FCCO / (FUSBCLK * 2)) - 1;
PLL1CON= 0;
PLL1FEED= 0xaa;
PLL1FEED= 0x55;
#endif
#endif
8.设置存储器加速模块
#if FCCLK <= 20000000
FLASHCFG = ((0x01ul << 12) & (~(0x003f))) | 0x003a;
#endif
#if FCCLK > 20000000 && FCCLK <= 40000000
FLASHCFG = ((0x02ul << 12) & (~(0x003f))) | 0x003a;
#endif
#if FCCLK > 40000000 && FCCLK <= 60000000
FLASHCFG = ((0x03ul << 12) & (~(0x003f))) | 0x003a;
#endif
#if FCCLK > 60000000 && FCCLK <= 80000000
FLASHCFG = ((0x04ul << 12) & (~(0x003f))) | 0x003a;
#endif
#if FCCLK > 80000000 && FCCLK <= 100000000
FLASHCFG = ((0x05ul << 12) & (~(0x003f))) | 0x003a;
#endif
STCALIB = FCCLK / 100;
IrqEnable();
——————————————————————转自xiaoyumylove的博客 ,http://blog.sina.com.cn/u/2307223841