?? dec5502_uart.c
字號:
/******************************************************************************/
/* Copyright 2004 by SEED Electronic Technology LTD. */
/* All rights reserved. SEED Electronic Technology LTD. */
/* Restricted rights to use, duplicate or disclose this code are */
/* granted through contract. */
/* */
/* */
/******************************************************************************/
/*----------------------------------------------------------------------------*/
/* MODULE NAME... Uart and emif */
/* FILENAME...... DEC5502_UART.c */
/* DATE CREATED.. Wed 6/11/2004 */
/* PROJECT....... Communicate with PC througth TL16C752B */
/* COMPONENT..... */
/* PREREQUISITS.. */
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/
/* DESCRIPTION: */
/* */
/* This is an example of communication with PC througth TL16C752B */
/*----------------------------------------------------------------------------*/
#include <stdio.h>
#include <csl.h>
#include <csl_pll.h>
#include <csl_chip.h>
#include <csl_irq.h>
#include <csl_emif.h>
#include <csl_gpt.h>
#include <csl_emifBhal.h>
#include "UART.h"
#include "type.h"
#include "emif.h"
#define LENGTH 20
/* Function/ISR prototypes */
extern void VECSTART(void);
interrupt void UartIsr(void);
interrupt void Timer0Isr(void);
/* Define receiver data array */
unsigned int ReceivData[LENGTH];
HANDLE MyUart;
Uint16 EventId0; // 定時器0所對應的事件ID號
BOOL PctoDsp = False;
/* Create a TIMER_Handle object for use with TIMER_open */
GPT_Handle hGpt;
Uint16 Counter;
Uint16 i, j;
Uint16 DataCount;
Uint16 Temp=0;
GPT_Config MyGptConfig = {
0, //Emulation management register
0, //GPIO interrupt control register
0, //GPIO enable register
0, //GPIO direction register
0, //GPIO data register
//0xC4B4, //Timer period register 1
//0x4, //Timer period register 2
0x56C4, //Timer period register 1 (主頻為300MHz)
0x0003, //Timer period register 2
0, //Timer period register 3
0, //Timer period register 4
GPT_GPTCTL1_RMK( //Timer control register 1
GPT_GPTCTL1_TIEN_NOT_GATED,
GPT_GPTCTL1_CLKSRC_VBUS,
GPT_GPTCTL1_ENAMODE_CONTINUOUS,
GPT_GPTCTL1_PWID_INACTIVE_1CYCLE,
GPT_GPTCTL1_CP_CLOCK_MODE,
GPT_GPTCTL1_INVIN_DONT_INVERT_OUTPUT,
GPT_GPTCTL1_INVOUT_DONT_INVERT_OUTPUT
),
GPT_GPTCTL2_RMK( //Timer control register 2
GPT_GPTCTL2_TIEN_NOT_GATED,
GPT_GPTCTL2_CLKSRC_VBUS,
GPT_GPTCTL2_ENAMODE_CONTINUOUS,
GPT_GPTCTL2_PWID_INACTIVE_1CYCLE,
GPT_GPTCTL2_CP_CLOCK_MODE,
GPT_GPTCTL2_INVIN_DONT_INVERT_OUTPUT,
GPT_GPTCTL2_INVOUT_DONT_INVERT_OUTPUT
),
GPT_GPTGCTL1_RMK( //Global timer control register
GPT_GPTGCTL1_PSC34_DEFAULT,
GPT_GPTGCTL1_TIMMODE_DEFAULT,
GPT_GPTGCTL1_TIM34RS_IN_RESET,
GPT_GPTGCTL1_TIM12RS_IN_RESET
)
};
void main(void)
{
/* Initialize CSL library - This is REQUIRED !!! */
CSL_init();
/* Set IVPH/IVPD to start of interrupt vector table */
IRQ_setVecs((Uint32)(&VECSTART)<<1);
/* Config PLL */
PLL_setFreq(1, // PLL mode
0xF, // Multiply factor, Valid values are (multiply by 10)
0, // Sysclk 0 Divide Down
1, // Sysclk1 Divider 150MHz
3, // Sysclk2 Divider 75MHz 20ns
3, // Sysclk3 Divider
0); // CLKOUT3(DSP core clock) divider 300MHz
/* Config EMIF interface for UART register access */
Emif_Config();
/* Clear receiver data structure */
for(i=0; i<LENGTH; i++)
{
ReceivData[i] = 0;
}
/* Open Timer 0, set registers to power on defaults */
/* And return handle of Timer 0 */
hGpt = GPT_open(GPT_DEV0, GPT_OPEN_RESET);
/* Write configuration structure values to Timer control regs */
GPT_config(hGpt, &MyGptConfig);
/* 打開外擴串口,并獲得一個外擴串口的一個句柄 */
MyUart = uart_open(UART_B); //UART_B
/* 配置已打開的外擴串口 */
uart_setup( MyUart,
UARTBAUD9600, /* 波特率為9600 bps */
data_w8, /* 數據長度為8 */
data_s1, /* 數據停止位為1 */
data_po, /* 設置奇較驗 */
fifo_disable, /* 禁止fifo */
UartLoop_NO); /* 取消自閉環方式 */
/* 執行虛讀接收保持寄存器和線狀態寄存器,清空接收接收保持寄存器和線狀態寄存器 */
Temp = uart_read_reg(MyUart,rhr);
Temp = uart_read_reg(MyUart,lsr);
/* 設置外擴串口的中斷 */
uart_interrupt_control( MyUart, uartint_rhr); //設置接收中斷
/* 獲取定時器所對應的事件ID */
EventId0 = GPT_getEventId(hGpt);
/* Temporarily disable all maskable interrupts */
IRQ_globalDisable();
/* Clear extern user interrupt 1 interrupt enable bit */
IRQ_disable(IRQ_EVT_INT1);
IRQ_disable(EventId0);
/* Clear any pending extern interrupt 1 */
IRQ_clear(IRQ_EVT_INT1);
IRQ_clear(EventId0);
/* Place interrupt service routine address at */
/* associated vector location */
IRQ_plug(IRQ_EVT_INT1, &UartIsr);
IRQ_plug(EventId0,&Timer0Isr);
/* Enable External User Interrupt #1 */
IRQ_enable(IRQ_EVT_INT1);
IRQ_enable(EventId0);
/* Enable all maskable interrupts */
IRQ_globalEnable();
/* wait for certain time */
for(i=0; i<200; i++)
{}
// 將下列數據拷貝到PC機端串口調試助手的發送區內,當程序進入for循環后,執行手動發送
// 1112131415161718191A1B1C1D1E1F2021222324
DataCount=0;
while(1)
{
// Enter system dead-loop and waitting for interrupt
if(PctoDsp == True)
{
Myuart_Send(MyUart, LENGTH, ReceivData);
PctoDsp = False;
}
}
}
/*----------------------外部中斷1的中斷程序---------------------------------------*/
interrupt void UartIsr(void)
{
ReceivData[DataCount] = uart_receive_single(MyUart);
DataCount++;
if(DataCount>=LENGTH)
{
DataCount = 0;
PctoDsp = True;
}
}
/********************************************************************/
/* 函數名: Timer0Isr() */
/* 功能: 當定時時間到,發送一個命令字符并且字符發送計數器加1 */
/********************************************************************/
interrupt void Timer0Isr(void)
{
uart_write_reg(UartChannel,thr,*SendDataPtr++);
Counter++;
}
/****************************************************************************************************/
// No more
/****************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -