一、准备工作:
将上一节搭建的工程模板复制一份,命名为“1.blink”,这作为我们开发的第一个程序。
二、程序编写:
板子上只有一个可控制的LED,就是LED0,在按键的旁边。打开原理图,可以看到LED的电路如下图:
通过原理图可以看出,LED和MCU的PB14相连接,当PB14输出低电平的时候,LED就会被点亮,为高电平的时候被熄灭。
下面开始编写LED驱动程序,首先在“Drivers”文件夹创建一个“drv_led.c”和“drv_led.h”文件,并加入到工程的“Drivers”分组下,在drv_led.c中编写led驱动程序,如下:
#include "drv_led.h"
void led_hw_init(void)
{
/*禁止外设管理控制寄存器(PMC)写保护*/
PMC->PMC_WPMR = 0x504D4300;
/*使能PIOB时钟*/
PMC->PMC_PCER0 = (1UL << ID_PIOB );
/*使能外设管理控制寄存器(PMC)写保护*/
PMC->PMC_WPMR = 0x504D4301;
/*使能LED管脚*/
PIOB->PIO_PER|=(0x01<<LED0_PIN);
/*使能LED管脚输出*/
PIOB->PIO_OER|=(0x01<<LED0_PIN);
/*设置LED输出,即LED管脚为高电平*/
PIOB->PIO_SODR|=(0x01<<LED0_PIN);
}
这里就写一个函数体,里面放置led的初始化代码,首先是要去开启PIOB的时钟,PMC中的PMC_PCER0是控制各种外设时钟的,而且这个寄存器是被写保护的,在写之前,需要禁止写保护,这样写入数据才有效,给对应PIOB的ID位置1就算是开启了PIOB的时钟。讲到这里,也许有人注意到上一节搭建工程模板的时候这个没开启怎么就能成功点亮LED呢?是的,上次纯属侥幸。应该是芯片默认是开启这个PIOB时钟的,但对于我们编写驱动来说,这个步骤还是不要少的好,因为有可能再次之前这个别其他程序关掉了。
接下来是使能PIOB14管脚的GPIO功能,通过PIOB的PIO_PER寄存器去使能,对应的还有PIO_PDR是失能GPIO功能。使能了PIOB14的GPIO功能后,还要使能它的输出功能,接着就可以用过PIO_SODR和PIO_CODR去控制输出低电平还是高电平了。
在drv_led.h中主要是初始化函数的声明好LED控制相关的宏,如下:
#ifndef __DRV_LED_H
#define __DRV_LED_H
#include "sam4n.h"
#define LED0_PIN 14
#define led_hw_on() PIOB->PIO_CODR=(0x01UL<<LED0_PIN)
#define led_hw_off() PIOB->PIO_SODR=(0x01UL<<LED0_PIN)
void led_hw_init(void);
#endif
主要是防重复包含和LED控制的两个宏定义,接下来在main.c中程序如下:
int main(void)
{
led_hw_init();
while(1){
led_hw_on();
delay(300);
led_hw_off();
delay(300);
}
}
主要是先初始化led,然后就可以控制led的亮和灭了。效果我就不说了,就是简单的一亮一灭功能。主要是先熟悉一下SAM4N的GPIO是怎么驱动的。