?? main.c
字號:
#include "config.h"
#include "main.h"
#include <string.h>
void Delay(uint dly)
{
unsigned int i, m;
for(m = 0; m < dly; m++)
{
for(i=0; i<10000; i++)
;
}
}
/****************************************************************************
* 名稱:LED()
* 功能:LED燈閃
* 入口參數(shù):dly
* 出口參數(shù):無
****************************************************************************/
void LED_Light(void)
{
if((IO0PIN & LED) == 0) IO0SET = LED; //LED1燈亮
else IO0CLR = LED;
}
void LED0_Light(void)
{
if((IO0PIN & LED0) == 0) IO0SET = LED0; //LED1燈亮
else IO0CLR = LED0;
}
void LED1_Light(void)
{
if((IO0PIN & LED1) == 0) IO0SET = LED1;
else IO0CLR = LED1;
}
void UART0_LED(void)
{
if((IO0PIN & LED2) == 0) IO0SET = LED2; //LED1燈亮
else IO0CLR = LED2;
}
/*************************中斷初始化******************************************
名稱:中斷初始化
輸入參數(shù):無
輸出參數(shù):無
功能:中斷初始化
******************************************************************************/
void INTERRUPT_Init(void)
{
VICIntSelect = 0x00000000; //所有中斷通道設置為IRQ中斷
VICIntEnable = 0x00000000; //清除所有中斷使能
VICVectCntl0 = 0x00000026; //串口0中斷通道分配最高優(yōu)先級(向量近制器1)
VICVectAddr0 = (uint)UART0_IRQ; //設置UART0向量地址
VICIntEnable |= Interrupt_UART0; //設置串口0中斷使能
VICVectCntl1 = 0x00000027; //串口1中斷通道分配最高優(yōu)先級(向量近制器2)
VICDefVectAddr = (uint)TIMER0_IRQ; //設置TIMER0向量地址
VICIntEnable |= Interrupt_TIMER0; //設置TIMER0中斷使能
VICVectCntl2 = 0x00000025; //TIMER1中斷通道分配最高優(yōu)先級(向量近制器4)
}
/*************系統(tǒng)時鐘初始化****************
*******默認狀態(tài)下:
PLLCON = 0x00 //PLL控制(使能)寄存器 PLLCON: 0xE01FC080
PLLCFG = 0x00 //PLL配制寄存器 PLLCON: 0xE01FC084
PLLSTAT = 0x00 //PLL狀態(tài)寄存器 PLLCON: 0xE01FC088
PLLFEED = 0x00 //PLL饋送寄存器 PLLCON: 0xE01FC08c
#define Fosc 11059200 //晶振頻率,10MHz~25MHz,應當與實際一至
#define Fcclk (Fosc * 5) //系統(tǒng)頻率,必須為Fosc的整數(shù)倍(1~32),且<=60MHZ
#define Fcco (Fcclk * 4) //CCO頻率,必須為Fcclk的2、4、8、16倍,范圍為156MHz~320MHz
#define Fpclk (Fcclk / 4) * 1 //VPB時鐘頻率,只能為(Fcclk / 4)的1 ~ 4倍
Fcclk = Fosc * M;
Fcco = Fosc * M * 2 * P
******設置好PLL后,必須對所設置的數(shù)據(jù)在PLLFEED進行饋送,PLL才能生效
***********************************************/
void PLL_Init(void)
{
uchar m, p;
PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1 //設置串口0波特率的分頻為4分頻
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2 //設置串口0波特率的分頻為2分頻
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4 //設置串口0波特率的分頻為無分頻
VPBDIV = 1;
#endif
m = (Fcclk / Fosc) - 1; //PLL的倍頻值
p = (Fcco / Fcclk) / 2; //PLL的分頻值
PLLCFG = (p << 5) | (m & 0x1f);
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0); //鎖定PLL值
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
/*************************系統(tǒng)初始化*****************************************
名稱:系統(tǒng)初始化
輸入參數(shù):無
輸出參數(shù):無
功能:對個個I/0進行初始化,及各個中斷初始化
*****************************************************************************/
void SYSTEM_Init(void)
{
uchar k; //設置引腳功能寄存器
PINSEL0 = 0x00051505; //設置串口0及串口1,SPI功能
PINSEL1 = 0x00000000;
IO0DIR = SH485EN | LED | SPIOUT | TXD;
IO0CLR = SH485EN; //設置為接收使能 0x0080 to be low
for(k = 0; k < 2; k++)
{
LED_Light();
Delay(10);
}
}
/*************************定時器0初始化******************************************
名稱:定時器0初始化
輸入參數(shù):無
輸出參數(shù):無
功能:定時器0初始化
實現(xiàn)0.5s;
#define Fosc 11059200 //晶振頻率,10MHz~25MHz,應當與實際一至
#define Fcclk (Fosc * 4) //系統(tǒng)頻率,必須為Fosc的整數(shù)倍(1~32),且<=60MHZ
#define Fcco (Fcclk * 4) //CCO頻率,必須為Fcclk的2、4、8、16倍,范圍為156MHz~320MHz
#define Fpclk (Fcclk / 4) //VPB時鐘頻率,只能為(Fcclk / 4)的1 ~ 4倍
如果所得的值與分頻值相等就為1S
********************************************************************************************/
void TIMER0_Init (void)
{
T0PR = 10; //設置定時分頻為100分頻,得110592Hz
T0MCR = 0x03; //匹配通道0匹配中斷并復位T0TC
T0MR0 = 100; //設置MR0比較值,定時0.1mS
T0TCR = 0x03; //啟運計時并復位
T0TCR = 0x01; //啟動計時
}
/************************定時器0中斷*****************************************
名稱:定時器0中斷
輸入參數(shù):無
輸出參數(shù):無
功能:定時器0中斷
********************************************/
void __irq TIMER0_IRQ(void)
{
unsigned short m;
if(T0IR & 0x01) //表示MR0定時中斷
{
T0IR |= 0x01; //清除定時器
if(TIMER0_Flag[0] == TRUE)
{
TIMER0_count[0]++; //清除計數(shù)器
if(TIMER0_count[0] >= delay_num)
{
TIMER0_count[0] = 0;
TIMER0_Flag[0] = FALSE;
UART0_RcvOk = TRUE;
UART0_RcvLen = UART0_RcvCount;
for(m = 0; m < UART0_RcvLen; m++)
{
UART0_Rcvbuf[m] = UART0_RcvTempbuf[m];
if(UART0_Rcvbuf[m]==0x03)LED1_Light();
}
UART0_RcvCount = 0;
}
}
if(TIMER0_Flag[1] == TRUE)
{
TIMER0_count[1]++; //清除計數(shù)器
if(TIMER0_count[1] >= delay_num)
{
TIMER0_count[1] = 0;
TIMER0_Flag[1] = FALSE;
}
}
}
VICVectAddr = 0x00;
}
/*************************串口0數(shù)據(jù)處理******************************************
名稱:串口0初始化
輸入參數(shù):無
輸出參數(shù):無
功能:串口0初始化。包括波特,中斷使能,F(xiàn)IFO中斷設置
******************************************************************************/
/*************************串口0初始化******************************************
名稱:串口0初始化
輸入參數(shù):無
輸出參數(shù):無
功能:串口0初始化。包括波特,中斷使能,F(xiàn)IFO中斷設置
******************************************************************************/
void UART0_Init (void)
{
uint Fdiv;
U0LCR = 0x83; // DLAB = 1,可設置波特率
Fdiv =(Fpclk/16)/BAUD_RATE;
U0DLL = Fdiv%256;
U0DLM = Fdiv/256;
U0LCR = 0x03;
U0IER = 0x01; //設置串口0的中斷使能
U0FCR = 0x01; //使能FIFO,串口接收到1個字節(jié)才產生中斷
}
/*************************串口0接收中斷*****************************************
名稱:串口0接收中斷
輸入參數(shù):無
輸出參數(shù):串口0所接收的數(shù)據(jù)
功能:串口0中斷接收數(shù)據(jù)
******************************************************************************/
void __irq UART0_IRQ(void)
{
uchar IIRValue, LSRValue;
uchar Rcv_data;
IIRValue = U0IIR; //讀取中斷標識寄存器
Rcv_data = U0RBR; // Dummy read on RX to clear
TIMER0_count[0] = 0; //清除計數(shù)器
TIMER0_Flag[0] = TRUE;
IIRValue >>= 1; // skip pending bit in IIR
IIRValue &= 0x07; // check bit 1~3, interrupt identification
if ( IIRValue == IIR_RLS ) // Receive Line Status
{
LSRValue = U0LSR; //讀取線狀態(tài)寄存器 Receive Line Status
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) ) //判斷線狀態(tài)標志
{
VICVectAddr = 0; //Acknowledge Interrupt
return;
}
if ( LSRValue & LSR_RDR ) // Receive Data Ready
{
UART0_RcvTempbuf[UART0_RcvCount] = Rcv_data;
UART0_RcvCount++;
}
}
else if ( IIRValue == IIR_RDA ) // Receive Data Available
{
UART0_RcvTempbuf[UART0_RcvCount] = Rcv_data;
UART0_RcvCount++;
}
else if ( IIRValue == IIR_CTI ) // Character timeout indicator
{
UART0Status |= 0x100; // Bit 9 as the CTI error 接收超時置位 Character Time-out indicator
}
UART0_LED();
VICVectAddr = 0; // Acknowledge Interrupt
}
/*************************串口0發(fā)送單個字節(jié)***********************************
名稱:串口0發(fā)送單個字節(jié)
輸入參數(shù):要發(fā)送的字節(jié)
輸出參數(shù):無
功能:串口0發(fā)送單個字節(jié)
******************************************************************************/
void UART0_SendByte ( uchar m)
{
U0THR = m; // 發(fā)送數(shù)據(jù)
while((U0LSR&0x40)==0 ); // 等待數(shù)據(jù)發(fā)送完畢
}
/*************************串口0發(fā)送字符串*************************************
名稱:串口0發(fā)送字符串
輸入參數(shù):要發(fā)送的字節(jié)數(shù)組,*buf, 及數(shù)組的長度Len
輸出參數(shù):無
功能:串口0發(fā)送字符串
******************************************************************************/
void UART0_SendString(uint adress, uchar *buf, unsigned short Len)
{
unsigned short i;
U0LCR =0x2b;
Delay(1);
UART0_SendByte(adress);
U0LCR =0x3b;
Delay(1);
for(i = 0; i < Len; i++)
{
UART0_SendByte(buf[i]);
}
IO0CLR = SP485_EN0;
}
/****************************************************************************
**主函數(shù):讀取實時時鐘的值,并從串口發(fā)送出去。
****************************************************************************/
int main(void)
{
uchar Ti[2];
SYSTEM_Init(); //系統(tǒng)初始化
PLL_Init(); //IC工作時鐘初始化
UART0_Init(); //串口0初始化
TIMER0_Init(); //定時器0初始化
INTERRUPT_Init(); //中斷初始化
Ti[0]=3; Ti[1]=10;
while (1)
{
Delay(500);
UART0_SendString(0x02,Ti,1);
Ti[0]+=Ti[1];
UART0_SendString(0x03,Ti,1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -