將上一節搭建的工程模板複製一份,命名爲「1.blink」,這做爲咱們開發的第一個程序。函數
板子上只有一個可控制的LED,就是LED0,在按鍵的旁邊。打開原理圖,能夠看到LED的電路以下圖:blog
經過原理圖能夠看出,LED和MCU的PB14相鏈接,當PB14輸出低電平的時候,LED就會被點亮,爲高電平的時候被熄滅。ip
下面開始編寫LED驅動程序,首先在「Drivers」文件夾建立一個「drv_led.c」和「drv_led.h」文件,並加入到工程的「Drivers」分組下,在drv_led.c中編寫led驅動程序,以下:開發
#include "drv_led.h"get
void led_hw_init(void)it
{模板
/*禁止外設管理控制寄存器(PMC)寫保護*/原理
PMC->PMC_WPMR = 0x504D4300; cli
/*使能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是怎麼驅動的。