【ATMEGA328P-XMINI】AtmelStudio平台下ASF工程的正确建立_LED闪烁

作者: 枫飞
上传时间为: 2015-02-08 11:57 PM
2015-02-08
阅读:

原本是打算研究Arduino的,结果参考网上众多网友心得才发现自己AtmelStudio还是没会用呀。以前使用都是直接导入例程,在原有的基础上改,然后就常常被已有的体系所困扰,如果自己单独建立,最后一定会报错,所以一直比较纠结。参考很多坛友的,实际建立工程发现确实AtmelStudio用起来更为灵活了,一点不比MDK、IAR之类的IDE差。O(∩_∩)O~

在此将正确步骤列出,也给自己留个记录:

首先选择第2个,选择工程文件,第一个也是可以的

选择对应芯片型号

然后会自动建立好工程。在此基础上就可以正常开发了,类似于用MDK或IAR.

如果想用ASF那请接着往下看

选择ASF Wizard,如图其实也有快捷键的,但我试了很多次都没反应,所以还是老老实实用鼠标吧

这里其实是个提醒,我当时误以为得把板子插笔记本上的usb线得拔出,后来才反应过来不是的

得选择第一个,这里我是点了好多次才跳到第一个,一直没反应,有点小郁闷还以为不好改呢

这边就是ASF的模块选择了,这比直接打开看asf的库要好太多了,没那么眼花缭乱,完全找不到或找不全。列的很清晰的。选择要的模块添加。

像此处,我想实现led闪烁功能,那么就选择一个GPIO的还有delay延时的,add添加

添加完成Apply

点击OK,导入工程

导入后又会有一个main.c,在新产生的src文件夹下,所以删除原来的main

现在来看看主函数很简单的,就一个板子初始化的

其实是空函数,那需要设定什么吗?暂时不添加,我们看看效果

简单写下主函数

#include <asf.h>


#define LED    IOPORT_CREATE_PIN(PORTB, 5)

int main (void)
{
	// Insert system clock initialization code here (sysclk_init()).

	board_init();
	
	delay_init();
	ioport_init();
	
	ioport_set_pin_dir(LED, IOPORT_DIR_OUTPUT);

	// Insert application code here, after the board has been initialized.
	
	while(1)
	{
		ioport_toggle_pin_level(LED);
		delay_ms(5000);
	}
}

编译下试试

不错不错,没错也没警告。

修改设置

编译烧入,看看板子效果如何。

led闪烁正常,由此可见board_init其实是可以没有的如果不需要用到的话

整个程序构架还是比较清晰的,可以说可以让你很清晰的的知道怎么用。

附带一提的是delay_ms这函数真强悍,我之前一直再想用多少合适,等看到定义彻底无语

#define delay_ms(delay)     cpu_delay_ms(delay, F_CPU)
#define cpu_delay_ms(delay, f_cpu) delay_cycles(cpu_ms_2_cy(delay, f_cpu))
#define cpu_delay_us(delay, f_cpu) delay_cycles(cpu_us_2_cy(delay, f_cpu))
#if !defined(__DELAY_CYCLE_INTRINSICS__)
#	define delay_cycles            __portable_avr_delay_cycles
#	define cpu_ms_2_cy(ms, f_cpu)  (((uint64_t)(ms) * (f_cpu) + 999) / 6e3)
#	define cpu_us_2_cy(us, f_cpu)  (((uint64_t)(us) * (f_cpu) + 999999ul) / 6e6)
#else
#  if defined(__GNUC__)
#       define delay_cycles            __builtin_avr_delay_cycles
#  elif defined(__ICCAVR__)
#       define delay_cycles            __delay_cycles
#  endif
#	define cpu_ms_2_cy(ms, f_cpu)  (((uint64_t)(ms) * (f_cpu) + 999) / 1e3)
#	define cpu_us_2_cy(us, f_cpu)  (((uint64_t)(us) * (f_cpu) + 999999ul) / 1e6)
#endif

居然是64位的,这值究竟得有多大呀,真的很强悍呀。O(∩_∩)O~

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示