?? 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: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Litiantian
** Modified date: 2007-03-08
** Version:
** Descriptions: UART3 IrDA演示,接收程序。
**
**------------------------------------------------------------------------------------------------------
** Modified by: yangshiping
** Modified date: 2007-09-03
** Version:
** Descriptions: 對(duì)程序的風(fēng)格以及注釋略作調(diào)整,并檢查代碼。
**
** Rechecked by: Litiantian
********************************************************************************************************/
#include "config.h"
#define IR_EN (1 << 14) // IR_EN引腳P0.14
#define UART3_INT 29 // UART3的中斷通道號(hào)
#define UART_BPS 115200 // 設(shè)定UART0和上位機(jī)通訊的波特率
#define IrDA_BPS 115200 // 設(shè)定IrDA通信的波特率
#define RcvBufLength 14 // 用于指定存儲(chǔ)接收數(shù)據(jù)的緩存大小
volatile uint8 rcv_new = 0; // 指示標(biāo)志,指示接收緩存是否已滿,為1時(shí)表明接收緩存已滿
volatile uint8 RcvBuf[RcvBufLength];
volatile uint32 BufPt = 0; // 接收緩存的指針
/*********************************************************************************************************
** 函數(shù)名稱:IRQ_UART3
** 函數(shù)功能:串口3接收中斷服務(wù)程序
** 入口參數(shù):無
** 出口參數(shù):無
*********************************************************************************************************/
void __irq IRQ_UART3(void)
{
if (BufPt < RcvBufLength)
{
RcvBuf[BufPt++] = U3RBR; // 獲取接收到的數(shù)據(jù),填入緩存
}
else
{
rcv_new = 1;
BufPt = 0;
}
VICVectAddr = 0x00; // 中斷處理結(jié)束
}
/*********************************************************************************************************
** 函數(shù)名稱:UART0_IniDft
** 函數(shù)功能:按默認(rèn)值初始化串口0的引腳和通訊參數(shù)。設(shè)置為8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn),波特率115200。
** 入口參數(shù):無
** 出口參數(shù):無
**********************************************************************************************************/
void UART0_IniDft(void)
{
uint32 Fdiv = 0;
PCONP |= (1 << 3); // 打開UART0
/* 初始化相關(guān)的IO */
PINSEL0 = (0x01 << 4) | (0x01 << 6); // 設(shè)置P0.2和P0.3連接到UART0
/* 初始化串口通訊參數(shù) */
U0LCR = 0x80; // DLAB=1,允許設(shè)置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 設(shè)置波特率為UART_BPS
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; // 令DLAB位為0,設(shè)置幀格式為8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)
U0FCR &= ~0x07; // 禁用FIFO
U0IER &= ~0x07; // 禁止UART產(chǎn)生中斷
}
/*********************************************************************************************************
** 函數(shù)名稱:IrDARcvInit
** 函數(shù)功能:按默認(rèn)值初始化串口3的引腳和通訊參數(shù)。串口3設(shè)置為8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn),波特率115200,使用IrDA。
** 入口參數(shù):無
** 出口參數(shù):無
**********************************************************************************************************/
void IrDARcvInit(void)
{
uint32 Fdiv = 0;
PCONP |= (1 << 25); // 打開UART3
PINSEL9 = (0x03 << 24) | (0x03 << 26);// 設(shè)置P4.28和P4.29連接到UART3
/* 初始化紅外接收模塊HSDL-3602 */
PINSEL0 &= ~(0x03 << 28);
FIO0MASK &= ~IR_EN;
FIO0DIR |= IR_EN;
FIO0CLR = IR_EN; // 令和IR_EN短接的P0.14輸出低電平,使接收方的紅外接收模塊工作在SIR模式
/* 配置IrDA */
U3ICR = 0; // 清零IrDA控制寄存器
U3ICR = 0x05; // 使能IrDA,串行輸入反相
/* 初始化串口通訊參數(shù) */
U3LCR = 0x80; // 設(shè)置為8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn),DLAB=1,允許設(shè)置波特率
Fdiv = (Fpclk / 16) / IrDA_BPS; // 設(shè)置波特率為UART_BPS
U3DLM = Fdiv / 256;
U3DLL = Fdiv % 256;
U3LCR = 0x03; // 令DLAB位為0,設(shè)置幀格式為8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)
U3FCR = 0xc1; // 使能FIFO,觸發(fā)點(diǎn)為14個(gè)字符
/* 配置中斷 */
U3IER = 0x01; // 設(shè)置中斷使能寄存器,接收中斷使能
VICIntEnClr |= (1 << UART3_INT); // 禁止本中斷
VICVectPri29 = 0x05; // 設(shè)置串口中斷優(yōu)先級(jí)為5
VICVectAddr29 = (uint32)IRQ_UART3; // 裝入串口中斷服務(wù)程序地址
VICIntEnable |= (1 << UART3_INT); // 使能本中斷
IRQEnable(); // 使能IRQ中斷
}
/*********************************************************************************************************
** 函數(shù)名稱:UART0_SendDat
** 功能描述:從串口0發(fā)送數(shù)據(jù)
** 入口參數(shù):data
** 出口參數(shù): 無
********************************************************************************************************/
void UART0_SendDat(uint8 data)
{
U0THR = data;
while ((U0LSR & 0x20) == 0);
}
/*********************************************************************************************************
** 函數(shù)名稱:main
** 函數(shù)功能:接收其它紅外源發(fā)送的脈沖并譯碼,再發(fā)送給上位機(jī)顯示
** 入口參數(shù):無
** 出口參數(shù):無
** 調(diào)試說明:1、使交換數(shù)據(jù)的兩個(gè)紅外設(shè)備的收發(fā)端對(duì)準(zhǔn);
** 2、此外要注意波特率和幀格式的一致;
** 3、需用短路器將P0.2、P0.3和TXD0、RXD0連接,P0.14和IR_EN連接,P4.29和IR_R連接;
** 4、需用串口連接線將CON6和PC機(jī)串口連接;
** 5、注意在EasyARM.exe串口調(diào)試軟件里選擇16進(jìn)制顯示。
*********************************************************************************************************/
int main (void)
{
uint32 i = 0;
UART0_IniDft(); // 串口0初始化為波特率115200,幀格式設(shè)置為8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)
IrDARcvInit(); // 初始化串口3引腳,并配置好IrDA
while (1)
{
if (rcv_new == 1) // 檢查接收標(biāo)志,若緩沖區(qū)接收滿字符再將其發(fā)送回去
{
rcv_new = 0;
for (i = 0; i < RcvBufLength; i++)
{
UART0_SendDat(RcvBuf[i]);
}
}
}
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -