一般接触一款新的芯片,能把一个LED点亮,其余的基本都好办了。因为虽然是简简单单一个LED,但是说明开发环境、烧写流程、程序初始化等工作,基本都掌握了。反正我学习一款mcu,第一件事就是点亮LED,一旦完成,整个心里都踏实了。今天就来点亮SAM4S开发板上的一个LED。
先讲一下atmel studio的示例工程的程序结构。类似于STM的函数库,asf这个函数库也把驱动什么的都准备好了,直接调用即可,但是在新创建的工程中,它并不会自动包含asf中的函数,而是需要一个类别一类别的添加,所以创建的工程默认有三块文件区域,ASF,包含各种头文件及驱动;config,针对当前开发板的配置;还有asf.h和main.c,asf.h把所有用到的asf中的头文件都包含在里面,我们自己编写函数的时候,需要用到asf中函数的时候,直接包含asf.h即可,不用一个个的列出需要的头文件了。
借助于ASF,对4SC16的操作就变得比较简单了。在一个对应的示例程序中,然后打开ASF Wizard,由于点亮LED操作,是对IO操作,就找到IO操作模块GPIO和IOPORT,添加到工程中去。然后我们就可以在ASF栏下看到gpio和ioport的头文件,以及驱动下的pio头文件和函数定义文件,函数原型就在里面。同时,asf.h中也包含了ioport.h和pio.h。
在main函数里面,可以看到有两个基本的初始化函数board_init()和sysclk_init()。对看名字也知道,后者是对系统时钟的配置,可以进去看看,基本不用动;而board_init()是针对这个板子的初始化,可以看到有很多的#ifdefine和#endif组合,意思是板子上有这个功能,就打开这个初始化函数,没有就不进行初始化。
可以看到ioport_init()函数,而针对引脚的配置也很简单,调用gpio_config_pin()这个函数即可。LED0_GPIO,LEG0_FLAGS已经定义好了,有兴趣可以看看,LED0_GPIO是引脚号,FLAGS是引脚类型,输出类型和default(就是不用管类型^_^)。至于操作LED,就更简单了,调用LED_On、LED_Off、LED_Toggle函数,功能就是名字意思。想进一步看下去,可以知道LED_On调用的是gpio_set_pin_low(),再进一步了解,就是对寄存器的直接操作了p_pio->PIO_CODR = 1<<(ul_pin&0x1f);
想让灯闪烁,可以使用延时函数delay_ms(),不过使用前需要在asf wizard中添加Delay routines.
[task]
while(1)
{
LED_Toggle(LED0_GPIO);
delay_ms(1000);
}
[/task]