历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2018年10月14日 | Tiny4412中断控制器(GIC)之WDT中断

发布者:MindfulCreator 来源: eefocus关键字:Tiny4412  中断控制器  GIC  WDT中断 手机看文章 扫描二维码
随时随地手机看文章

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

    

    __asm__ __volatile__ (

        "cpsie i\n"

    );

 

    //--------------------------------------------------

    ICCICR_CPU0 = 1;

    ICCPMR_CPU0 =  0xff;  //Priority Unmask All Interrupt

    ICDDCR = 1;    

    

    //------ Watchdog IRQ ID is 75------------------

    ICDIPR18_CPU0 = ~(0xff << 24);// the Zero is Highest priority 

    ICDIPTR18_CPU0 = (1 << 24);     // for CPU0   , refer  PG815 

    ICDISER2_CPU0 =  (1 << 11);      // enable interrupt 0 --- SGI0 

    //---------- Configure WDT ----------------------

    // 200000000 / 128 / 256 = 6103,即频率6103

    WTCNT = 6103;    // 1秒钟减完

    WTDAT = 6103;    // WTCNT 1秒钟减完后把WTDAT值装入WTCNT中继续减

    WTCON = (1 << 2) | (3 << 3) | (1 << 5) | (0xff << 8) ; //启动看门狗

}

void do_irq(unsigned long regs[])

{

    printf("watchdog: wang wang wang ....\n");

    WTCLRINT = 0;

}

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   *~ 

===============================================================


关键字:Tiny4412  中断控制器  GIC  WDT中断 引用地址:Tiny4412中断控制器(GIC)之WDT中断

上一篇:Tiny4412中断控制器(GIC)之PWM
下一篇:Tiny4412中断控制器(GIC)之外部中断

推荐阅读

近年来,智能语音技术在医疗领域的应用越来越广泛,借助互联网大数据的不断发展,语音技术也从最初的语音识别逐步转向智能化的语音辅助。智能语音技术作为医生诊疗过程中的辅助助手,以其快速、准确、出错率少的特点,帮助医生处理了大量冗杂,繁琐的重复性劳动,大大减轻了医护工作者们的负担。随着技术的不断完善和创新,我们有理由相信,以语音为媒介的...
  近年来,工业信息化受到国家高度重视,在政策引导与有关各方的共同努力下,我国工业互联网发展取得良好开端。近日,中国计算机用户协会工业互联网与大数据应用理事长、华能集团首席信息师朱卫列在接受新华网记者专访时表示,我国工业互联网的发展应从“重平台”转向“重应用”。  以下为专访实录:  新华网:我国工业互联网当前整体发展情况如何?...
  近日江苏能源监管办发布了2020年9月江苏电力运行情况通报,数据显示今年1-9月份新增发电能力429.83万千瓦,其中储能12.6万千瓦。   一、全省发电情况   截止9月底,全省装机容量13622.78万千瓦,其中统调电厂11545.40万千瓦,非统调电厂2077.38万千瓦。   9月份,全省发电量434.04亿千瓦时,同比增长8.03%。1-9月累计发电量3719.52亿千瓦时,...
英国Pickering公司将在慕尼黑华南电子展上 展出新款信号开关和传感器仿真产品2021年10月13日,中国深圳。英国Pickering公司作为生产用于电子测试及验证领域的信号开关与仿真解决方案的领导厂商,将参加于十月28日至30日期间在深圳国际会展中心举办的Electronica South China慕尼黑华南电子展。届时,Pickering将重点展出他们的故障注入、功率开关、传感...

史海拾趣

问答坊 | AI 解惑

8种常用电容器的结构和特点

几种常用电容器的结构和特点简要介绍,供参考。 …

查看全部问答∨

绿色版“PDF文档”阅读器软件

这是一款纯绿色软件,不用安装,解压后直接双击"Foxit Reader.exe”就能运行了,而且运行一次后会自动建立关联,以后再双击PDF文档就行了,就能直接阅读PDF文档了。比Adobe Reader阅读器小多了,功能也不少啊。所以,推荐给大家下载使用吧。 [ 本 ...…

查看全部问答∨

一个单片机初学者的学习经历一

大一在幼稚中度过     我大一就开始作电子,因高两届的张哥的一句话,我开始学单片机,七天边学边做,我做好第一个题目(实现一个他们称做"求爱机"的东西),但是现在他还躺在那,还没有实现他的目的,呵呵。他根本没有跑起来,除 ...…

查看全部问答∨

FVC310无风扇视觉控制器、图像处理器

深圳市精视控制技术有限公司,由专业从事工业自动化系统硬件方案和软件工程师组成的研发客户团队。通过专业知识积累了多年的应用经验,服务广大工业自动化用户,熟练现场实际应用提出最佳解决方案。特别针对机器视觉系统开发的无风扇视觉控制器,更 ...…

查看全部问答∨

求高手给一段vc5410语音降噪的C源代码

求高手给一段vc5410语音降噪的C源代码,现在已经可以读取语音,并且可以输出语音,现求一段代码,可以对得到的语音信号中的噪声去除!…

查看全部问答∨

产品定位:3700系列产品与吉时利2750 (Integra)及7002解决方案的对比

3700系列产品定位于提供中高通道数量的开关系统和/或多通道测量系统解决方案。目前,我们提供具有类似能力的两个产品:7002型开关主机和2750型Integra系列产品(参见图1)。   如果仅用于开关应用,3706-S型产品能够提供超乎7002型的出众解决 ...…

查看全部问答∨

DSP和USB

用DSP设计USB接口电路,可以通过USB读取U盘中的文件吗,并分析处理文件中的信息,没用过DSP,但现在不得不用,想买块开发板,开发板中有类似的USB例程吗,请大家回答,谢谢。…

查看全部问答∨

协议栈例程simpleApp中为什么sensor重复进行加网流程

协议栈的网络初始化主要是在ZDApp.c里面做的,如果未设置DEV_HOLD,设备会自动循环初始化网络,直到加入网络 如下 ZDApp_Init()-->    ZDOInitDevice( 0 )-->ZDApp_NetworkInit()(在此函数里面启动ZDO层事件ZDO_NETWORK_INIT)。 UI ...…

查看全部问答∨

<转载>细数二十世纪最伟大的10大算法

作者July 原文出处 http://www.csdn.net/article/2011-01-12/289993 细数二十世纪最伟大的十大算法 译者:July   二零一一年一月十日 ------------------------------------参考文献: The Best of the 20th Century: Editors Name ...…

查看全部问答∨

翠花上保险丝了。

一个充电监控的项目,在上电初期需要用高压来打通接触不良的地方。按照操作规程,需要先断电再打通,但还是经常发生意外。 用了tvs,可以少烧一点,但在高压大电流的作用下,似乎还是扛不住。 只能出狠招了 希望这次的表现好一点,起码更耐用 ...…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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