很荣幸得到Atmel社区的Atmel SAM4EXplained Pro starter kit的套件,得到这么好的套件,当然不要浪费这么高大上的套件,今天我来分享下SAM4E的PIO模块。这次我使用的编译环境是IAR,自己从AS 6.2的一个例程移植到IAR里,这是个带库的模板,里面有几个外设的驱动文件。还有这个模板方便在网上分享我自己写的源代码,这也是我自己建一个模板的初衷,因为官方的例程包很大,这是因为官方例程包里有针对多个芯片的例程,所以单个芯片的工程很难分离。所以我自己花了点时间自己建了一个带库的模板,这样大家就可以使用库或者寄存器的写法。 通常我们学习每种MCU时,基本上都会学他的的GPIO功能。这里我要引用一下别人的的总结了:SAM4E芯片的GPIO都由并行输入、输出控制器(PIO:Parallel Input/Output Controller)来管理(在数据手册第31章(558页)有对PIO介绍)。所有的IO口都有好多种不同的输入输出模式,比如:上拉、下拉、施密特触发器输入、多驱动(开漏)、滤波、去抖动、输入改变中断。SAM4E具有PIOA、PIOB、PIOC、PIOD、PIOE三个PIO控制器。 下面就是PIO的框图:
还有PIO涉及的寄存器:
可以看出,PIO的寄存器很多,这也就验证了PIO强大的一个体现的很好证明。 用到了以下这两个函数: pio_configure_pin(PIO_PD22_IDX,PIO_OUTPUT_1| PIO_DEFAULT); pio_toggle_pin(PIO_PD22_IDX); pio_configure_pin函数是设置管脚的类型以及状态。 例如pio_configure_pin(PIO_PD22_IDX,PIO_OUTPUT_1 | PIO_DEFAULT); 就是把PIOD22设置成输出,无上下拉。 pio_toggle_pin函数是翻转管脚电平的函数; 例如pio_toggle_pin(PIO_PD22_IDX);就是每执行pio_toggle_pin(PIO_PD22_IDX)这个函数就会把PIOD22脚的电平翻转; 现在我就来用库函数来点亮板子上的LED。 我们的步骤是: (1)初始化时钟 (2)使能PIO外设的时钟 (3)设置PIO外设脚的类型 (4)输出电平控制LED的亮灭。 下面的代码如下:
刚才用Atmel的库函数点亮了Atmel SAM4E Xplained Pro上的小黄灯,现在我用寄存器点亮套件上的小黄灯。 这次用到3个寄存器即可,分别是:PIO_ODER,PIO_PER和PIO_CODE 如下图手册的截图中看就可以直观看到这3个寄存器的作用:
PIO_PER是PIO使能寄存器,对它写0没有影响,写1就是使能PIO外设,这个是只写寄存器,如下截图的说明:
PIO_ODE是PIO输出使能寄存器,对他写0没有影响,写1就是使能PIO输出,同样也是只写寄存器,如手册的截图:
最后一个PIO_CODE是个清零输出数据寄存器,就是把PIO的输出为低电平,对他写0没有影响,写1就是使PIO输出低电平,同样也是只写寄存器,如手册的截图:
还有套件的LED0是接的是PIOD22脚,如原理图的截图:
所以PIOD22输出低电平即可使LED0亮了。 以下就是我写的代码: - int main(void)
- {
-
- sysclk_init(); //初始化时钟
-
-
- REG_PIOD_PER |= (1<<22); //设置PIOD22脚位输出,无上下拉
- REG_PIOD_OER |= (1<<22);
-
- while(1)
- {
- //翻转PIOD22脚的电平
- REG_PIOD_CODR =1 << 22;
- }
- }
复制代码小黄灯再次亮了起来
附上的工程:
PIO.rar
(1.1 MB, 下载次数: 1)
|