查看: 59|回复: 0

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

[复制链接]

主题

好友

2096

积分

进士

  • TA的每日心情
    开心
    2017-7-4 13:51
  • 签到天数: 347 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-2-8 23:57: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~
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条

    手机版|电路城

    GMT+8, 2019-6-27 06:57 , Processed in 0.116572 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部