【mini2440】S3C2440的串口

article/2025/11/9 3:42:02

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 modeUBRDIV0 = (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 modeUBRDIV0 = (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->RXD0GPHCON = (2<<4) | (2<<6);//设置8位数据位,1个停止位,无校验位ULCON0 = 0x3;//打开发送和接收通道UCON0 = (1<<2) | (1<<0);//设置波特率//UBRDIVn = (int)( UART 时钟 / ( 波特率 × 16) ) –1UBRDIV0 = 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.cDESC: u2440mon entry point,menu,downloadHISTORY: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 moderUBRDIV0 = (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


http://chatgpt.dhexx.cn/article/9CujBIat.shtml

相关文章

mdk+2440

目前仍然有许多人在使用ADS1.2编译ARM9的程序&#xff0c;这款编译器实属经典&#xff0c;但是已经多年停止更新、维护了。这篇文章主要讲解ARM公司受够Keil之后力推的一款编译器MDK。 MDK的使用上和ADS1.2有很多相似之处&#xff0c;从ADS1.2过渡到MDK也是非常容易的一种事情。…

2440 时钟设置

首先需要知道时钟的概念&#xff1a; 1、是用来同步系统信号; 就举例来说&#xff1a; 如果你cpu用i2c传输一个数据给从机设备&#xff0c;那么你传输数据时从设备怎么知道数据有没有到达&#xff0c;多久检测一次数据线&#xff1f;&#xff1f;这个就需要时钟同步&#xff0c…

FL2440开发板简介及其烧录

目录 FL2440开发板简介 FL2440开发板 FL2440硬件资源列表 开发板存储系统&#xff1a; FL2440开发板烧录 FL2440烧录流程&#xff1a; 烧录准备工作 烧录文件: 硬件准备&#xff1a; 烧录过程 J-link操作&#xff1a; u-boot下烧录&#xff1a; 开发板启动流程&…

大数据分析平台和工具,主要有哪些?

1.Disco Disco最初由诺基亚开发&#xff0c;这是一种分布式计算框架&#xff0c;与Hadoop一样&#xff0c;它也基于MapReduce。它包括一种分布式文件系统以及支持数十亿个键和值的数据库。 支持的操作系统&#xff1a;Linux和OSX。 2.HPCC 作为Hadoop之外的一种选择&#x…

大数据分析平台的搭建方式有哪些

随着大数据时代的到来&#xff0c;数据价值的概念逐渐深入人心&#xff0c;许多企业开始搭建自己的大数据分析平台&#xff0c;以便在数据洪流中把握行业未来的发展方向。做任何事情之前&#xff0c;首先要设定目标和思路&#xff0c;然后根据确定的目标、思路和实际情况制定可…

目前大数据技术平台有很多,主要可以分为哪几类?

大数据的处理过程可以分为大数据采集、存储、结构化处理、隐私保护、挖掘、结果展示(发布)等&#xff0c;各种领域的大数据应用一般都会涉及到这些基本过程&#xff0c;但不同应用可能会有所侧重。对于互联网大数据而言&#xff0c;由于其具有独特完整的大数据特点&#xff0c;…

有哪些好的数据来源或者大数据平台?

分享下我自己平时收集的..共100多个O_O 网站分析类&#xff1a; 百度指数 - 以百度海量网民行为数据为基础的数据分享平台 Google趋势 - 了解 Google中热度上升的搜索 360指数 - 基于360搜索的大数据分享平台 Alexa - 网站排名 Google Analytics - Google出品&#xff0c;可…

大数据平台的软件有哪些?

查询引擎 一、Phoenix 简介&#xff1a;这是一个Java中间层&#xff0c;可以让开发者在Apache HBase上执行SQL查询。Phoenix完全使用Java编写&#xff0c;代码位于GitHub上&#xff0c;并且提供了一个客户端可嵌入的JDBC驱动。 Phoenix查询引擎会将SQL查询转换为一个或多个H…

[BigData]16家大数据分析平台

&#xfeff;&#xfeff; 对今天的企业来说&#xff0c;数据分析已经成为生死攸关的选择。我们分析一些著名的供应商&#xff0c;从Hadoop创业者到传统的数据库市场参与者。 革命 – 这个词汇十分准确地描述了我们所处的这个数据分析的时代。企业一方面紧紧握住大量不同类型的…

大数据网站汇总(数据搜集、大数据竞赛、)

一. 国家级大数据平台 1.1 国家大数据平台&#xff1a; 数据_中国政府网 (www.gov.cn) 1.2 司法大数据平台&#xff1a;中国司法大数据服务网 (court.gov.cn) 1.3 中国经济社会大数据研究平台&#xff1a;中国经济社会大数据研究平台 (cnki.net) 1.4 中国知网CNKI-总库&a…

linux cat命令的作用,Linux命令cat使用详解

cat命令功能&#xff1a; cat命令主要用来实现查看文件、创建文件、及合并、追加文件内容等功能。 cat命令主要参数&#xff1a; -n 或 –number&#xff1a;对输出文档的行数进行编号&#xff0c;从1开始。 -b 或 –number-nonblank&#xff1a;和 -n 功能相似&#xff0c;不同…

Windows 中使用 Linux 命令

如果要在 Windows 中运行 Linux 命令&#xff0c;那么 Cygwin 是一个推荐的工具。Cygwin 创建于 1995 年&#xff0c;旨在提供一个原生运行于 Windows 中的 POSIX 兼容环境。Cygwin 是由 Red Hat 员工和许多其他志愿者维护的自由开源软件。 二十年来&#xff0c;Windows 用户使…

设置 linux 命令别名

前言&#xff1a; 在操作 linux 的时候可能会碰到一些非常长的命令&#xff0c;这个命令平时用的比较频繁&#xff0c;每次输入执行感觉非常麻烦有木有。如果把一段长的命令设置成一个短的别名&#xff0c;是不是很方便&#xff1f; 1. alias 命令引入 找台 linux 机器执行一…

Linux命令之-telnet

使用telnet测试端口连通性 telnet命令是TELNET协议的用户接口&#xff0c;它支持两种模式&#xff1a;命令模式和会话模式&#xff0c;虽然telnet支持许多命令&#xff0c;但大部分情况下&#xff0c;我们只是使用它查看目标主机是否打开了某端口&#xff08;默认是23&#xf…

Linux 命令执行流程

今天继续给大家介绍Linux基础知识&#xff0c;本文主要内容是Linux命令执行的流程&#xff0c;不仅介绍了当我们键入一个Linux命令时系统的执行流程&#xff0c;还介绍了Linux系统中内部命令与外部命令的区别、PATH环境变量的作用等等。 Linux的命令执行流程如下&#xff1a; 1…

Linux命令之sync

概述 sync 命令可以强制将内存中的文件缓冲写入磁盘&#xff0c;更新块信息。 在 linux/unix 系统中&#xff0c;在文件或数据处理过程中一般先放到内存缓冲区中&#xff0c;等到适当的时候再写入磁盘&#xff0c;以提高系统的运行效率。这样虽然可以提高磁盘写入数据的效率&a…

Linux命令:scp

目录 简介 一、语法 二、示例 2.1 将本地文件复制到远程主机目录 2.2 将本地目录复制到远程主机目录 2.3 将远程主机的文件复制到本机 2.4 复制远程主机目录到本机 简介 今天我们来介绍一个Linux命令&#xff1a;scp scp — secure copy (remote file copy program)&am…

使用node.js构建一个web服务器(适合自学)

使用node.js构建一个web服务器 先介绍node.js的安装&#xff0c;再介绍使用node.js构建一个简单的web服务器&#xff0c;最后通过一个简单的示例&#xff0c;演示网页与服务器之间的数据交互的实现。 WEB服务器 WEB服务器也称为WWW服务器。WWW(World Wide Web、翻译成中文&a…

node-php-server 游戏服务器框架

做游戏服务器8年多了&#xff0c;用过lua, 用过C, 用过nodejs ,最近用的是php,有些人会说php不是用在web开发吗&#xff0c;怎么能用在游戏服务器的业务逻辑开发&#xff0c;php 怎么跟客户端通信&#xff0c;肯定有很多人不解。 其实很多时候&#xff0c;技术原理都是都是相通…

如何快速用node在本地搭建一个服务器

众所周知&#xff0c;服务器是通过安装特殊的软件&#xff08;或者运行特殊的代码&#xff09;来提供网络服务的机器。那么我们的电脑可不可以弄成一个服务器&#xff0c;来供他人访问呢&#xff1f; 答案是可以的&#xff0c;这里我们需要安装一下node.js这个软件。传送门&am…