📄 serial.c
字号:
/*************************************************************************
* File Name:Serial.c
* Description:串口DMA发送方式通信--CPU工作频率为60MHz(开发板外接8MHz),波
* 特率为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许
* UART接收DMA,允许接收错误中断,启用FIFO,接收FIFO触发DMA级别
* 为12字节。不使用Modem自动流控,采用DMA方式通信。
* Date:2006-07-19
*************************************************************************/
// 中断控制器寄存器定义
#define INTCON (*(volatile unsigned long *)0x01E00000)
#define INTPND (*(volatile unsigned long *)0x01E00004)
#define INTMOD (*(volatile unsigned long *)0x01E00008)
#define INTMSK (*(volatile unsigned long *)0x01E0000C)
#define I_ISPC (*(volatile unsigned long *)0x01E00024)
// DMA控制器寄存器定义
#define BDCON0 (*(volatile unsigned long *)0x01F80000)
#define BDISRC0 (*(volatile unsigned long *)0x01F80004)
#define BDIDES0 (*(volatile unsigned long *)0x01F80008)
#define BDICNT0 (*(volatile unsigned long *)0x01F8000C)
#define BDCSRC0 (*(volatile unsigned long *)0x01F80010)
#define BDCDES0 (*(volatile unsigned long *)0x01F80014)
#define BDCCNT0 (*(volatile unsigned long *)0x01F80018)
// UART寄存器定义
#define ULCON0 (*(volatile unsigned long *)0x01D00000)
#define UCON0 (*(volatile unsigned long *)0x01D00004)
#define UFCON0 (*(volatile unsigned long *)0x01D00008)
#define UMCON0 (*(volatile unsigned long *)0x01D0000C)
#define UTRSTAT0 (*(volatile unsigned long *)0x01D00010)
#define UERSTAT0 (*(volatile unsigned long *)0x01D00014)
#define UFSTAT0 (*(volatile unsigned long *)0x01D00018)
#define UMSTAT0 (*(volatile unsigned long *)0x01D0001C)
#define UTXH0 (*(volatile unsigned long *)0x01D00020)
#define URXH0 (*(volatile unsigned long *)0x01D00024)
#define UBRDIV0 (*(volatile unsigned long *)0x01D00028)
#define pUTXH0 0x01D00020
#define pURXH0 0x01D00024
#define MCLK 60000000 /* Master Clock */
#define BR 19200 /* Baud Rate */
#define BRD ((int)(MCLK/16.0/BR+0.5)-1) /* Baud Rate Divisor */
#define RXDATA_SIZE 0xFF /* Baud Rate */
void uart_init(void); // Uart初始化
void isr_init(void); // 中断控制器初始化
void dmac_init(void); // DMA控制器初始化
unsigned char rxdata[RXDATA_SIZE]; // 接收缓冲区
int main(void)
{
uart_init( ); // Uart初始化
isr_init( ); // 中断控制器初始化
dmac_init( ); // DMA控制器初始化
while(1) // 死循环,等待中断
{
}
}
// 串口初始化
void uart_init(void)
{
UBRDIV0 = BRD; // 19200bps
ULCON0 = 0x03; // 帧长度8位,停止位1位,无校验
UFCON0 = 0x21; // 启用FIFO,接收FIFO触发级别为12字节
UCON0 = 0x0C2; // 接收BDMA0允许,允许接收超时、错误中断
}
// 中断控制器初始化
void isr_init(void)
{
INTMSK &= 0x03FDBF7F; // Global Interrupt Enable
// BDMA0 Interrupt Enable
// UART0/1 Error Interrupt Enable
// UART0 Rx Interrupt Enable
INTCON = 0x01; // Disable FIQ, Enable IRQ,
// IRQ Vectored Interrupt Mode
}
// DMA控制器初始化
void dmac_init(void)
{
// BDMA0 Initialize---UART Rx
BDISRC0 = ((unsigned int)0x0<<30) // byte
+ ((unsigned int)0x3<<28) // fix
+ (unsigned int)(pURXH0); // URXH0
BDIDES0 = ((unsigned int)0x2<<30) // IO2M
+ ((unsigned int)0x1<<28) // inc
+ (unsigned int)(rxdata); // rxdata
// UART,reserved,end_int,no reload,DMA disable,COUNT
BDICNT0 = ((unsigned int)0x2<<30)
+ ((unsigned int)0x1<<26)
+ ((unsigned int)0x3<<22)
+ (0<<21)+(0<<20)+RXDATA_SIZE;
BDICNT0 |= ((unsigned int)0x1<<20); // DMA enable
BDCON0 = 0x0<<2;
}
// 终止计数,则引起BDMA0中断,就会执行下面HandlerBDMA0中断服务子程序,
// BDMA0重新初始化——UART接着重新接收
/* BDMA0 Interrupt Handler */
__irq void HandlerBDMA0(void)
{
I_ISPC = ((unsigned int)0x1<<17); // 清除BDMA0 Interrupt
BDICNT0 |= ((unsigned int)0x1<<20); // DMA允许,重装初值,启动DMA传输
}
// 如果UART0/1接收错误,则引起UERR01中断,就会执行下面HandlerUERR01中断服务子程序,
// 读错误状态寄存器,如果是溢出错误,读接收缓冲区,以清除错误
/* UART0/1 Error Interrupt Handler */
__irq void HandlerUERR01(void)
{
unsigned char errdata, errflag;
I_ISPC = ((unsigned int)0x1<<14); // 清除UERR01 Error Interrupt
errflag = UERSTAT0; // 读错误状态寄存器
if(errflag&0x01) // 溢出错误
errdata = URXH0; // 读接收缓冲区
// 未进一步处理
}
// 如果UART0接收超时,则引起UERR0接收超时中断,就会执行下面HandlerURXD0中断服务子程序,
// 读走剩余数据
/* UART0 Rx Timeout Interrupt Handler (已经禁止接收中断) */
__irq void HandlerURXD0(void)
{
int rxcount, k;
unsigned char data[16]; // 最大16字节,FIFO限制
I_ISPC = (1<<7); // 清除UART0 Rx Interrupt
rxcount = UFSTAT0&0x0f; // 接收FIFO的数据量
for(k=0; k<rxcount; k++)
data[k]=URXH0 ; // 从接收FIFO读入剩余数据
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -