历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2019年09月16日 | UART-中断模式

2019-09-16 来源:eefocus

init.c


/*

 * init.c: 进行一些初始化

 */ 

 

#include "s3c24xx.h"

 

void disable_watch_dog(void);

void clock_init(void);

void memsetup(void);

void copy_steppingstone_to_sdram(void);

 

/*

 * 关闭WATCHDOG,否则CPU会不断重启

 */

void disable_watch_dog(void)

{

    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}

 

#define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))

#define S3C2440_MPLL_200MHZ     ((0x5c<<12)|(0x01<<4)|(0x02))

/*

 * 对于MPLLCON寄存器,[19:12]为MDIV,[9:4]为PDIV,[1:0]为SDIV

 * 有如下计算公式:

 *  S3C2410: MPLL(FCLK) = (m * Fin)/(p * 2^s)

 *  S3C2440: MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

 *  其中: m = MDIV + 8, p = PDIV + 2, s = SDIV

 * 对于本开发板,Fin = 12MHz

 * 设置CLKDIVN,令分频比为:FCLK:HCLK:PCLK=1:2:4,

 * FCLK=200MHz,HCLK=100MHz,PCLK=50MHz

 */

void clock_init(void)

{

    // LOCKTIME = 0x00ffffff;   // 使用默认值即可

    CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

 

    /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */

__asm__(

    "mrc    p15, 0, r1, c1, c0, 0n"        /* 读出控制寄存器 */ 

    "orr    r1, r1, #0xc0000000n"          /* 设置为“asynchronous bus mode” */

    "mcr    p15, 0, r1, c1, c0, 0n"        /* 写入控制寄存器 */

    );

 

    /* 判断是S3C2410还是S3C2440 */

    if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))

    {

        MPLLCON = S3C2410_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

    }

    else

    {

        MPLLCON = S3C2440_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */

    }       

}

 

/*

 * 设置存储控制器以使用SDRAM

 */

void memsetup(void)

{

    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

 

    /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值

     * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到

     * SDRAM之前就可以在steppingstone中运行

     */

    /* 存储控制器13个寄存器的值 */

    p[0] = 0x22011110;     //BWSCON

    p[1] = 0x00000700;     //BANKCON0

    p[2] = 0x00000700;     //BANKCON1

    p[3] = 0x00000700;     //BANKCON2

    p[4] = 0x00000700;     //BANKCON3  

    p[5] = 0x00000700;     //BANKCON4

    p[6] = 0x00000700;     //BANKCON5

    p[7] = 0x00018005;     //BANKCON6

    p[8] = 0x00018005;     //BANKCON7

    

                                            /* REFRESH,

                                             * HCLK=12MHz:  0x008C07A3,

                                             * HCLK=100MHz: 0x008C04F4

                                             */ 

    p[9]  = 0x008C04F4;

    p[10] = 0x000000B1;     //BANKSIZE

    p[11] = 0x00000030;     //MRSRB6

    p[12] = 0x00000030;     //MRSRB7

}

 

void copy_steppingstone_to_sdram(void)

{

    unsigned int *pdwSrc  = (unsigned int *)0;

    unsigned int *pdwDest = (unsigned int *)0x30000000;

    

    while (pdwSrc < (unsigned int *)4096)

    {

        *pdwDest = *pdwSrc;

        pdwDest++;

        pdwSrc++;

    }

}

void init_irq(void)

{        

    // 定时器0中断使能

    INTSUBMSK &= (~(1<<0));

    INTMSK   &= (~(1<<28));

}



serial.c


#include "s3c24xx.h"

#include "serial.h"

unsigned char rxBuf[128];

unsigned char rxCnt=0;

#define TXD0READY   (1<<2)

#define RXD0READY   (1)

 

 

#define PCLK            50000000    // init.c中的clock_init函数设置PCLK为50MHz

#define UART_CLK        PCLK        //  UART0的时钟源设为PCLK

#define UART_BAUD_RATE  115200      // 波特率

#define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)

 

 

/*

 * 初始化UART0

 * 115200,8N1,无流控

 */

void uart0_init(void)

{

    GPHCON  |= 0xa0;    // GPH2,GPH3用作TXD0,RXD0

    GPHUP   = 0x0c;     // GPH2,GPH3禁止内部上拉

 

 

    ULCON0  = 0x03;     // 8N1(8个数据位,无较验,1个停止位)

    UCON0   = 0x05;     // 查询方式,UART时钟源为PCLK

    UFCON0  = 0x00;     // 不使用FIFO

    UMCON0  = 0x00;     // 不使用流控

    UBRDIV0 = UART_BRD; // 波特率为115200

}

void Uart0_Handle(void)

{

unsigned char c;

if(INTOFFSET==28)

{

if((UTRSTAT0 & RXD0READY))

{

c =URXH0;

while (!(UTRSTAT0 & TXD0READY));

UTXH0 = c;

}

}

SUBSRCPND |= (1<<0);

INTPND |= (1<<28);

SRCPND |= (1<<28);

}

 

 

/*

 * 发送一个字符

 */

void putc(unsigned char c)

{

/*

unsigned char cnt=0;

if(rxCnt>=6)

{

while(cnt {

while (!(UTRSTAT0 & TXD0READY));

UTXH0 = rxBuf[cnt++];

//cnt++;

}

rxCnt = 0;

}

*/

    /* 等待,直到发送缓冲区中的数据已经全部发送出去 */

    

    

    /* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */

    

}

 

 

/*

 * 接收字符

 */

unsigned char getc(void)

{

    /* 等待,直到接收缓冲区中的有数据 */

    while (!(UTRSTAT0 & RXD0READY));

    

    /* 直接读取URXH0寄存器,即可获得接收到的数据 */

    return URXH0;

}

 

 

/*

 * 判断一个字符是否数字

 */

int isDigit(unsigned char c)

{

    if (c >= '0' && c <= '9')

        return 1;

    else

        return 0;       

}

 

 

/*

 * 判断一个字符是否英文字母

 */

int isLetter(unsigned char c)

{

    if (c >= 'a' && c <= 'z')

        return 1;

    else if (c >= 'A' && c <= 'Z')

        return 1;       

    else

        return 0;

}

推荐阅读

史海拾趣

泰科天润(GPT)公司的发展小趣事

机顶盒,全称数字视频变换盒,是连接电视与外部信号源的重要设备,其专业性与科普性均不容忽视。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,它们承担着将各种信号源转换为电视可识别并播放的格式的重要任务。

机顶盒的核心功能在于接收、解码和显示。它能接收来自有线电缆、卫星天线、宽带网络及地面广播等多种传输介质的数字电视信号,并通过内置的解调器和解码器,将这些信号转换为电视能够播放的视频和音频流。这一过程中,机顶盒展现了其强大的技术实力,确保用户能够享受到高质量的视听体验。

随着技术的发展,机顶盒不断进化。从最初的模拟频道增补器、解码器,到如今支持高清、4K乃至8K超高清播放的智能网络机顶盒,机顶盒的每一次升级都带来了更加丰富的内容选择和更加便捷的使用体验。同时,网络机顶盒的出现更是将电视与互联网紧密相连,使得用户能够通过电视屏幕浏览网页、观看在线视频、下载应用程序、享受交互式娱乐等多元化服务。

此外,机顶盒还具备强大的扩展性和可定制性。通过搭载不同的软件和硬件设备,机顶盒可以满足不同用户的个性化需求,如家庭影院功能、社交媒体互动、语音控制等。这些功能的加入不仅提升了机顶盒的实用性,也使其成为了现代家庭娱乐的重要组成部分。

综上所述,机顶盒作为连接电视与外部世界的桥梁,其专业性与科普性在不断提升中。随着技术的不断进步和市场的不断扩大,机顶盒将继续为用户带来更加优质、便捷、智能的视听体验。

Eastron Corp公司的发展小趣事

Eastron Corp一直重视人才的培养和引进。公司建立了完善的人才培养和激励机制,鼓励员工不断学习和创新。同时,Eastron还积极引进国内外优秀人才,为公司的发展注入新的活力。正是凭借一支高素质、专业化的团队,Eastron在电子行业中不断取得新的突破。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

为了进一步提升公司的竞争力和市场份额,Elite Enterprises积极寻求与行业内外的合作伙伴建立战略合作关系。公司与多家知名企业签订了长期合作协议,共同开发新产品、拓展新市场。此外,公司还与一些高校和研究机构建立了产学研合作关系,共同推动LED技术的创新和应用。

Conflux公司的发展小趣事

作为一家具有社会责任感的企业,Conflux始终关注社会公益事业。公司积极参与扶贫、教育等公益活动,为社会做出积极贡献。同时,Conflux还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也赢得了社会各界的广泛赞誉。

以上五个故事是虚构的,但反映了一个科技公司可能经历的发展阶段和策略选择。在现实中,一个公司的成长和发展往往涉及更多复杂的因素和决策过程。希望这些故事能够为您提供一些启发和参考。

ENPIRION公司的发展小趣事

在经历了几年的快速发展后,ENPIRION公司被Altera公司收购。这一收购标志着ENPIRION公司进入了一个新的发展阶段。在Altera公司的支持下,ENPIRION公司得以继续扩大其研发和生产能力,推出更多创新的产品和服务。同时,随着人工智能、物联网和大数据技术的不断发展,ENPIRION公司也积极探索新的应用领域和市场机会,为其未来发展奠定了坚实的基础。

以上五个故事概述了ENPIRION公司在电子行业中的发展历程和关键里程碑。通过这些故事,我们可以看到ENPIRION公司凭借技术创新、市场扩展和合作伙伴关系等关键因素取得了显著的成功。

洲光源(Chau Light)公司的发展小趣事

在洲光源公司的发展历程中,品质一直是其核心竞争力之一。公司始终坚持严格的质量控制标准,从原材料采购到产品生产、检测的每一个环节都严格把关。同时,洲光源还注重品牌塑造和市场推广,通过参加各种行业展会、举办技术交流会等方式,不断提升品牌知名度和影响力。这些努力使得洲光源的红外LED产品逐渐在市场上脱颖而出,成为众多客户的首选品牌。

问答坊 | AI 解惑

万用表的使用方法

万用表万用表具有用途多,量程广,使用方便等优点,是电子测量中最常用的工具。它可以用来测量电阻,交直流电压和直流电压。有的万用表还可以测量晶体管的主要参数及电容器的电容量等。掌握万用表的使用方是电子技术的一项基本技能。   常见的多 ...…

查看全部问答>

请问在wince里怎样用wifi发送特定数据

请问在wince里怎样用wifi发送特定数据 有人说就是socket编程,我没想明白,难道系统会自动调用wifi? 还请各位前辈指点迷津!…

查看全部问答>

学习AD0809,所以做一个数字电压表!

想学习一下AD,打算仿真做一个数字电压表,测量0~5V输出0~255,通过数码管显示,AD用的0809,模拟输入采用一个1K滑动变阻器连接到IN0(不知道这种做法是否可行?)现在的问题是,改变滑动变阻器的值,数码管的值有变化,但是并不是有规律地增大或 ...…

查看全部问答>

钱库终端机的界面开发?

目前在广州地铁等安放的钱库终端,里面的界面是用什么来开发的呢?感觉操作挺好听美观的。 是网页?还是Application的胖客户端,还是flash?…

查看全部问答>

关于硬盘无刷电机的驱动

小弟在研究硬盘电机的驱动,我曾试过用小功率管9013,8050,8550等等来搭成达林顿管子,但是驱动电机的时候发热严重,而且明显有气无力...虽然能转...在网上找了很久,想用场效管IRF540N来驱动,但是不知道电路如何搭建...求各位高手,走过路过的能 ...…

查看全部问答>

如何使用 CCS 建一个 M3 的工程

如何使用 CCS 建一个 M3 的工程,一直在用 MDK,最近不得不熟悉 CCS ,不知道 CCS 要怎么建工程呢? 找到一个 PDF ,按照里边的步骤还是能编译,而且很慢,这样的工具怎么用呢? [ 本帖最后由 Study_Stellaris 于 2011-12-5 16:00 编辑 ]…

查看全部问答>

针对beaglebone 扩展板,进行Linux驱动的调试!

好久没有发帖子了!今天来分享一下针对beaglebone 扩展板,进行Linux驱动的调试吧! 第二次修正beaglebone板子的外围电路还是比较顺利的! 具体编译内核的过程就不在介绍了!论坛里有很多人写了这方面的教程,Ti官方的文档也提供了较为全面的编译 ...…

查看全部问答>

J_smiason教你走进quartus,全程设计FPGA

都到这个点了,真的好瞌睡啊,希望这个文档能对初学的人带来帮助 我也是磕磕绊绊好几周才弄懂了整个开发的流程,希望初学的人来看 看我这篇文档,在开发中少走弯路,不走弯路 我是西安电子科技大学测控技术与仪器专业的学生,欢迎交流,共同进步 ...…

查看全部问答>

晒设计方案+MDK5.0下新建STM32F429i工程步步入门

晒设计方案+MDK5.0下新建STM32F429i工程步步入门 环境说明:1 Keil uVision52 STM32F429I-Discovery_FW_V1.0.1 一 工作目录路径1 在STM32F429I-Discovery_FW_V1.0.1目录下新建自己的总工程文件夹”My_Projects”. 2 为第一个工程试验新建文件夹 ...…

查看全部问答>

Altium+Designer+原理图和PCB多通道设计方法介绍

本帖最后由 qq849682862 于 2014-9-10 22:19 编辑 设计原理图和PCB的过程中,你是否遇到过多幅一模一样的电路,但是不得不重复设 计?原理图显得繁复,可读性差。而特别是在设计PCB,不得不重复布局,重复布线,不仅 枯燥乏味而且也容易出错、 ...…

查看全部问答>