📄 main.c
字号:
/****************************************************************************************
* 文件名:ZIGBEE_UART0.C
* 功能:
* 说明:
* 硬件连接:
*
*
*
*
*
*
****************************************************************************************/
#include "config.h"
#define UART0_INT 6
#define RX_BUFFER_SIZE0 1024
#define TX_BUFFER_SIZE0 256
#define command_buffer_size0 20 //命令缓冲区大小 160
uint32 UART0_BPS=9600; //定义通讯波特率
// USART0 Receiver buffer
unsigned char rx_buffer0[RX_BUFFER_SIZE0]; //串口接收数据缓冲区
unsigned int rx_wr_index0; //接收数组缓冲区中写指针
unsigned int rx_rd_index0; //接收数组缓冲区中读指针
unsigned int rx_counter0; //全部的接收字符
// USART0 Transmitter buffer
unsigned char tx_buffer0[TX_BUFFER_SIZE0]; //串口发送数据缓冲区
unsigned int tx_wr_index0; //串口发送数据缓冲区中写指针
unsigned int tx_rd_index0; //串口发送数据缓冲区中读指针
unsigned int tx_counter0; //全部的发送字符,队列计数器
/* 该宏先发送回车字符0x0d到EasyARM串口调试软件,然后再发送换行字符0x0a */
#define DISP_CHANGEROW0() UART0_SendByte (0x0d); UART0_SendByte (0x0a)
unsigned char zigbee_config_count;
uint8 zigbee_config_flag=0;
unsigned char command_buffer0[command_buffer_size0]; //命令接收缓冲区
uint8 zigbee_rcv_len=0;
#define PIN108 (1<<8)
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时
** 入口参数 :dly 延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<50000; i++);
}
/*********************************************************************************************************
** 函数名称: IRQ_Timer0
** 函数功能: 定时器0中断服务程序,取反蜂鸣器控制口。
** 入口参数: 无
** 出口参数: 无
*************
********************************************************************************************/
void __irq IRQ_Timer0(void)
{
IO1CLR |= PIN108;//输出低电平
DelayNS (200);
IO1SET |= PIN108;//输出高电平
DelayNS (200);
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
/*********************************************************************************************************
** 函数名称 :time0_init()
** 函数功能 :定时器初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void time0_init(void)
{
/* 定时器0初始化 */
T0TC = 0; // 定时器设置为0
T0PR = 0; // 时钟不分频
T0MCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志
T0MR0 = Fpclk; // 10MS秒钟定时,T0MR0=12MHz
//T0MR0 = Fpclk /10; // 100mS秒钟定时,T0MR0=12MHz
//T0MR0 = Fpclk / 2; // 500mS秒钟定时,T0MR0=12MHz
//T0MR0 = Fpclk ;
T0TCR = 0x01; // 启动定时器
VICVectPri4 = 0x07; // 设置定时器0中断最高优先级
VICVectAddr4 = (uint32)IRQ_Timer0; // 设置中断服务程序地址
VICIntEnable = 1 << 0x04; // 使能定时器0中断
}
/*********************************************************************************************************
** 函数名称 :UART0_SendByte
** 函数功能 :以查询方式发送一字节数据
** 入口参数 :dat 要发送的数据
** 出口参数 :无
*********************************************************************************************************/
void UART0_SendByte(char dat)
{
U0THR = dat;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
}
/**********************************************************************************************************
** 函数名称 :UART0_SendStr
** 函数功能 :向串口发送一字符串
** 入口参数 :str 要发送的字符串的指针
** 出口参数 :无
**********************************************************************************************************/
void UART0_SendStr(char *str)
{
while (1)
{
if (*str == '\0')
{
break; // 遇到结束符,退出
}
UART0_SendByte(*str++);
}
}
/*********************************************************************************************************
** 函数名称 :UART0_SendBuf
** 函数功能 :向串口发送数据
** 入口参数 :uint32 snd_n: 发送数据的个数。snd_n 小于8
** uint8* RcvBufPt:缓存地址
** 出口参数 :无
**********************************************************************************************************/
void UART0_SendBuf(uint8* RcvBufPt, uint32 snd_n)
{
uint32 i;
VICIntEnClr |= 1 << UART0_INT; // 保护字符接收数组不被其它中断破坏
for (i = 0; i < snd_n; i++) // 使用发送FIFO发送数据
{
U0THR = RcvBufPt[i];
}
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
VICIntEnable |= 1 << UART0_INT;
}
//函数名称:UART0_RcvByte
//函数功能:使用查询方式,从串口接收一个字节的数据
//入口参数:
//出口参数:
uint8 UART0_RcvByte (void)
{
uint8 rcv_data=0;
while((U0LSR&0x01)==0);//查询数据是否接收完毕
rcv_data=U0RBR;
return (rcv_data);
}
/*********************************************************************************************************
** 函数名称 :UART0_getchar
** 函数功能 :取一个字节数据
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************/
char UART0_getchar(unsigned char *c_ptr)
{
if(rx_counter0 == 0)
return FALSE;
*c_ptr=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
//#asm("cli")
--rx_counter0;
//#asm("sei")
return TRUE;
}
/*********************************************************************************************************
** 函数名称 :UART0_putchar
** 函数功能 :向串口0发送一字节数据,中断方式
** 入口参数 :c 要发送的数据
** 出口参数 :无
*********************************************************************************************************/
void UART0_putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
//#asm("cli")
//if (tx_counter0 || ((UCSRA & DATA_REGISTER_EMPTY)==0))
if (tx_counter0 || ( (U0LSR & 0X40)==0 ))
{
tx_buffer0[tx_wr_index0]=c;
if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
++tx_counter0;
}
else U0THR=c;
//#asm("sei")
}
/**********************************************************************************************************
** 函数名称 :UART0_putstr
** 函数功能 :向串口2发送一个字符串
** 入口参数 :string 要发送的字符串的指针
** 出口参数 :无
**********************************************************************************************************/
void UART0_putstr( char *string)
{
while(*string)
{
UART0_putchar(*string);
string++;
}
}
/*********************************************************************************************************
** 函数名称 :UART0_SendBuf
** 函数功能 :向串口发送数据
** 入口参数 :uint32 snd_n: 发送数据的个数。snd_n 小于8
** uint8* RcvBufPt:缓存地址
** 出口参数 :无
**********************************************************************************************************/
void UART0_putBuf(uint8* RcvBufPt, uint32 snd_n)
{
uint32 i;
for (i = 0; i < snd_n; i++) // 使用发送FIFO发送数据
{
while (tx_counter0 == TX_BUFFER_SIZE0);
//#asm("cli")
//if (tx_counter0 || ((UCSRA & DATA_REGISTER_EMPTY)==0))
if (tx_counter0 || ( (U0LSR & 0X40)==0 ))
{
tx_buffer0[tx_wr_index0]=RcvBufPt[i];
if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
++tx_counter0;
}
else
U0THR=RcvBufPt[i];//发送缓冲区没有数据,直接发送 }
}
}
/*********************************************************************************************************
** 函数名称 :IRQ_UART0
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************************/
//void __irq IRQ_UART0_RX(void)
void __irq IRQ_UART0(void)
{
uint32 i = 0;
//unsigned char status;
unsigned char data;
//unsigned char Rcv_Buf;
uint32 IIR = 0;
while (((IIR = U0IIR) & 0x01) == 0) // 若尚有中断待处理,
{
switch (IIR & 0x0e) //与0000 1110
{
case 0x04: //0000 0100 ,bit3~1=010=2 RDA接收数据就绪 中断处理入口
for (i = 0; i < 1; i++)
{
//status=UCSRA;
data=U0RBR;
//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
//{
if(rx_counter0 < (RX_BUFFER_SIZE0-1))
{
rx_buffer0[rx_wr_index0]=data;
if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
rx_counter0++;
}
//}
}
break;
case 0x0c: //0000 1100 ,bit3~1=110=6 CTI中断
for (i = 0; i < 1; i++)
{
if ((U0LSR & 0x01) == 0x01) //RDR=1,接收有数据
{
data=U0RBR;
//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
if(rx_counter0 < (RX_BUFFER_SIZE0-1))
{
rx_buffer0[rx_wr_index0]=data;
if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
rx_counter0++;
}
}
else
{
break;
}
}
case 0x02: //0000 0010 ,bit3~1=001=1 THRE发送中断处理入口
if (tx_counter0)
{
--tx_counter0;
U0THR=tx_buffer0[tx_rd_index0];
if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
}
break;
default:
break;
} //end switch
} //end while
VICVectAddr = 0x00;
}
/*********************************************************************************************************
** 函数名称 :ClrRcvFIFO0
** 函数功能 :读空接收FIFO0
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void ClrRcvFIFO0(void)
{
volatile uint32 i, temp = 0;
for (i = 0; i < 1; i++)
{
if ((U0LSR & 0x01) == 0x01) //接收FIFO有数据
{
temp = U0RBR; //读空接收FIFO
}
else
{
break;
}
}
}
/*********************************************************************************************************
** 函数名称 :UART0_Init
** 函数功能 :令串口0完成全部初始化工作: 波特率 9600
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UART0_Init(void)
{
char str[64];
uint32 baud;
uint32 Fdiv = 0;
uint16 dlm, dll;
/* 在PCONP里启用UART0 */
PCONP |= 1 << 3; // 使能UART0 功率/时钟控制位 p123
/* 初始化引脚 */
PINSEL0 = (0x01 << 4) | (0x01 << 6); // 设置P0.2和P0.3连接到UART0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -