【ATMEGA328P-XMINI】GPIO之按键led走起

作者: 枫飞
上传时间为: 2015-01-26 09:13 AM

本周开始研究这块板子,相较于之前推出的其他板子而言,这块板子比较难入手的地方在于没有对应例程。尽管AtmeStudio能识别出这块板子,但并没有对应的例程可以调用。一时间让人很难下手。

AVR这是我第一次用,作为初次使用者,首先得考虑搭建的平台。AtmeStudio是一个选择,另外也可以使用arduino IDE进行开发,这个我也没用过,也会去试试

参考了下shaoziyang的例程

/*
* GccTest.c
*
* Created: 2015/1/7 10:50:35
*  Author: uncle
*/ 

#define F_CPU 16000000L
#define LED PB5

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    DDRB |= (1<<LED);
    while(1)
    {
        PORTB ^= (1<<LED);
        _delay_ms(100);
    }
}

建一个空的工程文件

在主函数中移入示例程序

选型中选择mEDBG,后面的选择ISP,这是有点不同的

编译,烧录程序

led闪烁

再回过头看看程序。

发现尽管用的空工程,其实还是用了ASF的库

#define DDRB _SFR_IO8(0x04)
#define DDB0 0
#define DDB1 1
#define DDB2 2
#define DDB3 3
#define DDB4 4
#define DDB5 5
#define DDB6 6
#define DDB7 7
#define PORTB _SFR_IO8(0x05)
#define PORTB0 0
#define PORTB1 1
#define PORTB2 2
#define PORTB3 3
#define PORTB4 4
#define PORTB5 5
#define PORTB6 6
#define PORTB7 7
void
_delay_ms(double __ms)
{
	double __tmp ; 
#if __HAS_DELAY_CYCLES && defined(__OPTIMIZE__) && \
  !defined(__DELAY_BACKWARD_COMPATIBLE__) &&	   \
  __STDC_HOSTED__
	uint32_t __ticks_dc;
	extern void __builtin_avr_delay_cycles(unsigned long);
	__tmp = ((F_CPU) / 1e3) * __ms;

	#if defined(__DELAY_ROUND_DOWN__)
		__ticks_dc = (uint32_t)fabs(__tmp);

	#elif defined(__DELAY_ROUND_CLOSEST__)
		__ticks_dc = (uint32_t)(fabs(__tmp)+0.5);

	#else
		//round up by default
		__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
	#endif

	__builtin_avr_delay_cycles(__ticks_dc);

#else
	uint16_t __ticks;
	__tmp = ((F_CPU) / 4e3) * __ms;
	if (__tmp < 1.0)
		__ticks = 1;
	else if (__tmp > 65535)
	{
		//	__ticks = requested delay in 1/10 ms
		__ticks = (uint16_t) (__ms * 10.0);
		while(__ticks)
		{
			// wait 1/10 ms
			_delay_loop_2(((F_CPU) / 4e3) / 10);
			__ticks --;
		}
		return;
	}
	else
		__ticks = (uint16_t)__tmp;
	_delay_loop_2(__ticks);
#endif
}
理由便是我们调用的头文件
#include <avr/io.h>
#include <util/delay.h>
恩,由此可见其实asf库也可以像st的那样方便的,毕竟该有的函数都有,前提是能找到。
全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示