历史上的今天
今天是:2024年10月14日(星期一)
2018年10月14日 | Tiny4412中断控制器(GIC)之外部中断
2018-10-14 来源:eefocus
#include "regs.h"
void enable_mmu(unsigned long ttb);
void init_ttb(unsigned long *ttb_base);
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);
void memset(char *buf, char ch, int size);
void memcpy(char *dst, char *src, int size);
void do_irq(unsigned long regs[]);
void (*printf)(char *, ...) = 0x43e11434;
void main(void)
{
unsigned long vector_base = 0xffff0000;
unsigned long tt_base = 0x73000000;
unsigned long *pdo_irq = 0x75000000;
extern unsigned long vectors_start, vectors_end;
memset(tt_base, 0x00, 16 * 1024);
mmap(tt_base, vector_base, 0x70000000);
enable_mmu(tt_base);
memcpy(vector_base, vectors_start, 0x100);
*pdo_irq = do_irq;
//让cpu开中断,cpu可以接收中断,要关闭cpu的中断用cpsid
//一条指令就可以完成对特殊功能寄存器的写操作,以前代码:
//mrs r0,cpsr
//bic r0,r0,#0x80 //清掉最高位
//msr cpsr,r0
__asm__ __volatile__ (
"cpsie i\n"
);
//-------------------------------------------------------------------------
// 使能GIC中断
ICCICR_CPU0 = 1;
ICCPMR_CPU0 = 0xff; // Priority Unmask All Interrupt
//------------ Eint26 for K1 irqID is 64-----------------
ICDDCR = 1;
// 64号中断优先级,the Zero is Highest priority
// 该寄存器中每个中断号占8位,64号中断就在ICDIPTR16寄存器当中
ICDIPR16_CPU0 = ~(0xff << 0);
// 64号中断给哪个cpu发,该寄存器中每个中断号占8位,64号中断就在ICDIPTR16寄存器当中
// 给cpu0发在ICDIPTR16_CPU0寄存器里面要写上,for CPU0, refer PG815
// 如果给cpu1、cpu3两个发既要在ICDIPTR16_CPU0上写上也要在ICDIPTR16_CPU3上写入
ICDIPTR16_CPU0 = (1 << 0);
// enable interrupt 0,每个中断号占一位,64号中断在ICDISER2当中
ICDISER2_CPU0 = (1 << 0);
//-------------------------------------------------------------------------
//使能外部中断控制器,设置中断引脚;内部中断不用这些设置(timer,watchdog中断等)
GPX3CON &= ~(0x7 << 8);
GPX3CON |= (0xf << 8); //Configure as Exint43_2 --- EINT26
EXT_INT43CON &= ~(0x7 << 8);
EXT_INT43CON &= ~(0x3 << 8); //设置触发边沿:rising edge
EXT_INT43_MASK &= ~(0x1 << 2); //enable ExtINT43_2 --- EINT26 for K1
}
void do_irq(unsigned long regs[])
{
if (EXT_INT43_PEND & (1 << 2)) { //产看是不是发生中断
printf("ExtInt43_2 \n");
EXT_INT43_PEND |= (1 << 2); //清除中断
}
}
void enable_mmu(unsigned long ttb)
{
unsigned long c1_flags;
init_ttb(ttb);
c1_flags = 1 | (1 << 3) | ( 1 << 11) | ( 1 << 13) | (1 << 28);
__asm__ __volatile__ (
"mvn r0, #0 \n"
"mcr p15, 0, r0, c3, c0, 0\n"
"mcr p15, 0, %1, c2, c0, 0\n" //configure ttb
"mrc p15, 0, r0, c1, c0, 0\n"
"orr %0, r0, %0\n"
"mcr p15, 0, %0, c1, c0, 0\n" //enable mmu
:
: "r" (c1_flags), "r" (ttb)
: "r0"
);
}
void init_ttb(unsigned long *ttb_base)
{
unsigned long va, pa;
for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others
pa = va;
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR
pa = va;
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM
pa = va;
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
}
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)
{
ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;
}
void memset(char *buf, char ch, int size)
{
int i;
for (i = 0; i < size; i ++)
buf[i] = ch;
}
void memcpy(char *dst, char *src, int size)
{
int i;
for (i = 0; i < size; i ++)
dst[i] = src[i];
}
__asm__ (
"vectors:\n"
"b reset\n"
"b und\n"
"b swi\n"
"b pre_abt\n"
"b dat_abt\n"
".word 0\n"
"b irq\n"
"b fiq\n"
"reset:\n"
"und:\n"
"mov sp, #0x74000000\n"
"stmfd sp!, {r0-r12, lr}\n"
"mov r0, sp\n"
"mov r3, #0x74000000\n"
"ldr r3, [r3]\n"
"blx r3\n"
"mov sp, #0x74000000\n"
"ldmea sp, {r0-r12, pc}^\n"
"swi:\n"
"pre_abt:\n"
"dat_abt:\n"
"fiq:\n"
"irq:\n"
"mov sp, #0x75000000\n"
"sub lr, lr, #4 \n"
"stmfd sp!, {r0-r12, lr}\n"
"mov r0, sp\n"
"mov r3, #0x75000000\n"
"ldr r3, [r3]\n"
"blx r3\n"
"mov sp, #0x75000000\n"
"ldmea sp, {r0-r12, pc}^\n"
"EOV:\n"
"vectors_start:\n"
".word vectors\n"
"vectors_end:\n"
".word EOV\n"
);
===================================================================
Makefile文件:
default:
arm-linux-gcc -c test.c -o test.o
arm-linux-ld -Ttext=0x70003000 test.o -o test
arm-linux-objcopy -O binary test test.bin
clean:
rm -f test.o test test.bin *~
===============================================================
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:17 编辑 一、设计任务 设计并制作一个浴室用智能排气扇,能够实现:自动检测热水的开停,自动检测煤气是否泄漏,排气扇故障自我检测等控制功能。 二、要求 1、基本要求 (1)能够对固定点的热水的开、 ...… 查看全部问答> |
|
如何能提高 DSP 底层驱动能力, 在使用TI OMAP5912 做开发MCBSP,SPI和GPIO等时感觉只能调试例程,可自己却些不出来? TI提供了支持包CSL,所以现在只会用CSL的API。 比如: 在写SPI驱动时,只要完成几个简单API调用,最后进行读写就OK了;可对驱动的思路却很欠缺,很多时候思维一片空白,恐怖啊? 交流吧,兄弟。… 查看全部问答> |
|
一直搞不清这个概念,只知道工业以太网实时性强一些。但具体应用时还是不知道如何构建所谓的工业以太网。我们常用的DM9000A是否属于工业以太网? STM32F107呢?是属于工业以太网芯片么?… 查看全部问答> |
|
发现执行nop指令会打断看门狗喂狗。 譬如,我的延时函数如下: void Delay(u16 x) { while (x--) { u8 Temp; for (Temp = 0; Temp < 100; Temp++) { &n ...… 查看全部问答> |




