SDA SCL
每个设备有仅有的地址 之间是主\从联系
开端信号 完毕信号 呼应信号(接收方发送)
在本开发板中运用的RTC芯片M41t11和处理器用IIC总线方法衔接
@******************************************************************************
@ File: head.S
@ 功用: 设置SDRAM,将程序仿制到SDRAM,然后跳到SDRAM持续履行
@******************************************************************************
.extern main
.text
.global _start
_start:
@******************************************************************************
@ 中止向量,本程序中,除Reset和HandleIRQ外,其它反常都没有运用
@******************************************************************************
b Reset
@ 0x04: 未定义指令间断形式的向量地址
HandleUndef:
b HandleUndef
@ 0x08: 管理形式的向量地址,经过SWI指令进入此形式
HandleSWI:
b HandleSWI
@ 0x0c: 指令预取中止导致的反常的向量地址
HandlePrefetchAbort:
b HandlePrefetchAbort
@ 0x10: 数据拜访中止导致的反常的向量地址
HandleDataAbort:
b HandleDataAbort
@ 0x14: 保存
HandleNotUsed:
b HandleNotUsed
@ 0x18: 中止形式的向量地址
b HandleIRQ
@ 0x1c: 快中止形式的向量地址
HandleFIQ:
b HandleFIQ
Reset:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需求设好栈
bl disable_watch_dog @ 封闭WATCHDOG,不然CPU会不断重启
bl clock_init @ 设置MPLL,改动FCLK、HCLK、PCLK
bl memsetup @ 设置存储控制器以运用SDRAM
bl nand_init @ 初始化NAND Flash
@ 仿制代码到SDRAM中
ldr r0, =0x30000000 @ 1. 方针地址 = 0x30000000,这是SDRAM的开端地址
mov r1, #4096 @ 2. 源地址 = 4096,运转地址在SDRAM中的代码保存在NAND Flash 4096地址开端处
mov r2, #16*1024 @ 3. 仿制长度 = 16K,关于本试验,这是足够了
bl CopyCode2SDRAM @ 调用C函数CopyCode2SDRAM
bl clean_bss @ 铲除bss段,未初始化或初值为0的大局/静态变量保存在bss段
msr cpsr_c, #0xd2 @ 进入中止形式
ldr sp, =0x31000000 @ 设置中止形式栈指针
msr cpsr_c, #0xdf @ 进入体系形式
ldr sp, =0x34000000 @ 设置体系形式栈指针,
ldr lr, =ret_initirq @ 设置回来地址
ldr pc, =init_irq @ 调用中止初始化函数
ret_initirq:
msr cpsr_c, #0x5f @ 设置I-bit=0,开IRQ中止
ldr lr, =halt_loop @ 设置回来地址
ldr pc, =main @ 调用main函数
halt_loop:
b halt_loop
HandleIRQ:
sub lr, lr, #4 @ 核算回来地址
stmdb sp!, { r0-r12,lr } @ 保存运用到的寄存器
@ 留意,此刻的sp是中止形式的sp
@ 初始值是上面设置的4096
ldr lr, =int_return @ 设置调用IRQ_Handle函数后的回来地址
ldr pc, =IRQ_Handle @ 调用中止分发函数,在interrupt.c中
int_return:
ldmia sp!, { r0-r12,pc }^ @ 中止回来, ^表明将spsr的值仿制到cpsr
#include
#include “serial.h”
#include “i2c.h”
#include “m41t11.h”
int main()
{
char c;
char str[200];
int i;
struct rtc_time dt;
uart0_init(); // 波特率115200,8N1(8个数据位,无校验位,1个中止位)
i2c_init();
while (1)
{
printf(“rn##### RTC Menu #####rn”);
printf(“Data format: year.month.day w hour:min:sec, w is week daynr”);
printf(“eg: 2007.08.30 4 01:16:57nr”);
printf(“[S] Set the RTCnr”);
printf(“[R] Read the RTCnr”);
printf(“Enter your selection: “);
c = getc();
printf(“%cnr”, c);
switch (c)
{
case s:
case S:
{
printf(“Enter date&time: “);
i = 0;
do
{
c = getc();
str[i++] = c;
putc(c);
} while(c != n && c != r);
str[i] = ;
while(–i >= 0)
{
if (str[i] < 0 || str[i] > 9)
str[i] = ;
}
sscanf(str, “%d %d %d %d %d %d %d”,
&dt.tm_year, &dt.tm_mon, &dt.tm_mday,
&dt.tm_wday,
&dt.tm_hour, &dt.tm_min, &dt.tm_sec);
printf(“nr*** Date set as: %04d.%02d.%02d %d %02d:%02d:%02d ***nr”,
dt.tm_year, dt.tm_mon, dt.tm_mday,
dt.tm_wday,
dt.tm_hour, dt.tm_min, dt.tm_sec);
if (m41t11_set_datetime(&dt))
printf(“Set RTC failed!nr”);
break;
}
case r:
case R:
{
if (m41t11_get_datetime(&dt))
printf(“Read RTC failed!nr”);
printf(“nr*** Now is: %04d.%02d.%02d %d %02d:%02d:%02d ***nr”,
dt.tm_year, dt.tm_mon, dt.tm_mday,
dt.tm_wday,
dt.tm_hour, dt.tm_min, dt.tm_sec);
break;
}
}
}