📄 hardware.c
字号:
/*
项目: 人员定位:读卡器
文件: hardware.c
日期: 2007.09.12
作者: 邵子扬
说明: 硬件接口函数,实现底层硬件的接口,并重新封装,以适应程序的移植
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include "typedef.h"
#include "cfg.h"
//IO端口初始化
//设置IO口方向寄存器和初始值
void io_init(void)
{
DDRB = (1 << LED)|(1 <<Plus)|(1 << CS)|(1 << MOSI)|(1 << SCK);
DDRD = (1 << CE)|(1 << RS485TXEn);
PORTD = (1 << CE)|(1 << DR1);
}
void tmr0delay(uint16 delay)
{
while(delay > 0)
{
wdt_reset();
delay--;
TIFR0 = (1 << OCF0B)|(1 << OCF0A)|(1 << TOV0);
TCCR0A = 0;
TCCR0B = (1 << CS02)|(1 << CS00); //1024分频,8M时 1024* 8 / 8000000 约1毫秒
TCNT0 = -8;
while(!(TIFR0 & (1 << TOV0)))
__asm__ __volatile__ ("nop");
}
}
//初始化定时器
//设置定时器0工作模式
void timer_init(void)
{
//定时器0
TCCR0A = 0;
TCCR0B = (1 << CS02)|(1 << CS00);//1024分频
//定时器1:CTC模式
TCCR1A = 0;
TCCR1B = 0;//(1 << WGM12)|(1 << CS12)|(1 << CS10);//1024分频+CTC
TCCR1C = 0;
OCR1A = 20000;
TIFR1 = (1 << ICF1)|(1 << OCF1B)|(1 << OCF1A)|(1 << TOV1);
//TIMSK1 = (1 << OCIE1A);//允许定时器1比较中断
//定时器2做软件RTC
OCR2A = 249;
TCCR2A = (1 << WGM21);//CTC模式2
//TCCR2B = (1 << CS22)|(1 << CS21)|(1 << CS20);//1024分频
TCCR2B = (1 << CS22)|(1 << CS21); //256分频
TIFR2 = (1 << OCF2B)|(1 << OCF2A)|(1 << TOV2);//清除中断标志
TIMSK2 = (1 << OCIE2A);//允许CTC中断
}
//设置SPI为主模式,以及设置SPI时钟频率
void spi_init(void)
{
SPCR = (1 << SPE)|(1 << MSTR)|(1 << SPR0);
SPSR = 0;//(1 << SPI2X);
}
//读写SPI
uint8 spi_wr(uint8 dat)
{
SPSR &= ~(1 << SPIF);
SPDR = dat;
while((SPSR & (1 << SPIF)) == 0);
return SPDR;
}
//初始化中断相关参数,允许中断
void isr_init(void)
{
EICRA = (1 << ISC11)|(1 << ISC10)|(1 << ISC01)|(1 << ISC00);//中断1上升沿触发
EIFR = (1 << INTF1)|(1 << INTF0);
EIMSK = (1 << INT1);
PCICR = 0;
sei(); //开中断
}
void uart_init(void)
{
UBRRHREG(COMPORTNo) = BAUDREG/256;
UBRRLREG(COMPORTNo) = BAUDREG%256;
UCSRAREG(COMPORTNo) = 0;
UCSRBREG(COMPORTNo) = (1 << RXCIEBIT(COMPORTNo)) | (1 << TXCIEBIT(COMPORTNo)) | (1 << RXENBIT(COMPORTNo))|(1 << TXENBIT(COMPORTNo));
UCSRCREG(COMPORTNo) = USEURSEL|(1 << UCSZBIT(COMPORTNo, 1))|(1 << UCSZBIT(COMPORTNo, 0));
}
void uart_write(uint8 dat)
{
UDRREG(COMPORTNo) = dat;
//while(!(UCSRAREG(COMPORTNo) & (1<<TXCBIT(COMPORTNo))));
//UCSRAREG(COMPORTNo) |= (1 << TXCBIT(COMPORTNo));
}
uint8 uart_read(void)
{
return UDRREG(COMPORTNo);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -