#include <avr/io.h>
#include <avr/interrupt.h>
#include "config.h"
#include "system.h"
// ==========================================================================================================
// 毫秒级延时
// (1). 根据不同的时钟,选择不同的参数,保证在不同时钟下的延时都是1ms
//
// (2). error这个变量没有定义,所以如果上面的几种情况都不存在,编译器会将error报错
// 以此来提醒,需要去测试对应的数值
//
// (3). 可以使用PA0引脚测试时间
// ==========================================================================================================
void delay_ms(uint16_t count)
{
volatile uint16_t i,j;
for(i = 0; i < count; i++)
{
#if SYS_OSC_FREQUENCE == 8000000
for(j = 0; j < 430; j++) {}
#elif SYS_OSC_FREQUENCE == 4000000
for(j = 0; j < error; j++) {}
#elif SYS_OSC_FREQUENCE == 2000000
for(j = 0; j < error; j++) {}
#elif SYS_OSC_FREQUENCE == 1000000
for(j = 0; j < error; j++) {}
#else
error = 0;
#endif
}
}
// ==========================================================================================================
// 系统定时器
// (1). 使用Timer0产生1ms的时标
// (2). 使用Timer0的调度各个任务
// ==========================================================================================================
void sys_init(void)
{
// 关闭全局中断
cli();
// ==========================================================================================================
// 时钟初始化
// ==========================================================================================================
// ==========================================================================================================
// IO初始化
// ==========================================================================================================
// PORTA初始化为输出低电平
DDRA = 0xFF;
PORTA = 0x00;
// PORTB初始化为输出高电平(连接了低推的LED)
DDRB = 0xFF;
PORTB = 0xFF;
// PORTC初始化为输出低电平
DDRC = 0xFF;
PORTC = 0x00;
// PORTD初始化为输出低电平
DDRD = 0xFF;
PORTD = 0x00 | (1 << 3); // PD3连接低推的红外LED
}
// ==========================================================================================================
// 系统定时器中断
// ==========================================================================================================
ISR(TIMER0_OVF_vect)
{
}
// ==========================================================================================================
// 检查复位源
// 清除复位信息,等待记录下一次复位
// ==========================================================================================================
void get_reset_source(void)
{
// 上电复位
if( MCUCSR & (1 << PORF) )
{
MCUCSR &= ~(1 << PORF);
}
// 外部复位
if( MCUCSR & (1 << EXTRF) )
{
MCUCSR &= ~(1 << EXTRF);
}
// BOD掉电复位
if( MCUCSR & (1 << BORF) )
{
MCUCSR &= ~(1 << BORF);
}
// WDT复位
if( MCUCSR & (1 << WDRF) )
{
MCUCSR &= ~(1 << WDRF);
}
// Jtag指令AVR_RESET复位
if( MCUCSR & (1 << JTRF) )
{
MCUCSR &= ~(1 << JTRF);
}
}