【mini2440】S3C2440的串口

1. 基本电路

串口

2. 相关寄存器

2.1 引脚

引脚

2.2 框图

在这里插入图片描述

2.3 串口

串口

3. 相关代码

S3C2440A 中的时钟控制逻辑可以产生必须的时钟信号,包括 CPU 的 FCLK,AHB 总线外设的 HCLK 以及 APB 总线外设的 PCLK。S3C2440A 包含两个锁相环(PLL):一个提供给 FCLK、HCLK 和 PCLK,另一个专用于USB 模块(48MHz)。
工作频率

  • FCLK 最高 400MHz。提供给 ARM920T 的时钟。
  • HCLK 最高 136MHz。提供给用于 ARM920T,存储器控制器,中断控制器,LCD 控制器,DMA 和 USB 主机模块的 AHB
    总线的时钟。
  • PCLK 最高 68MHz。提供给用于外设如 WDT,IIS,I2C,PWM 定时器,MMC/SD 接口,ADC,UART,GPIO,RTC 和SPI 的 APB 总线的时钟。
  • 在ram.ini初始化文件中,定义了FCLK = 300 MHz, HCLK = 100 MHz, PCLK = 50 MHz

3.1 接收串口数据

//UTXH0 0x50000020(L)
//      0x50000023(B)W(字节) UART 通道0 发送缓冲寄存器
#define UTXH0       (*(int*)0x50000020)
//UTRSTAT0 0x50000010 R UART 通道0 Tx/Rx 状态寄存器
//URXH0 0x50000024(L)0x50000027(B)W(字节) UART 通道0 接收缓冲寄存器
#define URXH0       (*(int*)0x50000024)
#define UTRSTAT0       (*(int*)0x50000010)
//ULCON0 0x50000000 R/W UART 通道0 线路控制寄存器
#define ULCON0       (*(int*)0x50000000)
//UCON0 0x50000004 R/W UART 通道0 控制寄存器
#define UCON0       (*(int*)0x50000004)
//UBRDIV0 0x50000028 R/W 波特率分频寄存器0
#define UBRDIV0       (*(int*)0x50000028)
/*例如,如果波特率为115200 bps 并且UART 时钟为40 MHz,UBRDIVn 为:
UBRDIVn = (int)(40000000 / (115200 x 16) ) - 1
= (int)(21.7) - 1 [取最接近的整数]
= 22 - 1 = 21
*/
//GPHCON 0x56000070 R/W 配置端口H 的引脚
#define GPHCON       (*(int*)0x56000070)

#define PCLK   (50000000)
#define BPS    (115200)
unsigned char buff[20];
char len = 0;
void delay(unsigned int time)
{
      int i;
     for(i=0;i<time;i++);
}

void uart0_init(void)
{
    GPHCON = (2<<4) | (2<<6);
	ULCON0 = 0x03;
	UCON0 = (1<<2)|(1<<0);//TX/RX enable->polling mode

	UBRDIV0 = (PCLK/(BPS*16))-1;
}
int main(void)
{
	uart0_init();
    while(1)
    {
		while((UTRSTAT0&0x01)==0); //为0等待,为1表示有数据
		buff[len++] = URXH0;
		if(len==20)
		{
		   len = 0;
		}
	//	delay(0x50000);
    }
}

3.2 发送串口数据

//UTXH0 0x50000020(L)
//      0x50000023(B)W(字节) UART 通道0 发送缓冲寄存器
#define UTXH0       (*(int*)0x50000020)
//UTRSTAT0 0x50000010 R UART 通道0 Tx/Rx 状态寄存器
#define UTRSTAT0       (*(int*)0x50000010)
	

//ULCON0 0x50000000 R/W UART 通道0 线路控制寄存器 (数据位,停止位,校验位,红外模式。。。)
#define ULCON0       (*(int*)0x50000000)
	
//UCON0 0x50000004 R/W UART 通道0 控制寄存器
#define UCON0       (*(int*)0x50000004)
	
//UBRDIV0 0x50000028 R/W 波特率分频寄存器0
#define UBRDIV0       (*(int*)0x50000028)
/*例如,如果波特率为115200 bps 并且UART 时钟为40 MHz,UBRDIVn 为:
UBRDIVn = (int)(40000000 / (115200 x 16) ) - 1
= (int)(21.7) - 1 [取最接近的整数]
= 22 - 1 = 21
*/
//GPHCON 0x56000070 R/W 配置端口H 的引脚
#define GPHCON       (*(int*)0x56000070)

#define PCLK   (50000000)
#define BPS    (115200)
void delay(unsigned int time)
{
      int i;
     for(i=0;i<time;i++);
}
void send_char(unsigned char data)
{
  	UTXH0 = data;
	while((UTRSTAT0&0x04)==0); //为0等待
}
void uart0_init(void)
{
    GPHCON = (2<<4) | (2<<6);
	ULCON0 = 0x03;
	UCON0 = 1<<2;//TX enable->polling mode
	UBRDIV0 = (PCLK/(BPS*16))-1;
}
int main(void)
{
	uart0_init();
    while(1)
    {
			send_char('a');
			delay(0x50000);
    }
}

3.3 收到数据并发送数据

//0x50000020(L)
//0x50000023(B)
//(字节) UART 通道0 发送缓冲寄存器
#define UTXH0    	(*(volatile unsigned int *)0x50000020)//UTXH0
#define URXH0      (*(volatile unsigned int *)0x50000024) // (L)
#define UTRSTAT0    (*(volatile unsigned int *)0x50000010)  //R UART 通道0 Tx/Rx 状态寄存器
#define ULCON0      (*(volatile unsigned int *)0x50000000)//  //R/W UART 通道0 线路控制寄存器
#define UCON0       (*(volatile unsigned int *)0x50000004)//  //R/W UART channel 0 control register
#define UBRDIV0     (*(volatile unsigned int *)0x50000028) //  R/W 波特率分频寄存器0

#define GPHCON      (*(volatile unsigned int *)0x56000070)   //R/W 配置端口H 的引脚
#define PCLK    (50000000)
#define BPS     (9600)

char str[]="atd13818653949;";

struct _DATA_
{
   char data[20];
   unsigned char len;
};

struct _DATA_ DATA;

void delay(unsigned int time)
{
     unsigned int i;
     for(i=0;i<time;i++);
}
void sendchar(char data)
{
    UTXH0 = data;
     while((UTRSTAT0 & 0x4)==0);
}
void sendstring(char *p)
{
     while(*p!=0x00)
     {
        sendchar(*p++);
     }
     
}
int main(void)
{
    //设置GPH2->TXD0,GPH3->RXD0
    GPHCON = (2<<4) | (2<<6);
    //设置8位数据位,1个停止位,无校验位
    ULCON0 = 0x3;
    //打开发送和接收通道
    UCON0 = (1<<2) | (1<<0);
    //设置波特率
    //UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) –1
    UBRDIV0 = PCLK/(BPS*16) -1;
    
    DATA.len = 0;
	while(1)
	{
	//判断接收缓存器是否有新数据
	     while((UTRSTAT0 & 0x1)==0);
	    //从接收保持寄存器里面取出数据存放到
	    //结构体里面
	     DATA.data[DATA.len++]=URXH0;
	     //把收到的数据发给电脑
	     sendchar(DATA.data[DATA.len-1]);
	     if(DATA.len==20)
	     {
	      DATA.len = 0;
	     }
	}

   
}

3.4 串口中断

使用到了MMU模块。

/****************************************************************
 NAME: u2440mon.c
 DESC: u2440mon entry point,menu,download
 HISTORY:
 Mar.25.2002:purnnamu: S3C2400X profile.c is ported for S3C2410X.
 Mar.27.2002:purnnamu: DMA is enabled.
 Apr.01.2002:purnnamu: isDownloadReady flag is added.
 Apr.10.2002:purnnamu: - Selecting menu is available in the waiting loop. 
                         So, isDownloadReady flag gets not needed
                       - UART ch.1 can be selected for the console.
 Aug.20.2002:purnnamu: revision number change 0.2 -> R1.1       
 Sep.03.2002:purnnamu: To remove the power noise in the USB signal, the unused CLKOUT0,1 is disabled.
 ****************************************************************/
#define	GLOBAL_CLK		1

#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
//#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"

#define PCLK   (50000000)
#define BPS    (115200)

unsigned char buff[20];
char len = 0;

static void __irq Uart0_ISR(void)
{
        char i;
        buff[len++] = rURXH0;
		if(len==20)
		{
		   for(i=0;i<len;i++)
		   {
		      buff[i++]=0x00;
		   }
		   len = 0;
		  
		}
		ClearSubPending(BIT_SUB_RXD0);
		ClearPending(BIT_UART0);	
}
void uart0_init(void)
{
    rGPHCON = (2<<4) | (2<<6);
	rULCON0 = 0x03;
	rUCON0 = (1<<2)|(1<<0);//TX/RX enable->polling mode

	rUBRDIV0 = (PCLK/(BPS*16))-1;
}
	
int main(void)
{

	uart0_init();
    MMU_Init(); 
	//(*((int*)(0x33ffff00+0x58)
    pISR_UART0 =  (unsigned int)Uart0_ISR;
	EnableSubIrq(BIT_SUB_RXD0);
	EnableIrq(BIT_UART0);
	
   	while(1);
}

4. 资料

https://download.csdn.net/download/Kshine2017/74086101

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值