Tiny4412中断控制器(GIC)之PWM

发布者:古通闲人最新更新时间:2018-10-14 来源: eefocus关键字:Tiny4412  中断控制器  GIC  PWM 手机看文章 扫描二维码
随时随地手机看文章

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

    //------ Timer0's IrqID is 69------------------

    ICDIPR17_CPU0 = ~(0xff << 8);  // the Zero is Highest priority 

    ICDIPTR17_CPU0 = (1 << 8);       // for CPU0, refer  PG815 

    ICDISER2_CPU0 =  (1 << 5);        // enable interrupt 0

    //---------- Configure PWM Timer 0 --------------

    GPD0CON &= ~0xff;

    GPD0CON |= (0x2 << 0);

     

    TCFG0  = 0xff;

    TCFG1  = 0x4;

    TINT_CSTAT = 1;                          //开中断

    

    //200000000 / 256 /16 = 48828,即1秒钟这么多次

    TCNTB0 = 48828;                        //1秒钟产生一次中断

    TCMPB0 = 24414;                       //一半的时候翻转

    TCON   = (1 << 1);                      //把上面两个寄存器值手动装入控制器

    TCON   = 1 | (1 << 2) | (1 << 3);//启动

}

void do_irq(unsigned long regs[])

{

    printf("PWM Timer0: Time Out\n");

    

    TINT_CSTAT |= (1 << 5);//清中断

}

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  PWM 引用地址:Tiny4412中断控制器(GIC)之PWM

上一篇:Tiny4412的Uart操作
下一篇:Tiny4412中断控制器(GIC)之WDT中断

推荐阅读最新更新时间:2024-03-16 16:16

TINY4412裸机程序,时钟操作
其实,Exynos 4412的IROM代码已经设置了PLL,我们可以通过串口把IROM设置的PLL寄存器值打印出来,这些值打印出来是这样的(摘自韦东山老师的《嵌入式Linux系统开发完全手册_基于4412__上册》): CLK_SRC_CPU = 0x01000001 CLK_DIV_DMC0 = 0x00111713 CLK_DIV_DMC1 = 0x01011171 CLK_SRC_TOP0 = 0x01110000 CLK_SRC_TOP1 = 0x00001000 CLK_DIV_TOP = 0x00015470 CLK_SRC_LEFTBUS = 0x00000001 CLK_DIV_LEFTBUS = 0x0000
[单片机]
<font color='red'>TINY4412</font>裸机程序,时钟操作
PWM DC/DC转换器的主电路及其作用
    PWM DC/DC转换器的电路,通常由主电路和控制电路两大部分组成,其电路框图如图所示。   1.主电路及其作用   PWM DC/DC转换器的主电路,是处理   如图 PWM DC/DC转换器电路框图   和传输大功率的电路,对设备的电性能、效率、温升、可靠性、体积和重量等指标有决定性的作用,其要求如下。   (1)在确定的输入直流电压变化范围内,能输出负载要求的变化范围的直流电压。例如,输人电压最低时也能达到最高输出电压,输入电压最 高时也能达到最低输出电压。   (2)输出负载要求的直流电流(范围):能够输出足够的直流负载电流,并且能允许在足够宽的负载电流变化范围的情况下(如从空载到满载,
[电源管理]
<font color='red'>PWM</font> DC/DC转换器的主电路及其作用
stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
步进电机的简单使用 接线: TB6600驱动盒的详细说明: 程序设计: 工程文件: 做毕业设计要用到57步进电机,所以花了两天时间做了一下电机函数 从淘宝查的资料: 接线如图: 接线: DIR- && PUL- 接 单片机GND DIR+ 接 PA1 PUL+ 接 PA0 驱动盒TB6600 VCC 24V 驱动盒TB6600 GND 24V的GND 我测出来的 A组(绿+蓝- ) B组(黄+红-) 如何确定AB两组看这个: 关于42步进电机驱动——基于STM32 HAL库实现 接线方法 TB6600驱动盒的详细说明: 先冲英说明: Microstep Driver 微步驱动程序 Microstep 微步
[单片机]
stm32驱动TB6600控制42/57步进电机的案例(TIM中断和<font color='red'>PWM</font>实验)
直流电机调速程序
#include reg52.h sbit KEY1 = P3^1; //定义调速按键 sbit PWM = P1^5; //定义调速端口 unsigned char CYCLE; //定义周期T=x*0.1ms unsigned char PWM_ON ; //定义高电平时间 void delay(unsigned int cnt) { while(--cnt); } main() { unsigned char PWM_Num; TMOD |=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; IE= 0x82;
[单片机]
利用DSP芯片设计PWM开关电源的原理及完整解决方案
目前,开关电源以具有小型、轻量和高效的特点而被广泛应用于以电子计算机为主异的各种终端设备和通信设备中,是当今电子信息产业飞速发展不可缺少的一种电源方式.与之相应,在微电子技术发展的带动下,DSP芯片的发展日新月异,功能日益强大,性价比不断上升,开发手段不断改进,其处理速度比CPU快10~15倍,因此基于DSP芯片的开关电源可以说是天作之保,拥有着广阔的前景,可用于选进的机载电源中,也是开关电源今后的发展趋势. 基于DSP的PWM型开关电源的设计及工作原理分析与仿真验证 1 PWM型开关电源原理 市电信号经过输入滤波和整流滤波后实现AC/DC转换,将电网交流电直接整流为较平滑的直流电,以供下一级变换;再经过逆变器后实现D
[电源管理]
STM32F0xx_TIM输出PWM配置详细过程
前言 前面我说过STM32的定时器功能很强大,今天就来总结一下它的另外一个“强大”功能:TIM的比较输出功能,输出可调PWM波形。直接调用函数接口“TIM2_CH1_PWM(uint32_t Freq, uint16_t Dutycycle)”传入频率和占空比就能输出指定的波形。 我提供的软件工程直接调用是比较简单就能实现想要的PWM波形。但是,如果你是学习者,建议还是进去函数把每一个细节了解清楚,里面的东西可能对你掌握TIM很有帮助。 下载 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。 ST标准外设库和参考手册、数据手册等都
[单片机]
STM32F0xx_TIM输出<font color='red'>PWM</font>配置详细过程
msp430 PWM周期计算
例: P4DIR |= BIT1+BIT2+BIT3; // P4.1 - P4.3 output P4SEL |= BIT1+BIT2+BIT3; // P4.1 - P4.3 TBx options TBCCR0 = 512-1; // PWM Period TBCCTL1 = OUTMOD_7; // CCR1 reset/set TBCCR1 = LightCDPM; // CCR1 PWM duty cycle TBCCTL2 = OUTMOD_7; 增计数模式下,使用CCR0作周期定时,CCR1作P
[单片机]
一种H型双极模式PWM控制的功率转换电路设计
  低速特性是衡量转台伺服系统性能的重要指标之一。影响低速特性的因素有很多,其中最主要的是摩擦力矩和电机波动力矩的干扰。对摩擦力矩的干扰,可以采取摩擦力矩补偿方法,来降低摩擦力矩干扰对伺服系统低速特性的影响。但在工程中很难确定摩擦力矩的准确模型,因此这些补偿方法在工程中应用比较困难。   H型双极模式PWM控制提高转台伺服系统低速特性的作用十分显著,而且简单易行。H型双极模式PWM控制能够提高伺服系统的低速特性,是因为H型双极模式PWM控制的电动机电枢回路中始终流过一个交变的电流,这个电流可以使电动机发生高频颤动,有利于减小静摩擦,从而改善伺服系统的低速特性。但因其功率损耗大,H型双极模式PWM控制只适用于中、小功率的伺服系统
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved