本帖最后由 nixianmin 于 2011-9-13 19:35 编辑
这几天一直有同学在这玩,根本没时间学习咯,还好公司放4天假:lol,还有最后一天可以玩玩,这不趁早就捣鼓起来了。还要以前准备工作做的还不错,可以直接开始了。 不过刚开始看着库实在不知道怎么入手,看看例子不怎么清楚,看驱动参考手册一大堆函数不知道什么时候用,也不想直接就Copy代码,想弄清楚点M0程序的写法和结构。
发现keil一个很爽的功能,以前真失败既然没发现,用这个功能就能很方便的知道函数、数据类型等在文件中定义的位置了。
通过这功能,我把库里的一些定义看了下发现一个规律。
像SYSCLK->;PWRCON.OSC10K_EN = 1;大家都用过
但我不知到他为什么这样写,就在头文件找定义,发现:
#define SYSCLK
((SYSCLK_T *) SYSCLK_BASE)
#define SYSCLK_BASE
(AHB_BASE
+ 0x00200)
#define AHB_BASE
((
uint32_t)0x50000000)
typedef struct
{
SYSCLK_PWRCON_T
PWRCON;
SYSCLK_AHBCLK_T
AHBCLK;
SYSCLK_APBCLK_T
APBCLK;
SYSCLK_CLKSTATUS_T CLKSTATUS;
SYSCLK_CLKSEL0_T
CLKSEL0;
SYSCLK_CLKSEL1_T
CLKSEL1;
SYSCLK_CLKDIV_T
CLKDIV;
SYSCLK_CLKSEL2_T
CLKSEL2;
SYSCLK_PLLCON_T
PLLCON;
SYSCLK_FRQDIV_T
FRQDIV;
} SYSCLK_T;
typedef struct
{
__IO uint32_t XTL12M_EN:1;
__IO uint32_t XTL32K_EN:1;
__IO uint32_t OSC22M_EN:1;
__IO uint32_t OSC10K_EN:1;
__IO uint32_t PD_WU_DLY:1;
__IO uint32_t PD_WU_INT_EN:1;
__IO uint32_t PD_WU_STS:1;
__IO uint32_t PWR_DOWN:1;
__IO uint32_t PD_WAIT_CPU:1;
__I uint32_t RESERVE:23;
} SYSCLK_PWRCON_T;
再配合技术手册的寄存器说明:
这样我们就知道了SYSCLK->;PWRCON.XTL12M_EN是什么,SYSCLK代表时钟控制器,而SYSCLK_T结构体中的寄存器正好和上面那映射图一一对应, SYSCLK_PWRCON_T结构体和PWRCON寄存器对应,那么其他的一些功能写法也就自然知道了,也让我在下面写程序更能深入去了解。
以前用过TI的M3,那个直接就调用函数,貌似我都没找到怎么使用寄存器的。以为M0也是直接使用库就好了,现在发现M0还是能很方便的使用寄存器操作的,也不用那么麻烦的一个个寄存器去写
再看库文件中,我还学到了一些以前没用过的写法
__IO uint32_t XTL12M_EN:1;
//刚开始看不懂,后来联系起来看就知道是位操作的写法了
先写到这,下面再继续研究,慢慢玩
|