历史上的今天
返回首页

历史上的今天

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

2019年09月16日 | 中断-timer0

2019-09-16 来源:eefocus

使用timer0中断,将LED灯闪烁


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);

void init_led(void);

void timer0_init(void);

void init_irq(void);

void delay(int n)

{

int i; 

for(i=0;i 

}

/*

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

 */

void disable_watch_dog(void)

{

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

    WTCON = 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)

 *  S3C2410: 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中运行

     ,steppingstone是在S3C2440 中,实际上是一块4k大小的SRAM

     */

    /* 存储控制器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++;

    }

}

 

#define GPFCON              (*(volatile unsigned long *)0x56000050)

 

#define GPF4_out (1<<(4*2))

#define GPF5_out (1<<(5*2))

#define GPF6_out (1<<(6*2))

 

 

/*

 * K1-K4对应GPG11、GPG3、GPF2、GPF3

 */

#define GPG11_eint      (2<<(11*2))     // K1,EINT19

#define GPG3_eint       (2<<(3*2))      // K2,EINT11

#define GPF3_eint       (2<<(3*2))      // K3,EINT3

#define GPF2_eint       (2<<(2*2))      // K4,EINT2

 

void init_led(void)

{

GPFCON = GPF4_out|GPF5_out|GPF6_out; // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出

}

 

/*

 * Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}

 * {prescaler value} = 0~255

 * {divider value} = 2, 4, 8, 16

 * 本实验的Timer0的时钟频率=100MHz/(99+1)/(16)=62500Hz

 * 设置Timer0 0.5秒钟触发一次中断:

 */

void timer0_init(void)

{

// 预分频器0 = 99    

TCFG0 &= ~0xFF;

TCFG0 |= 0x63;

// 选择16分频

TCFG1 &= ~0x0F;

TCFG1 |= 0x03;

// 0.5秒钟触发一次中断

TCNTB0 = 15625;//设定的计数 次数   递减

TCMPB0 = 0;//比较,减到这个数

// 手动更新

TCON &= ~(1<<1);

TCON |= 1<<1;

// 自动加载,清“手动更新”位,启动定时器0

//TCON &= ~0X03;

//TCON |= 0x01;

//TCON |= (3<<0);

TCON &= ~(1<<1);//清“手动更新”位

 

TCON |=(1<<3);//自动加载

 

TCON |=(1<<0);//启动定时器0

 

}

 

/*

 * 定时器0中断使能

 */ 

void init_irq(void)

{        

    // 定时器0中断使能,INTMSK

INTMSK &= ~ (1<<10);//中断屏蔽寄存器

 

}


Interrupt.c

#include "s3c24xx.h"

int flag=0;

void Timer0_Handle(void)

{

    /*

     * 每次中断令4个LED改变状态

     */

     unsigned long oft = INTOFFSET;//读取中断偏移量

 

 

//成功的

if(oft==10)//根据偏移量,判断是不是timer0中断

{

if(flag==0)

{

GPFDAT &= ~(1<<4|1<<5|1<<6);//亮灯

flag=1;

 

}

else

{

GPFDAT |= (1<<4|1<<5|1<<6);//关灯

flag=0;

}

 

SRCPND=SRCPND;

INTPND=INTPND;

//SRCPND &= ~(1<<10);

//INTPND &= ~(1<<10);

//SRCPND = 0;

//INTPND = 0;

}

 

}


推荐阅读

史海拾趣

AUSTIN公司的发展小趣事

随着汽车行业的竞争日益激烈,奥斯汀汽车开始寻求与其他公司的技术合作。1952年,奥斯汀与诺菲尔德车厂合并,组成了英国汽车公司(BMC),旗下包括莫里斯、沃尔斯利、莱利及MG等多个品牌。此外,奥斯汀汽车还积极与国际汽车公司展开合作,如与日产汽车在1952年签署了技术合作协议,共同开发新的车型。这些合作使得奥斯汀汽车的技术水平得到了显著提升,同时也推动了公司的国际化发展。

台湾远翔(Feeling Technology)公司的发展小趣事

随着全球对绿色低碳发展的重视,乔光电子积极响应国家号召,于2021年底开始筹划绿色工厂创建项目。公司引入了产品全生命周期理念,持续开展节能低碳、环境保护工作,建立了质量管理体系、职业健康安全管理体系、环境管理体系和能源管理体系等。通过实施一系列绿色低碳、节能技改措施,如废气粉尘收集与处理系统、造粒珠磨机电机变频改造等,乔光电子实现了万元产值能耗和碳排放强度的逐步改善,为企业的可持续发展奠定了坚实基础。

CMOS Sensor Inc公司的发展小趣事

在市场推广方面,CMOS Sensor Inc公司积极寻求与各行业合作伙伴的合作。通过与手机制造商、相机生产商等企业的合作,公司的CMOS图像传感器被广泛应用于各类电子产品中。这不仅提高了公司的市场份额,也进一步提升了CMOS Sensor Inc在业界的知名度。

Amperite Co公司的发展小趣事

CMOS Sensor Inc公司起源于硅谷,由一群热衷于光电图像采集技术的工程师创立。他们看到了光电图像采集技术在多个领域的巨大潜力,于是决定投身于这一行业。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借着对技术的执着和不懈努力,CMOS Sensor Inc公司逐渐在市场中站稳了脚跟。

AAC [American Accurate Components]公司的发展小趣事

进入21世纪,AAC公司继续加大市场拓展力度。2003年,AAC成功拓展了台湾市场,与明基、仁宝电脑和华宇电脑等知名企业建立了合作关系。为了满足这些客户对高品质耳机的需求,AAC开始生产制造耳机产品。这一创新举措不仅丰富了AAC的产品线,也进一步提升了其在电子消费产品市场的竞争力。

CLANDELL公司的发展小趣事

品质是CLANDELL公司一直以来的核心竞争力。公司建立了严格的质量管理体系,从原材料采购到产品生产的每一个环节都进行严格把控。同时,公司还加强了售后服务体系建设,确保客户在使用过程中能够得到及时、有效的支持。这些举措不仅提升了CLANDELL公司的产品品质,也赢得了客户的信任和好评。

问答坊 | AI 解惑

万用表的使用方法

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

查看全部问答>

protel99se教程

学习PROTEL99se必备…

查看全部问答>

基于AT89S52单片机的LED点阵显示屏控制系统的设计.PDF

基于AT89S52单片机的LED点阵显示屏控制系统的设计.PDF…

查看全部问答>

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

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

查看全部问答>

钱库终端机的界面开发?

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

查看全部问答>

STM8关于LIN总线的请教

大家好!      小弟现在遇到一个奇怪的问题。      硬件测试环境:板子是STM8S208,板子上有两个LIN接口,一个做主机,一个做从机,用一条串口线将两个口连接起来通信。       ...…

查看全部问答>

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

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

查看全部问答>

BeagleBone试用第一周 底板PCB--今天终于决定把板子拿去制了。到底如何不管他。

今天终于决定把板子拿去制了。到底如何不管他。 时间要紧。有错就改嘛。反正还是好同志。 希望大家支持,阿莫那里要求插孔都加大0.15MM 所以我的孔画的比较大。 有关硬件的资料: [ 本帖最后由 damiaa 于 2012-9-28 16:27 编辑 ...…

查看全部问答>

编译出错

Building configuration: project - Debug Updating build tree... Linking Error[e16]: Segment CSTACK (size: 0x32 align: 0x1) is too long for segment definition. At least 0x19 more bytes needed. The problem occurred while proces ...…

查看全部问答>

如何入手M3

各位大虾,小弟准备开始学习ARM,用TI的流明入手(9B96),板子已买好,求建议。(51和430的基础比较扎实)…

查看全部问答>