?? main.c
字號(hào):
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co., LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: litiantian
** Created date: 2007-03-19
** Version: 1.0
** Descriptions: 串口收發(fā)和自動(dòng)波特率應(yīng)用示例
**
**------------------------------------------------------------------------------------------------------
** Modified by: Liuyanlong
** Modified date: 2007-09-03
** Descriptions: 對(duì)代碼風(fēng)格和注釋進(jìn)行了調(diào)整和校對(duì)
**
********************************************************************************************************/
#include "config.h"
#include <stdio.h>
#define UART0_INT 6
uint32 Rcv_New = 0; // 為1時(shí)表明接收到新數(shù)據(jù)
uint32 Snd_N = 0; // 記錄接收數(shù)據(jù)完畢后,需發(fā)送數(shù)據(jù)的個(gè)數(shù)
uint8 Rcv_Buf[8]; // 字符接收數(shù)組
/* 該宏先發(fā)送回車(chē)字符0x0d到EasyARM串口調(diào)試軟件,然后再發(fā)送換行字符0x0a */
#define DISP_CHANGEROW() UART0_SendByte (0x0d); UART0_SendByte (0x0a)
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :UART0_SendByte
** 函數(shù)功能 :以查詢(xún)方式發(fā)送一字節(jié)數(shù)據(jù)
** 入口參數(shù) :dat 要發(fā)送的數(shù)據(jù)
** 出口參數(shù) :無(wú)
*********************************************************************************************************/
void UART0_SendByte(char dat)
{
U0THR = dat;
while ((U0LSR & 0x40) == 0); // 等待數(shù)據(jù)發(fā)送完畢
}
/**********************************************************************************************************
** 函數(shù)名稱(chēng) :UART0_SendStr
** 函數(shù)功能 :向串口發(fā)送一字符串
** 入口參數(shù) :str 要發(fā)送的字符串的指針
** 出口參數(shù) :無(wú)
**********************************************************************************************************/
void UART0_SendStr(char *str)
{
while (1)
{
if (*str == '\0')
{
break; // 遇到結(jié)束符,退出
}
UART0_SendByte(*str++);
}
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :UART0_SendBuf
** 函數(shù)功能 :向串口發(fā)送數(shù)據(jù)
** 入口參數(shù) :uint32 snd_n: 發(fā)送數(shù)據(jù)的個(gè)數(shù)。snd_n 小于8
** uint8* RcvBufPt:緩存地址
** 出口參數(shù) :無(wú)
**********************************************************************************************************/
void UART0_SendBuf(uint8* RcvBufPt, uint32 snd_n)
{
uint32 i;
VICIntEnClr |= 1 << UART0_INT; // 保護(hù)字符接收數(shù)組不被其它中斷破壞
for (i = 0; i < snd_n; i++) // 使用發(fā)送FIFO發(fā)送數(shù)據(jù)
{
U0THR = RcvBufPt[i];
}
while ((U0LSR & 0x40) == 0); // 等待數(shù)據(jù)發(fā)送完畢
VICIntEnable |= 1 << UART0_INT;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :IRQ_UART0
** 函數(shù)功能 :串口0接收中斷服務(wù)程序
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
*******************************************************************************************************/
void __irq IRQ_UART0(void)
{
uint32 i = 0;
uint32 IIR = 0;
/* UART0接收中斷處理 */
while (((IIR = U0IIR) & 0x01) == 0) // 若尚有中斷待處理
{
switch (IIR & 0x0e)
{
/* RDA中斷處理入口 */
case 0x04:
Rcv_New = 1;
for (i = 0; i < 8; i++)
{
Rcv_Buf[i] = U0RBR; // 讀空FIFO,清除RDA中斷
}
Snd_N = 8; // 收到8個(gè)數(shù)據(jù)
break;
/* CTI中斷處理入口 */
case 0x0c:
Rcv_New = 1;
for (i = 0; i < 8; i++)
{
if ((U0LSR & 0x01) == 0x01)
{
Rcv_Buf[i] = U0RBR; // 讀空FIFO,清除CTI中斷
}
else
{
break;
}
}
Snd_N = i; // 在CTI中斷里保存了i個(gè)有效數(shù)據(jù)
default:
break;
}
}
VICVectAddr = 0x00;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :ClrRcvFIFO
** 函數(shù)功能 :讀空接收FIFO
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
*********************************************************************************************************/
void ClrRcvFIFO(void)
{
volatile uint32 i, temp = 0;
for (i = 0; i < 8; i++)
{
if ((U0LSR & 0x01) == 0x01)
{
temp = U0RBR; // 讀空接收FIFO
}
else
{
break;
}
}
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :UART0_Init
** 函數(shù)功能 :令串口0完成全部初始化工作
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
*********************************************************************************************************/
void UART0_Init(void)
{
uint32 bak = 0;
/* 在PCONP里啟用UART0 */
PCONP |= 1 << 3; // 使能UART0
/* 初始化引腳 */
PINSEL0 = (0x01 << 4) | (0x01 << 6); // 設(shè)置P0.2和P0.3連接到UART0
/* 初始化幀格式 */
bak = 8 - 5; // 設(shè)置數(shù)據(jù)位個(gè)數(shù)
bak &= ~0x04; // 設(shè)置為1位停止位
bak &= ~(0x01 << 4); // 設(shè)置為無(wú)奇偶校驗(yàn)
U0LCR = bak;
/* 設(shè)置FIFO */
U0FCR = 0x81; // 使能FIFO,并設(shè)置FIFO觸發(fā)深度大小為8個(gè)字節(jié)
/* 清除接收FIFO內(nèi)的數(shù)據(jù) */
ClrRcvFIFO();
/* 初始化UART VIC 中斷接口 */
VICIntEnClr |= 1 << UART0_INT;
VICVectPri6 = 0x05;
VICVectAddr6 = (uint32)IRQ_UART0;
VICIntEnable |= 1 << UART0_INT;
IRQEnable();
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :AutoBaud
** 函數(shù)功能 :自動(dòng)波特率功能演示
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
*********************************************************************************************************/
void AutoBaud(void)
{
char str[64];
uint32 baud;
uint16 dlm, dll;
VICIntEnClr |= 1 << UART0_INT;
/* 啟動(dòng)自動(dòng)波特率測(cè)量 */
U0ACR = 0x03; // 允許自動(dòng)波特率
while ((U0ACR & 0x01) != 0x0); // 等待自動(dòng)波特率測(cè)量完成
/* 測(cè)量結(jié)束 */
U0ACR |= 0x01 << 8; // 清除自動(dòng)波特率中斷標(biāo)志
U0IER &= ~(0x01 << 8); // 禁止自動(dòng)波特率中斷
/* 讀取除數(shù)鎖存器和小數(shù)波特率發(fā)生器的值 */
U0LCR = 0x83; // DLAB=1
dlm = U0DLM;
dll = U0DLL;
U0LCR = 0x03;
/* 計(jì)算并發(fā)送當(dāng)前波特率 */
baud = (Fpclk / (16 * (256 * dlm + dll)));
sprintf(str, "Hello! Baud is %4d bps", baud);
UART0_SendStr(str);
DISP_CHANGEROW();
ClrRcvFIFO();
VICIntEnable |= 1 << UART0_INT;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :main
** 函數(shù)功能 :等待接收數(shù)據(jù),自動(dòng)設(shè)定波特率,然后將設(shè)定的波特率參數(shù)發(fā)送回PC,接下來(lái)則接收上位機(jī)發(fā)來(lái)的數(shù)據(jù)并發(fā)回
** 調(diào)試說(shuō)明 :1、需要PC串口顯示終端軟件如EasyARM.exe;
** 2、需將TXD0、RXD0分別用短路器和P0.2、P0.3短接;
** 3、本工程需在片內(nèi)RAM中調(diào)試;
** 4、若在設(shè)置EasyARM.exe的波特率時(shí)彈出“不能打開(kāi)該端口”信息,請(qǐng)繼續(xù)調(diào)試;若調(diào)試不成功,
** 再檢查串口連接路徑和設(shè)置的波特率。
*********************************************************************************************************/
int main(void)
{
UART0_Init();
AutoBaud();
U0IER |= 0x01; // 使能RDA和CTI中斷
while (1)
{
if (Rcv_New == 1)
{
Rcv_New = 0;
UART0_SendBuf(Rcv_Buf, Snd_N);
}
}
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -