历史上的今天
今天是: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; } }
上一篇:存储-SDRAM
史海拾趣
|
想学习一下AD,打算仿真做一个数字电压表,测量0~5V输出0~255,通过数码管显示,AD用的0809,模拟输入采用一个1K滑动变阻器连接到IN0(不知道这种做法是否可行?)现在的问题是,改变滑动变阻器的值,数码管的值有变化,但是并不是有规律地增大或 ...… 查看全部问答> |
|
大家好! 小弟现在遇到一个奇怪的问题。 硬件测试环境:板子是STM8S208,板子上有两个LIN接口,一个做主机,一个做从机,用一条串口线将两个口连接起来通信。   ...… 查看全部问答> |
|
如何使用 CCS 建一个 M3 的工程,一直在用 MDK,最近不得不熟悉 CCS ,不知道 CCS 要怎么建工程呢? 找到一个 PDF ,按照里边的步骤还是能编译,而且很慢,这样的工具怎么用呢? [ 本帖最后由 Study_Stellaris 于 2011-12-5 16:00 编辑 ]… 查看全部问答> |
|
BeagleBone试用第一周 底板PCB--今天终于决定把板子拿去制了。到底如何不管他。 今天终于决定把板子拿去制了。到底如何不管他。 时间要紧。有错就改嘛。反正还是好同志。 希望大家支持,阿莫那里要求插孔都加大0.15MM 所以我的孔画的比较大。 有关硬件的资料: [ 本帖最后由 damiaa 于 2012-9-28 16:27 编辑 ...… 查看全部问答> |




