HAL_BOARD_INIT();//初始化板子硬件部分<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
//板子初始化函数其实是一个宏,定义在【hal_board_cfg.h】“\”符号其实是编译环境下面的行中断符,表示这一样没有结束,其实是一个“\”。
#define HAL_BOARD_INIT() { \
uint16 i; \
\
SLEEP &= ~OSC_PD; /* turn on 16MHz RC and 32MHz XOSC */\
//操作SLEEP寄存器,给16MHz高速振荡器和<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />32M外部晶体振荡上电
//【hal_mcu.h】
//#define OSC_PD 0x04
while (!(SLEEP & XOSC_STB)); /* wait for 32MHz XOSC stable */\
asm("NOP"); /* chip bug workaround */\
for (i=0; i<504; i++) asm("NOP"); /* Require 63us delay for all revs */\
// SLEEP寄存器中XOSC_STB位设置后还需要等待额外的64us,手册上是这么说的呵
CLKCON = (0x00 | OSC_32KHZ); /* 32MHz XOSC */\
//设置32M和外部32.768K时钟为源
while (CLKCON != (0x00 | OSC_32KHZ)); \
//等待时钟稳定
SLEEP |= OSC_PD; /* turn off 16MHz RC */\
//关闭没有用到的时钟源
//上面这段用来设置系统时钟,步骤为:所有时钟源上电;等待时钟稳定;延时64us等待确切的稳定;设置系统时钟和32K时钟的时钟源;等待设置完成,关闭没有用到的时钟源。 \
/* set direction for GPIO outputs */ \
LED1_DDR |= LED1_BV; \
//【hal_board_cfg.h】
// #define LED1_DDR P1DIR
// #define LED1_BV BV(0)
//【hal_defs.h】
// #define BV(n) (1 << (n));//这是将某位置位的宏
LED2_DDR |= LED2_BV; \
//【hal_board_cfg.h】
// #define LED2_DDR P1DIR
//#define LED2_BV BV(1)
//上面是对板上LED的初始化,完成的操作时将P1_0,P1_1设为输出(因为这两个IO口具有20ma的电流输出能力)!这里是跟硬件紧密相关的,需要根据自己硬件的具体情况来设。我的开发板上加上液晶指示的LED才两个,真是捉襟见肘啊,液晶背光灯接P2_0,调试LED接P1_0。设计的都不是很合理呢。看来在我的开发板上要完全的屏蔽掉LED2呢呵呵。进行相应更改:(这些更改都在文件hal_board_cfg.h中越在line94~100)
#define LED1_POLARITY ACTIVE_HIGH
#define LED2_BV BV(0)
#define LED2_SBIT P2_0
#define LED2_DDR P2DIR
\
/* configure tristates */ \
P2INP |= PUSH2_BV; \
//这是对Joystick的配置,在【hal_board_cfg.h】
//#define PUSH2_BV BV(0);这里将Joystick的中心按键的IO设为三态状态,我的板子上没有这个东东哦,所以把Joystick也给屏蔽了,注释掉【hal_board_cfg.h】中约line120的东东
\
/* configure software controlled peripheral VDD */ \
//配置软件控制的外设VDD
VDD_SW_DDR |= VDD_SW_BV; \
VDD_SW_SBIT = 0; \
//【hal_board_cfg.h】,这里实际上是将P1_2配置为输出,然后输出一个低电平
//貌似我的板子上也用不到这个东西,屏蔽掉
//#define VDD_SW_BV BV(2)
//#define VDD_SW_SBIT P1_2
//#define VDD_SW_DDR P1DIR
}
//好了,以上就是硬件底层的一些初始化工作,主要是配置时钟和一些端口的状态。
文章评论(0条评论)
登录后参与讨论