您现在的位置是: 首页 > 热门推荐 热门推荐

s3c2440硬件设计_s3c2440.h

tamoadmin 2024-07-31 人已围观

简介1.如何在S3C2440上linux操作系统下将串口的波特率提高以致9216002.我想买嵌入式学习板,买STM32系列的还是S3C2440的好?3.s3c2440是什么arm核4.关于arm9 s3c2440驱动7寸群创液晶的时序问题5.s3c2440为什么要进入中断模式设置6.ARM 处理器 三星公司 ARM9 系列的详细配好吧,我来告诉你:我和你很像,我之前学了51单片机,PIC单片机,然后

1.如何在S3C2440上linux操作系统下将串口的波特率提高以致921600

2.我想买嵌入式学习板,买STM32系列的还是S3C2440的好?

3.s3c2440是什么arm核

4.关于arm9 s3c2440驱动7寸群创液晶的时序问题

5.s3c2440为什么要进入中断模式设置

6.ARM 处理器 三星公司 ARM9 系列的详细配

s3c2440硬件设计_s3c2440.h

好吧,我来告诉你:

我和你很像,我之前学了51单片机,PIC单片机,然后觉得对于单片机都是大同小异,没想再去学单片机了,就想学点高端的东西,偶然听到ARM9比较适合学习,我就在网上买了ARM9,就是TQ2440(s3c2440)来学习,我从今年2月开始学习ARM,买了韦东山的书,配合自己学,我花了1个多月,我才明白ARM的启动流程,从bootloadr到裸机,我又花了1个多月,这和单片机的思想完全是两个概念,单片机我们只要在编译软件上写好程序就能直接烧进去运行,而ARM不是这样,你编写好程序之后还要依靠bootloadr(开机代码,类似XP的BIOS)来做一些工作环境的检验,然后烧通过超级终端选择,在通过DNW下载程序,和单片机完全是两个概念的操作方式。

这只是针对裸机,但是做裸机并没有多大成就感,无非就是熟悉下ARM的工作原理,要跑上系统才算上路,我现在正苦苦煎熬在系统中。

如果你不急于搞系统,建议你去学STM32,买了学习用的板子,好好熟悉下32位的微处理器的工作原理,这也算是从普通8位单片机到ARM32位微处理器的一个过渡,而且是很重要的一个过渡。

要是我当初也从STM32下手再入ARM,现在也没这么恼火了。

希望我的回答能帮助到你。

如何在S3C2440上linux操作系统下将串口的波特率提高以致921600

你好:

s2c2440稳定最高频率400MHz,你想要PCLK为70MHZ,那么根据FCLK:HCLK:PCLK的比例来看,FCLK最该为280MHz,也可以为140、或者就为70MHZ,设置1:1:1的比例。

比如FCLK为280MHz,根据公式FCLK=(2*m*Fin)/(p*2^s)=280,那么分配m、p、s参数为132、4、1,然后设置CLKDIV为3,分频比是1:2:4,那么PCLK就为70MHz了。

希望我的回答能帮助到你。

我想买嵌入式学习板,买STM32系列的还是S3C2440的好?

在说说我做的这个事情,其实听起来很简单,就是把串口的波特率提上去,硬件环境呢,就是用飞凌的TE2440-II(比较古老了,大家勿喷)操作系统是linux2.6.28,大家都知道,正常情况下,Linux下串口波特率最高到115200,因为我们特殊需要的原因,需要把波特率提高到至少460800,当然最理想的结果就是波特率达到921600,大的背景就是这个样子了。

然后先考究硬件,看看在硬件上到底能不能满足我们的要求,主控芯片S3C2440,在UART一章说在系统时钟下,波特率最高可达115200,然后注释中说如果Pclk达到60M,可以实现921600,我就按他说的,将主频提高,顺便将pclk提高到了60M,发现921600根本实现不了,230400波特率虽然能通,但是错误率很高,根本无法用,然后我又尝试着将Pclk提高到了70M,通过这种饮鸩止渴的方式,波特率可以提高到230400并且稳定传输,但是更高的波特率则无法实现,而Pclk不能无限提高,因为我们开发板还连接了触摸屏,在Pclk70M的情况下,触摸屏经常重启,说明这个方案不可行,所以就pass掉了,下面简单说一下我怎么更改的系统时钟Fclk,Hclk,Pclk。这三个时钟的关系以及计算方法我就不赘述了,我主要参考博客://blog.csdn.NET/dong_zhihong/article/details/8469269进行修改

1)首先找到bootloader中 INC文件夹下的Option.inc文件,打开以后,找到如下代码段,这段代码就是主频400M时对应的M,P和S值设置,需要更改主频的话更改其中相应的数值几个(后来我发现,其实这个地方不改也行,因为最终起作用的是第二步)

[ FCLK = 400000000

CLKDIV_VAL EQU5

;1:4:8

M_MDIV EQU

127 ;127

M_PDIV EQU

2 ;2

[ CPU_SEL = 32440001

M_SDIV EQU

1 ; 2440A

|

M_SDIV EQU

0 ; 2440X

]

]

2)找到u2440mon.c,然后在main()函数中找到如下代码,修改case2中的mpll_val = (92<<12)|(1<<4)|(1);这一行(为啥修改这一行?因为在这个switch代码有个j=2),其中三个数分别代表M,P,S。这才是决定主频的关键。

switch(j) {

case 0:

//240

key = 14;

mpll_val = (112<<12)|(4<<4)|(1);

break;

case 1:

//320

key = 14;

mpll_val = (72<<12)|(1<<4)|(1);

break;

case 2:

//400

key = 14;

mpll_val = (92<<12)|(1<<4)|(1);

break;

case 3:

//420!!!

key = 14;

mpll_val = (<<12)|(1<<4)|(1);

break;

default:

key = 14;

mpll_val = (92<<12)|(1<<4)|(1);

break;

}

3)然后再 2440lib.c文件中,找到 ChangeClockDivider()函数,这个函数是控制分频比的,代码如下,这两个一个控制h_div,一个控制p_div。其中case 18: hdivn=2; break;这一行控制H分频,具体怎么改可以参考手册。

switch(hdivn_val) {

case 11: hdivn=0; break;

case 12: hdivn=1; break;

case 13:

case 16: hdivn=3; break;

case 14:

case 18: hdivn=2; break;

}

switch(pdivn_val) {

case 11: pdivn=0; break;

case 12: pdivn=1; break;

}

只需以上三步,就可以更改系统主频以及分频比,得到自己想要的Fclk和Pclk。

然后再说说我把上一个方案否定了以后,再仔细阅读芯片手册,发现串口的时钟源可以有三种方式获得:pclk,fclk/n,exclk,而且手册上说用外部时钟的话,可以做到更高的波特率,但是这需要更改硬件,从指定那个引脚引入一个时钟,然后还要更改驱动程序,所以放弃了,所以只剩下一个路可以走,就是用fclk/n的方式作为串口的时钟源,因为fclk频率很高,所以时钟源提高了,就可以把波特率提上来。然后就开始看linux内核源代码,因为串口的驱动早就集成到了linux内核之中,然后我就跳进了一个大坑。

其实串口本身的驱动并不复杂,如果裸机开发的话我感觉不难(强调一下,这个串口的裸机开发我没有做过,请做过的人不要喷我),因为串口被封装到了linux系统中,并且是层层封装,最终被封装成了tty的形式,所以我就从tty的驱动看起,抽丝剥茧,从里面寻找蛛丝马迹,

首先发现了s3c2440.c这个文件,通过调试得知,初始化的时候调用了其中的s3c2440_serial_init()函数,刚开始以为在这个文件中就这个函数有用,其实后来才知道,这个文件中的s3c2440_serial_getsource()和s3c2440_serial_setsource()在驱动中多次被调用。

然后考虑到,在上位机设置波特率的时候,调用的是系统函数cfsetispeed(),后经调试得知,这个函数调用了Samsung.c这个文件中的s3c24xx_serial_set_termios()这个函数,所有与串口相关的配置都与这个函数有关,因此锁定了方向,只要从这个函数中找到与波特率以及时钟源相关的语句,更改成我想要的即可,而这个函数又调用了很多子函数,但真正与波特率及时钟源相关的函数就是如下几句

/*

* Ask the core to calculate the divisor for us.

*/

baud = uart_get_baud_rate(port, termios, old, 0, 115200*8);

if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)

quot = port->custom_divisor;

else

quot = s3c24xx_serial_getclk(port, &clksrc, &clk, baud);

/* check to see if we need to change clock source */

if (ourport->clksrc != clksrc || ourport->baudclk != clk) {

s3c24xx_serial_setsource(port, clksrc);

if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {

clk_disable(ourport->baudclk);

ourport->baudclk = NULL;

}

clk_enable(clk);

ourport->clksrc = clksrc;

ourport->baudclk = clk;

}

其中,uart_get_baud_rate()函数用于计算出上位机程序到设置的波特率的值,经我调试得知,上位机波特率从2400到921600都可以被准确的计算出来;所以这个函数跳过,然后看最后那个if语句,这个语句的作用是产看目前的时钟源是否与设置的时钟源相同,如果不相同,则按照设置的时钟源进行更改,这里面还涉及linux下的关于管理时钟的一个结构体clk结构体,参照博客://blog.chinaunix.Net/uid-26583794-id-3208153.html以及://wenku.baidu/view/13b4c686b9d528ea80c77904.html我找到了linux下的mach-smdk2440.c这个文件,这个文件中定义了串口所用的clk结构体,这也是linux系统启动时对串口的初始化配置结构体都在这,但是我更改过这个地方,让他初始化配置是首选fclk作为串口的时钟源,但是我发现这并没有效果,所以继续寻找中。

这样就剩下一个函数可以考虑了,s3c24xx_serial_getclk(),进入这个函数你会发现,这个函数是对串口时钟及波特率一个全面的配置,进入这个函数中,就有个结构体tmp_clksrc,这个结构体很关键,他的内容如下:

static struct s3c24xx_uart_clksrc tmp_clksrc = {

.name = "pclk",

.min_baud

= 0,

.max_baud

= 0,

.divisor

= 1,

};

从这个名字中就可以看出,它把串口的时钟源内定成为了pclk,这也是罪魁祸首,但是当我把name更改为fclk时,整个系统就无法启动了,包括前面说的更改mach-smdk2440.c中初始化配置,也是无法启动,后来在配置串口是做了一个判断,当波特率低于200000时,才有系统源配置不变,当波特率高于200000时,不在用tmp_clksrc这个结构体,而是用我自己定义的一个结构体,当然就是把name改成fclk,发现虽然只是能够更改 里面部分参数的时钟源,而正在的时钟源还是pclk,说明我的更改根本么有生效,由于这个linux调用太庞杂了,我就抱着试试看的态度,也是没有办法的办法,在配置完串口时钟的代码之后,添加了如下几行代码,直接更改S3C2440的寄存器,我知道这样做是很不“道德”的,而且很容易引起系统混乱,但是我只是这么试试,没想到还真的有用。

在 samsung.c文件中添加

if (baud >= 200000)

{

printk("baud >= 200000 @-------------samsung.c\n");

__raw_writel(0x1fc5,S3C24XX_VA_UART0 + S3C2410_UCON);

__raw_writel(0x0fc5,S3C24XX_VA_UART1 + S3C2410_UCON);

__raw_writel(0x8fc5,S3C24XX_VA_UART2 + S3C2410_UCON);

__raw_writel(32,S3C24XX_VA_UART0 + S3C2410_UCON+0x24);//保证控制台的波特率还是115200用于显示

__raw_writel(3,S3C24XX_VA_UART1 + S3C2410_UCON+0x24);//921600

//__raw_writel(3,S3C24XX_VA_UART1 + S3C2410_UCON+0x24);

}

上面这段代码经我多次试验得到的,因为一开始用的系统主时钟fclk为400M,这样算出来UBRDIV1分频应该为3,但是这样的话错误率比较高,还是导致无法传输,至此我终于明白手册上为什么说pclk在60M 可以实现921600了,因为用60M时钟计算的话,分频UBRDIV1为3.069,最接近整数3,所以在这个错误率下可以实现921600的波特率传输,所以我将系统时钟fclk设置为420M,其中MDIV=,PDIV=1,SDIV=1,而ucon0=0x1fc5,ucon1=0x0fc5,ucon2=0x8fc5,这样n=1+6=7,所以串口的时钟源为fclk/n=60M,可以得到精确的921600波特率,所以实现我刚开始的目标,其实要实现其他的波特率也可以,比如460800,计算后主时钟fclk(尽量算出的分频UBRDIV1最贴近整数),然后就可以实现了。

在这还有个小想法,提高串口波特率,还可以使用USB转串口,因为USB转串口可以实现921600,而linux中以及集成了USB转串口的驱动,只需要在调用串口的那个open函数中改为调用USB转串口的节点即可,当然,这个方案我没有试,因为我们就一个USB口,而且还被占用了,所以希望有需要的朋友可以试一下。

s3c2440是什么arm核

显然是S3C2440

下面我来说明一下理由:

1.学习必然不是为了一时,嵌入式是要涉及到很多方面的东西的,钱花了,当然有更长时间的学习支持当然要好一些。要跑系统就要大小通吃。

2.如今,不管是学生还是毕业了的,学习S3C2440的人远比STM32的多,若是学S3C2440不会了,还比较容易问人,若是STM32不会了,你问谁,不要相信售后技术支持,我就买了块,同学也有买的,当你买后要问一下如何学的时候,销售的就不怎么管你了,卖东西会说技术不够,只管销售,售后技术人员说他时间没有(必然他自己当然也在做项目之类的嘛)

3.你如果是学生的话,你到你学校的图书馆区看看就知道了,关于嵌入式的基本上书籍都是S3C2440的,要学也好有一本像样的辅导书一些,还有相关网上支持得多一些。

以上就是我个人的意见,最后还是要看你自己了,比如价位,以后的方向,自己的基础了。

关于arm9 s3c2440驱动7寸群创液晶的时序问题

手持设备和通用嵌入式应用的集成系统

16/32-位RISC架构和以ARM920T CPU为核心的强大的指令集

增强ARM架构的MMU支持WinCE,EPOC32和Linux

指令缓存,数据缓存,写缓冲和物理地址T RAM性能,以减少主内存带宽和延迟的效

s3c2440为什么要进入中断模式设置

首先你必须明白你手头的TFT屏的接口类型,如果是TTL信号的可以用s3c2440直接驱动;

如果是LVDS的就必须有LVDS转TTL芯片转换。

其次,你要知道你的TFT屏的gamma电路,背光驱动电路是否都有了,哪个没有就得补上,

不然的话,你是永远驱动不了的。

最后才轮到时序,当然说的是TTL信号的,这个很简单,只要把以下参数配置了就行了

#define LCD_WIDTH 800

#define LCD_HEIGHT 480

#define LCD_PIXCLOCK 1

#define LCD_RIGHT_MARGIN 15 //Horizontal back porch=86,

#define LCD_LEFT_MARGIN 100 //Horizontal front porch=1,

#define LCD_HSYNC_LEN 10 //Hsync Valid width=128

#define LCD_UPPER_MARGIN 5 //Vertical vack proch=31,

#define LCD_LOWER_MARGIN 21 //Vertical front porch=1,

#define LCD_VSYNC_LEN 1 //Vsync Valid width=2,

ARM 处理器 三星公司 ARM9 系列的详细配

SRCPND寄存器每一位的置位与INTMSK寄存器中的屏蔽位是否置1无关,是由中断源自动置位的,但要清除该位,即将该位清零,是需要手动操作的。

这个寄存器清零的方法就是向指定位写1,芯片就是这么设置的,你再要问只能去三星问芯片开发者为什么要这么设计了,这样的寄存器你也无法手动置位触发中断啊,本来就用不到这样的功能,你再深究下去就是钻牛角尖了

产品简介 ?0?3

S3C2440A开发板-三星ARM9开发板-龙人嵌入式系统开发

S3C2440A开发板ARM9 ARM9开发板嵌入式系统嵌入式开发

主要特点:S3C2440A开发板是深圳龙人计算机嵌入式系统开发有限公司开发设计制造的,S3C2440A是工业级工作温度范围,适合于苛刻的场合。S3C2440A主频高达400MHz,最高可达533MHz,低功耗,高性能,开发板适合于PDA,便携媒体播放器,卫星导航仪等多媒体终端开发评估。同时可以作为嵌入式操作系统和嵌入式硬件设计教学。目前市场大量产品用该芯片,价格便宜,货源充足。

S3C2440A是ARM9处理器,2440A开发板也就是三星ARM9系列开发板

2440A开发板硬件介绍:

1:处理器:S3C2440A-40 400MHz主频,ARM 920T内核

2:ROM:16Mbit NOR FLASH,16bit宽度

3:电子盘:512M bit NAND FLASH,8bit宽度

4:RAM:512M bit SDRAM,133MHz,32bit宽度(两片组成)

5:电源:7-24V宽电压输入,LT1765高效DC/DC降压,标配12V电源

6:网络:10Mbps低功耗嵌入式专用以太网网络芯片CS8900A-CQ3,接口为标准RJ45插座,集成网络变压器,安全可靠

7:串口,3路串口,两路带握手信号,可接调制解调器或者GPRS。COM3位3线制和IRDA共用CPU的UART2信号,COM3和IRDA只能同时使用其中一个

8:IRDA:预留RPM851A红外收发模组,用户可以自行安装,标准配置没有焊接。和COM3共用

9:液晶接口:支持CSTN,TFT等多种LCD

10:摄像头接口:预留30pin插座,方便用户连接数字摄像头

11:音频接口:立体声音频输入输出接口,外加一路麦克风输入

12:USB HOST:2个USB HOST接口,USB FULL SPEED。可外接HUB扩展。

13:USB DEVICE:1路USB DEVICE接口,USB FULL SPEED

14:SD卡接口:支持SD/MMC和SDIO设备

15:总线扩展:通过96针高可靠欧式插座提供外部扩展,32*3排列,集成总线和其他可能用到的信号。外部总线通过高速双向缓冲器隔离,保证系统的安全。

16:PCMCIA:预留PCMCIA芯片和PCMCIA插座(在板子背面),标准配置没有焊接。

17:JT接口:ARM标准20芯JT接口

18:RTC时钟:S3C2440A内部集成,外部提供RTC电池,插座安装,可更换

19:双时钟设计:用有源晶振+无源晶振两种模式设计,用户可选用其中一种或者同时使用两个时钟,方便评估。

20:电路不用任何加密措施,如CPLD等器件,确保用户能100%用于项目。

嵌入式系统开发商和ARM开发工具提供商龙人计算机提供嵌入式系统全套解决方案包括ARM解决方案、ARM开发板(ARM9开发板和ARM7开发板)、ARM工控模块、ARM教学系统、ARM教学平台、ARM实验室建设、ARM仿真器等。

商  标 龙人计算机

产品型号 S3C2440A

产品价格 10

公司名称 北京龙人计算机系统工程有限公司嵌入式系统开发部