历史上的今天

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

2019年09月16日 | 中断-timer0

发布者:legend9 来源: eefocus关键字:中断  timer0  S3C2410 手机看文章 扫描二维码
随时随地手机看文章

使用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;

}

 

}


关键字:中断  timer0  S3C2410 引用地址:中断-timer0

上一篇:存储-SDRAM
下一篇:S3C2440开发板上BMP图片的显示之三

推荐阅读

“6.18”电商购物节刚刚过去,淘宝造物节又来了。每一个电商商家在做生意的时候都少不了和订单进行接触的。但是在运营的过程中,有很多卖家遇到了管理上的难题! 对于一些发展迅猛的电商企业来说,多平台多店铺能否统一管理、订单能否被及时处理、快递订单能否智能匹配……都需要一个强大的ERP在后面做支撑。 那么问题来了,市场上的ERP商家数不胜数,在...
日前,汽车零部件供应商日本电装与通信公司黑莓展开合作,将全球首款采用黑莓QNX平台的综合性人机交互数字座舱配置到斯巴鲁新车中。自2019年秋季开始,这一技术将被应用到在美国发售的斯巴鲁力狮和傲虎这两款车型中。据悉,这一数字座舱方案采用了黑莓的QNX虚拟机管理技术,能够实现对车载人机界面系统的综合控制。在2018年CES展会上,黑莓曾经首次对外展...
  测温测量和控制在当今社会生活中扮演着至关重要的角色,国际国内市场现有的多种测温技术涵盖了安检、市 场、生活、消防、科研等诸多领域。温度的测量和控制在工 业生产中有广泛的应用,尤其在石油、化工、电力、冶金等 重要工业领域中,对温度的测量和监控是非常重要的一个环节。在传统的温度测量系统中,温度采集器通常采用模拟温 度传感器,模拟...
9月15日,国新办举行8月份国民经济运行情况发布会。根据国家统计局数据,8月份,全国规模以上工业增加值同比增长5.3%,两年平均增长5.4%,比7月份回落0.2个百分点。尽管受疫情、汛情影响,8月份部分经济指标增速有所回落,但今年以来,汽车出口却快速增长。据统计,前8个月,我国汽车(包括底盘)出口1377亿元,同比增长111.1%。在全球汽车行业缺芯的背景...

史海拾趣

问答坊 | AI 解惑

求助:冠林梯口机原程序

冠林梯口机原程序!!!!…

查看全部问答∨

呵呵,最后一个器件搞定了

BL8505-33 1 SM ,呵呵,最后一个器件终于联系上了,听有的公司说国外都没货了呢,:(\" 峰回路转,试着打了一个网上留的电话,竟然可以免费提供,虽然钱不多,但解决了一个大问题呢,这里感谢下华芯邦的天涯…

查看全部问答∨

IAR Fof ARM 汇编

  SECTION UND_STACK:DATA:NOROOT(3)         SECTION ABT_STACK:DATA:NOROOT(3)         SECTION IRQ_STACK:DATA:NOROOT(3)         SE ...…

查看全部问答∨

vxworks NAT的问题 .只要回复都给分...分不够再加...

版上的各位大侠,有人在vxworks5.4下做过NAT的东西没,能给小弟一点提示吗,现在这个东西已径把我折磨的半死了。 也可以把资料发到我的email中。zhouxiongjun@hotmail.com 谢谢啦。 …

查看全部问答∨

PB能编译出在PC上运行的wince吗?

本来是做arm上面的wince软件开发,但是每次下载到板子上太麻烦了,那些与硬件无关的例如界面开发可以在PC上有仿真环境吗?…

查看全部问答∨

CAN芯片的中断标志位难道可以自己复位吗?

MCP2515是CAN总线芯片,收到报文时,如果CANINTE接收位使能,则CANINTF接收位置1并产生中断。 理论上MCU检测到中断后,必须通过SPI对CANINTF接收位清零。可是在中断时,MCU读出CANINTF的 状态有时接收位却是0,有时是1。这是我非常迷惑的地方:MC ...…

查看全部问答∨

LPC2114 技术研究

  LPC2114 是NXP的ARM7内核芯片, 功能比较多.我从来没有用过该芯片, 由于一个朋友送了我LPC2114的硬件, 想在上面熟悉熟悉LPC2114的功能.由于对该芯片比较陌生, 在网上转了一圈,发现关于该芯片的使用心得或笔记很少,看来该芯片不常用. 到周立功 ...…

查看全部问答∨

初学者的一个问题,请高手指教

我用的仿真设备是(msp-fetp4301f1.3)不知道是不是这样看的,使用时是不是直接把它接到计算机的并口就可以开始仿真了?cpu是msp430f149的,如果我要写一个AD采样程序,要不要外加电源?可不可以直接使用例子??…

查看全部问答∨

请教MSP430F149的谐波检测FFT的C语言程序

最近在用MSP430F149做一个谐波检测的功能,听说FFT能够实现,但是无从下手,希望高手们能够指教,或给出FFT程序,或给出学习的方法均可,谢谢大家能帮忙了~~~…

查看全部问答∨

LPC1114是否可以做片内数据掉电存储?

看datasheet上好像没有片内eeprom,那是否可以做数据存储呢?还是要用其他方法实现呢?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved