免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1026 | 回复: 0
打印 上一主题 下一主题

ARM7TDMI基本操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
1、IO控制 
将相应的管脚设置成输出:
 
//首先使能PIO控制
 AT91C_BASE_PIO->PIO_PER = pio;
    //设置pio为输出口
 AT91C_BASE_PIO->PIO_OER = pio;
 
将相应的管脚设置成输入:
    //首先使能PIO控制
 AT91C_BASE_PIO->PIO_PER = pio;
    //设置pio为输出禁止口,即输入口。
 AT91C_BASE_PIO->PIO_ODR = pio;
 
禁止相应的管脚:
 //禁止PIO控制
 AT91C_BASE_PIO->PIO_PDR = pio;
 
将某管脚设置输出高电平
 
void IOSet(Uint32 pio)
{
 AT91C_BASE_PIO->PIO_SODR = pio;
}
 
将某管脚设置输出地电平
 
void IOClr(Uint32 pio)
{
 AT91C_BASE_PIO->PIO_CODR = pio;
}

2、点亮发光二极管子程序
int main(void)
{
  AT91C_BASE_PIO->PIO_PER =PIO0;
    //设置pio为输出口
  AT91C_BASE_PIO->PIO_OER = PIO0;
  while(1)
  {
    //AT91C_BASE_PIO->PIO_SODR = PIO0;
    AT91C_BASE_PIO->PIO_CODR = PIO0;//将PIO0设置成低电平,低电平二极管点亮
  }
}

3、定时器0
中断安装函数
void Int_Install(void)
{
     AT91C_BASE_AIC->AIC_IDCR = ALL_IRQ; // In initializing ,disable all interrupt
     // initialize interrupt mode
     AT91C_BASE_AIC->AIC_SMR[0] = AIC_SRCTYPE_EXT_NEGATIVE_EDGE;         // FIQ
     AT91C_BASE_AIC->AIC_SMR[1] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x00; // SWI
     AT91C_BASE_AIC->AIC_SMR[2] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x03; // USART0
     AT91C_BASE_AIC->AIC_SMR[3] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x02; // USART1
     AT91C_BASE_AIC->AIC_SMR[4] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x07; // TC0
     AT91C_BASE_AIC->AIC_SMR[5] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x04; // TC1
     AT91C_BASE_AIC->AIC_SMR[6] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x04; // TC2
     AT91C_BASE_AIC->AIC_SMR[7] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x07; // WDT
     AT91C_BASE_AIC->AIC_SMR[8] = AIC_SRCTYPE_INT_EDGE_TRIGGERED | 0x01; // Parrel 
     AT91C_BASE_AIC->AIC_SMR[16] = AIC_SRCTYPE_EXT_HIGH_LEVEL | 0x04;    // 
     AT91C_BASE_AIC->AIC_SMR[17] = AIC_SRCTYPE_EXT_HIGH_LEVEL | 0x05;    //
     AT91C_BASE_AIC->AIC_SMR[18] = AIC_SRCTYPE_EXT_LOW_LEVEL | 0x05;     //
    // Setup interrupt handlers
    AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) FIQ_Manual_SW;
    AT91C_BASE_AIC->AIC_SVR[1] = (unsigned int) INT_SWI;
    AT91C_BASE_AIC->AIC_SVR[2] = (unsigned int) INT_USART0;
    AT91C_BASE_AIC->AIC_SVR[3] = (unsigned int) INT_USART1;
    AT91C_BASE_AIC->AIC_SVR[4] = (unsigned int) INT_TC0;
    AT91C_BASE_AIC->AIC_SVR[5] = (unsigned int) INT_TC1;
    AT91C_BASE_AIC->AIC_SVR[6] = (unsigned int) INT_TC2;
    AT91C_BASE_AIC->AIC_SVR[7] = (unsigned int) INT_WDT;
    AT91C_BASE_AIC->AIC_SVR[8] = (unsigned int) INT_PIO;
    AT91C_BASE_AIC->AIC_SVR[16] = (unsigned int) IRQ_EX0;
    AT91C_BASE_AIC->AIC_SVR[17] = (unsigned int) IRQ_EX1;
    AT91C_BASE_AIC->AIC_SVR[18] = (unsigned int) IRQ_EX2;
    AT91C_BASE_AIC->AIC_SPU     = (unsigned int) INT_SPU;   
}
定时器初始化
void TC0Init(Uint16 time)
{
  //TCBlock.TC_BMR |= TC_NONEXC0;   /* non extern clock signal */
    (* AT91C_TCB0_BMR) |= TC_NONEXC0;   /* non extern clock signal */
    AT91C_BASE_TC0->TC_CMR = TC_CLKS_MCK1024 | TC_CPCTRG;
    AT91C_BASE_TC0->TC_RC  = time * (TC_CLKS_MCK >> 10) / 1000;
    AT91C_BASE_TC0->TC_IDR = TC_COVFS | TC_LOVRS | TC_LDRAS | TC_LDRBS | TC_ETRGS;    /* disable unused interrupt */
    AT91C_BASE_TC0->TC_IER = TC_CPCS;
    AT91C_BASE_TC0->TC_CCR = TC_CLKEN | TC_SWTRG;
}
定时器中断处理函数
void TC0_Handler(void)
{
   volatile int i;
    SysTime++;
    if(SysTime > 1 * 60 * 1000 / 10)
    {
        ONEminute = 1;//定时一分钟标志
    }
    if(SysTime > 15 * 1000 / 10)
    {
        gFiftminute = 1;
    }
    i = AT91C_BASE_TC0->TC_SR;
}
定时器中断使能
void EnableInt(Uint8 n)
{
    AT91C_BASE_AIC->AIC_IECR = 1 << n;
}

4、看门狗x5043的相关操作
要正常使用看门狗定时器,需要完成以下几步的操作:
看门狗初始化:
wdt_init();
设置看门狗定时器的中断时间:
void  WDT_SetTime(Uint8 rstTime);
开启看门狗并设置模式:
 wdt_settime(600, 0x55);
最后可以在看门狗中断中做相关的处理:
// Internal watchdog interrupt
void WDT_Handler(void)
{
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP