?? uart0.c
字號:
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#include "main.h"
#define __SRC
#include "UART0.h"
#undef __SRC
static volatile uint8 recv_cnt = 0;
static uint8 recv_buf[32];
//extern uint8 volatile ui8_FLG_TransMode;
//在main函數(shù)中定義
void UART0_Init(void)
{
uint16 Fdiv;
PINSEL0 =(PINSEL0 & 0xfffffff0) | 0x05; /* 選擇管腳為UART0 */
U0LCR = 0x80; /* 允許訪問分頻因子寄存器 */
Fdiv = (Fpclk / 16) / UART0_BPS; /* 設(shè)置波特率 */
// Fdiv = (Fpclk / 16) / 115200;
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x3| // 字符長度:00(5位字符)01(6位)10(7位)11(8位)
(0<<2)| // 停止位選擇:0(1個停止位)1(2位停止位)
(0<<3)| // 寄偶使能:0(禁止)1(使能)
(0<<5)| // 寄偶選擇:00(奇數(shù))01(偶數(shù))10(強(qiáng)制為1)11(強(qiáng)制為0)
(0<<6)| // 間隔控制:0(禁止間隔發(fā)送)1(使能間隔發(fā)送)
(0<<7); // 除數(shù)鎖存訪問位:0(禁止訪問除數(shù)鎖存)
//設(shè)置為:8,n,1
U0FCR = 0x07; /* 初始化FIFO,為1個字節(jié)的緩存 */
U0IER = 0x03; /* 允許接收和發(fā)送中斷 */
/* 設(shè)置UART中斷 */
VICIntSelect =0x00000000; //所有的通道都設(shè)置為IRQ模式
VICVectCntl0 = 0x20|6; //中斷控制寄存器,UART0為SLOT0
VICVectAddr0 = (uint32)IRQ_UART0;//
VICIntEnable = 1<<6; //使能UART0中斷
}
__irq void IRQ_UART0(void)
{
uint8 i;
uint8 ui8_Uart0IntNum; //用來存放串口的中斷類型
ui8_Uart0IntNum = U0IIR; //獲取中斷源的值
if(ui8_Uart0IntNum & 0x04) //當(dāng)為接收數(shù)據(jù)有效的中斷時
{
if((ui8_RecvNewDataFlg == UART0_SDBUFNUSE)&&(ui8_RecvCounter < UART0_LENGTH_RECVDATA))
{
if(recv_cnt != 0) {
memcpy(&ui8_RecvDataBuf[ui8_RecvCounter], recv_buf, recv_cnt);
ui8_RecvCounter += recv_cnt;
recv_cnt = 0;
}
if(U0RBR != UART0_RECV_DATAEND)
{
ui8_RecvDataBuf[ui8_RecvCounter] = U0RBR;
ui8_RecvCounter++;
}
else
{
ui8_RecvDataBuf[ui8_RecvCounter] = U0RBR;
ui8_RecvCounter++;
ui8_RecvNewDataFlg = UART0_SDBUFIUSE; //等待處理
}// if(U0RBR==UART0_DATA0A)
}//if((ui8_RecvNewDataFlg==0)&&(ui8_RecvCounter<UART0_LENGTH_RECVDATA))
else {
recv_buf[recv_cnt] = U0RBR;
recv_cnt++;
}
// if(ui8_RecvCounter == UART0_LENGTH_RECVDATA)
//ClearRecvDataBuf();
//else if(ui8_RecvNewDataFlg == UART0_SDBUFNUSE && timer > 10)
i=U0RBR;//進(jìn)入中斷后,后必須清一下對應(yīng)的中斷,防止中斷死鎖。
}//if(ui8_Uart0IntNum&0x04)//當(dāng)為接收數(shù)據(jù)有效的中斷時
if(ui8_Uart0IntNum & 0x02)//用中斷的方式,發(fā)送數(shù)據(jù)
{
if((ui8_SendNewDataFlg==UART0_SDBUFIUSE)&&(ui8_SendCounter < UART0_LENGTH_SENDDATA))//發(fā)送數(shù)據(jù)的標(biāo)志為0時發(fā)送,即在沒有發(fā)送完成的時候發(fā)送
{
if(ui8_SendDataBuf[ui8_SendCounter] != UART0_SEND_DATAEND)
{//在沒有檢測到結(jié)束符時發(fā)送在緩存中的內(nèi)容
U0THR = ui8_SendDataBuf[ui8_SendCounter];
ui8_SendCounter++;
}
//if(ui8_SendDataBuf[ui8_SendCounter] == UART0_DATAEND)
else
{//檢測到結(jié)束符時,發(fā)送完后即置位發(fā)送緩存的標(biāo)志位
U0THR = UART0_SEND_DATAEND;
ui8_SendNewDataFlg = UART0_SDBUFNUSE; //發(fā)送完畢標(biāo)志
}
}
i=U0IIR;//進(jìn)入中斷后,后必須清一下對應(yīng)的中斷,防止中斷死鎖。
}//if(ui8_Uart0IntNum&0x02)//用中斷的方式,發(fā)送數(shù)據(jù)
VICVectAddr=0x00;//通知處理器中斷完成
}//__irq void IRQ_UART0(void)
void ClearSendDataBuf(void)
{
uint8 i;
ui8_SendCounter=0;
ui8_SendNewDataFlg = UART0_SDBUFNUSE; //不在使用中
for(i=0;i<UART0_LENGTH_SENDDATA;i++)
{
ui8_SendDataBuf[i]=0;
}
}
void ClearRecvDataBuf(void)
{
uint8 i;
ui8_RecvCounter = 0;
ui8_RecvNewDataFlg = 0;
for(i=0;i<UART0_LENGTH_RECVDATA;i++)
{
ui8_RecvDataBuf[i]=0;
}
}
void StartDataSend(void)
{
if(UART0_SDBUFNUSE == ui8_SendNewDataFlg)
{
ui8_SendCounter = 0; //發(fā)送數(shù)據(jù)計數(shù)器清零
ui8_SendNewDataFlg = UART0_SDBUFIUSE; //在使用中
U0THR = ui8_SendDataBuf[0];
ui8_SendCounter++;
}
}
uint8 Uart0_Send_String(const char *str, uint8 strlen)
{
int i;
if(str == NULL || strlen > UART0_LENGTH_SENDDATA)
return -1;
while(ui8_SendNewDataFlg == UART0_SDBUFIUSE); //等待前次發(fā)送完畢
ClearRecvDataBuf();
for(i = 0; i < strlen; i++)
ui8_SendDataBuf[i] = *(str + i);
StartDataSend();
return 0;
}
uint8 Uart0_recv_String(char *str, uint8 strlen)
{
uint8 i,count;
if(str == NULL)
return -1;
if(ui8_RecvNewDataFlg == UART0_SDBUFIUSE) {
memset(str, 0, strlen);
count = (ui8_RecvCounter >= strlen ? strlen : ui8_RecvCounter);
for(i = 0; i < count; i++)
*(str + i) = ui8_RecvDataBuf[i];
*(str + count) = '\0';
ClearRecvDataBuf();
return count;
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -