前言:以前没有接触过ARM,当然也没有接触M0,当初下决心跟着菜叔学习M0的时候,我刚好完成了对51的一个系统学习,只是当时我只是学会了51的编程思想,并在仿真软件中实现目标,所以说俺的51其实还没有真正达到很好的掌握,毕竟动手操作还是蛮重要的.当初俺正准备省钱买51学习板,正在困惑的时候大叔成功的把俺色诱进了菜地,于是开始学习M0.从51到M0是一个很大的思想转变,刚开始还是有点不习惯,我相信,随着深入学习,俺会慢慢习惯的.
在做第一个实验前,我想自己先做分析,在理解的基础上再进行试验.下面进入正文.
首先建立个M0工程,我建了个GPIO工程,见下图
这个工程我是根据模板设计的,做流水灯实验时应该可以简化,去掉不必要的几个文件.library files里面只要有DrvGPIO.c跟DrvSYS.c就可以了..
接下来有必要学习下M0的通用I/O的特点,以前俺学习51的时候思想很简单,I/O口比较容易理解,后来自己学习过一点AVR,感受到了I/O的复杂性,最明显的是要考虑I/O的方向.接触到M0之后,ARM的也是有点复杂的,M0主要通过GPIOA,GPIOB,GPIOC向外发送数据,且在每个端口上有16个引脚。共有四种模式,见下图
当我们要使用其他模式时,一定要修改相应的寄存器..这个很重要..
下面开始分析程序.
在前面的工程中,我们可以看到工程主要有三个部分组成,启动层,驱动层,用户层,经常启动层是固定的,驱动层则要根据用户层来,你用到哪一块的就要加相应的驱动子程序.这个要注意,所以不要少加或漏加.
先从GPIO开始吧.见下图
这里有好几个新接触的东西,一一进行学习.
1、 UNLOCKREG();
该函数的作用是:是完成写保护的解锁工作,可以向被保护的寄存器中写入数据。它是一个宏定义,含义是分别是向三个地址中写入 0x59,0x16,0x88.这里涉及到指针这块,主要是对地址进行操作.
2、 SYSCLK->PWRCON.XTL12M_EN = 1;
该函数的作用是:解锁操作.这个我感受到直接对寄存器操作的功能性.说实话,学51的时候对寄存器感悟得不够.
3. LOCKREG();
该函数的作用是:锁定寄存器写保护.它也是一个宏定义..
4. DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT);
该函数的作用是:设置端口的输出模式。这个很重要,M0的输出模式有很多.用不同的模式,结果会差很多.
5.
while(1)
{
DrvGPIO_ClrBit(E_GPA,2);
delay_loop();
DrvGPIO_ClrBit(E_GPA,3);
delay_loop();
DrvGPIO_ClrBit(E_GPA,4);
delay_loop();
DrvGPIO_ClrBit(E_GPA,5);
delay_loop();
DrvGPIO_SetBit(E_GPA,2);
DrvGPIO_SetBit(E_GPA,3);
DrvGPIO_SetBit(E_GPA,4);
DrvGPIO_SetBit(E_GPA,5);
delay_loop();
}
我们需要实现的目标,4个LED灯依次间隔点亮,然后对四个灯进行熄灭.这部分内容跟51很相似,很好理解.
个人小结:通过这次学习,让我进一步深入理解程序的含义.知道程序是怎么工作的,如何调用的,当然还有更多的模块需要我去探索,继续努力加油... |