从库文件开始,了解M0程序的编写,增加程序

几天一直有同学在这玩,根本没时间学习咯,还好公司放4天假 ,还有最后一天可以玩玩,这不趁早就捣鼓起来了。还要以前准备工作做的还不错,可以直接开始了。  不过刚开始看着库实在不知道怎么入手,看看例子不怎么清楚,看驱动参考手册一大堆函数不知道什么时候用,也不想直接就Copy代码,想弄清楚点M0程序的写法和结构。

  发现keil一个很爽的功能,以前真失败既然没发现,用这个功能就能很方便的知道函数、数据类型等在文件中定义的位置了。


通过这功能,我把库里的一些定义看了下发现一个规律。

像SYSCLK->WRCON.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;

再配合技术手册的寄存器说明:
3.png 
4.png 
5.png 
    这样我们就知道了SYSCLK->WRCON.XTL12M_EN是什么,SYSCLK代表时钟控制器,而SYSCLK_T结构体中的寄存器正好和上面那映射图一一对应,SYSCLK_PWRCON_T结构体和PWRCON寄存器对应,那么其他的一些功能写法也就自然知道了,也让我在下面写程序更能深入去了解。
  以前用过TI的M3,那个直接就调用函数,貌似我都没找到怎么使用寄存器的。以为M0也是直接使用库就好了,现在发现M0还是能很方便的使用寄存器操作的,也不用那么麻烦的一个个寄存器去写




再看库文件中,我还学到了一些以前没用过的写法 
__IO uint32_t  XTL12M_EN:1;
//刚开始看不懂,后来联系起来看就知道是位操作的写法了

先写到这,下面再继续研究,慢慢玩

*(volatile unsigned long *)0x56000010

long是32位整型,unsigned指无符号数,左边的*表示取内容
volatile表示易变的,告诉编译器不要优化,这个地址的内容不一定是在程序中改变的。
volatile unsigned long *表示将后面跟的内容转化成一个指针,并且是指向一个易变的无符号整数。
左边再加个*,表示取该指针指向地址的内容。
总的意思是取那个内存单元(内存地址0x56000010)里存的数,并将这个数转化为无符号整数

猜你喜欢

转载自blog.csdn.net/liujianli123/article/details/38588743