?? main.c
字號:
/****************************************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: 串口收發和自動波特率應用示例
**
**------------------------------------------------------------------------------------------------------
** Modified by: Liuyanlong
** Modified date: 2007-09-03
** Descriptions: 對代碼風格和注釋進行了調整和校對
**
********************************************************************************************************/
#include "config.h"
#include <stdio.h>
#define UART0_INT 6
#define Baud 115200
volatile uint32 Rcv_New = 0; // 為1時表明接收到新數據
volatile uint32 Snd_N = 0; // 記錄接收數據完畢后,需發送數據的個數
uint8 Rcv_Buf[16]; // 字符接收數組
/* 該宏先發送回車字符0x0d到EasyARM串口調試軟件,然后再發送換行字符0x0a */
#define DISP_CHANGEROW() UART0_SendByte (0x0d); UART0_SendByte (0x0a)
/*********************************************************************************************************
** 函數名稱 :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;
}
/*********************************************************************************************************
** 函數名稱 :IRQ_UART0
** 函數功能 :串口0接收中斷服務程序
** 入口參數 :無
** 出口參數 :無
*******************************************************************************************************/
void __irq IRQ_UART0(void)
{
uint32 i = 0;
uint32 IIR = 0;
/* UART0接收中斷處理 */
while (((IIR = U0IIR) & 0x01) == 0) // 若尚有中斷待處理
{
switch (IIR & 0x0e)
{
/* 中斷處理入口 */
case 0x04:
case 0x0c:
Rcv_New = 1;
if ((U0LSR & 0x01) == 0x01) {
Rcv_Buf[i] = U0RBR; // 讀空FIFO,清除中斷
i++;
}
Snd_N = i; // 在中斷里保存了i個有效數據
default:
break;
}
}
VICVectAddr = 0x00;
}
/*********************************************************************************************************
** 函數名稱 :UART0_Init
** 函數功能 :令串口0完成全部初始化工作
** 入口參數 :無
** 出口參數 :無
*********************************************************************************************************/
void UART0_Init(void)
{
/* 在PCONP里啟用UART0 */
PCONP |= 1 << 3; // 使能UART0
/* 初始化引腳 */
PINSEL0 = (PINSEL0 & 0xFFFFFF0F) | (0x01 << 4) | (0x01 << 6); // 設置P0.2和P0.3連接到UART0
U0LCR = 0x83;
U0DLM = ((Fpclk / 16) / Baud) / 256;
U0DLL = ((Fpclk / 16) / Baud) % 256;
U0LCR = 0x03;
/* 設置FIFO */
U0FCR = 0x83; // 使能FIFO,并設置FIFO觸發深度大小為8個字節
U0IER |= 0x01; // 使能RDA和CTI中斷
/* 初始化UART VIC 中斷接口 */
VICIntSelect = 0;
VICIntEnClr |= 1 << UART0_INT;
VICVectPri6 = 0x05;
VICVectAddr6 = (uint32)IRQ_UART0;
VICIntEnable |= 1 << UART0_INT;
IRQEnable();
}
/*********************************************************************************************************
** 函數名稱 :main
** 函數功能 :等待“A”或者“a”,自動設定波特率,然后將設定的波特率參數發送回PC,接下來則接收上位機發來的數據并發回
** 調試說明 :1、需要PC串口顯示終端軟件如EasyARM.exe;
** 2、需將TXD0、RXD0分別用短路器和P0.2、P0.3短接;
** 3、若在設置EasyARM.exe的波特率時彈出“不能打開該端口”信息,請繼續調試;若調試不成功,再檢查串口連接路徑和設置的波特率。
*********************************************************************************************************/
int main(void)
{
UART0_Init();
while (1)
{
if (Rcv_New == 1)
{
Rcv_New = 0;
UART0_SendBuf(Rcv_Buf, Snd_N);
}
}
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -