📄 serial.c
字号:
/*************************************************************************
* File Name:Serial.c
* Description:串口DMA发送方式通信--CPU工作频率为60MHz(开发板外接8MHz),波
* 特率为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许
* UART发送DMA,启用FIFO,发送FIFO触发DMA级别为空。不使用Modem
* 自动流控。采用DMA方式通信。
* Date:2007-10-09
*************************************************************************/
#include <S3C44B0X.H> // S3C44B0X预定义文件
#define pUTXH0 0x01D00020
#define pURXH0 0x01D00024
#define MCLK 60000000 // 主时钟频率
#define BR 19200 // 波特率
#define BRD ((int)(MCLK/16.0/BR+0.5)-1) // 波特率除数因子
#define TXDATA_SIZE 0x100
// 定时间隔= TCNTBn / ( MCLK / (预定标值+1) / 分频值)
// TCNTBn = MCLK / TCLK / (预定标值+1) / 分频值
#define TCLK 0.25 // 定时间隔为4s,则频率TCLK为0.25Hz
#define TCNT ((int)(MCLK/TCLK/256/16+0.5)) // 计数初值
void uart_init(void); // Uart初始化
void init_timer(void); // 定时器初始化
void isr_init(void); // 中断控制器初始化
void dmac_init(void); // DMA控制器初始化
unsigned char txdata[TXDATA_SIZE]; // 发送缓冲区
int main(void)
{
unsigned int k;
// 初始化发送缓冲区
for(k=0; k<TXDATA_SIZE; k++)
txdata[k] = (unsigned char)k;
uart_init( ); // Uart初始化
init_timer( ); // 定时器初始化
isr_init( ); // 中断控制器初始化
dmac_init( ); // DMA控制器初始化
while(1) // 死循环,等待中断
{
}
}
// 串口初始化
void uart_init(void)
{
pUART0->UBRDIV = BRD; // 19200bps
pUART0->ULCON = 0x03; // 帧长度8位,停止位1位,无校验
pUART0->UFCON = 0x21; // 启用FIFO,发送FIFO触发级别为空
pUART0->UCON = 0x008; // 发送BDMA0允许
}
// 初始化Timer5以及开定时中断
void init_timer(void)
{
pPWM->TCFG0 = 0xFF0000; // Timer5预定标值为255
pPWM->TCFG1 = MUX5_1_16; // Timer5分频值为16
pPWM->TCNTB5 = TCNT; // 加载Timer5计数初值
pPWM->TCON = T5_UPDATE; // 手动更新TCNTB5
pPWM->TCON = T5_START | // 启动定时器5,清除手动更新位
T5_AUTOREL; // 自动重装
}
// 中断控制器初始化
void isr_init(void)
{
pIC->INTMSK &= ~(INT_GLOBAL | // 全局开中断
INT_BDMA0 | // BDMA0中断允许
INT_TIMER5); // Timer5中断允许
pIC->INTCON = FIQ_DISABLE | // 禁止FIQ
IRQ_ENABLE | // 允许IRQ
VECT_IRQ; // IRQ采用中断向量模式
}
// DMA控制器初始化
void dmac_init(void)
{
// BDMA0 Initialize---UART Tx
pBDMA->DISRC0 = ((unsigned int)0x0<<30) // 字节传送
+ ((unsigned int)0x1<<28) // 内存地址递增
+ (unsigned int)(txdata); // txdata
pBDMA->DIDES0 = ((unsigned int)0x1<<30) // 存储器到I/O端口
+ ((unsigned int)0x3<<28) // I/O端口固定
+ (unsigned int)(pUTXH0); // UTXH0
pBDMA->DICNT0 = ((unsigned int)0x2<<30) // UART
+ ((unsigned int)0x1<<26) // 保留
+ ((unsigned int)0x3<<22) // TC到0产生中断
+ (0x0<<21) // 不自动重装
+ (0x0<<20) // DMA禁止
+ TXDATA_SIZE; // 传送计数
pBDMA->DICNT0 |= ((unsigned int)0x1<<20); // DMA允许
pBDMA->DCON0 = 0x0<<2; // 允许DMA请求
}
// 4s产生一次定时中断——UART定时发送
/* Timer 5 Interrupt Handler */
__irq void HandlerTIMER5(void)
{
pBDMA->DICNT0 |= ((unsigned int)0x1<<20); // DMA允许(0->1),重装初值,启动DMA操作
pIC->I_ISPC = INT_TIMER5; // 清除中断请求位
}
// 终止计数,则引起BDMA0中断,就会执行下面HandlerBDMA0中断服务子程序,
/* BDMA0 Interrupt Handler */
__irq void HandlerBDMA0(void)
{
//准备新的数据
pIC->I_ISPC = INT_BDMA0; // 清除BDMA0中断请求位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -