搜索
bottom↓
回复: 5

请教关于AT91SAM7S64的中断问题(我会贴出程序)

[复制链接]

出0入0汤圆

发表于 2010-7-16 20:10:50 | 显示全部楼层 |阅读模式
目的是在实时时钟中断里改变I/O电平实现LED闪烁。目前好像只会进入一次就死了,参考了本版块下关于AT91SAM7S61中断的帖子并未解决,请大侠们给看下。
#include<AT91SAM7S64.H>
unsigned int a;

void SystemClock_initialize(void)                     //系统时钟初始化
{
*AT91C_PMC_IDR = 0xFFFFFFFF;  //disable all PMC interrupt

*AT91C_PMC_SCER = (1<<0)   //Processor Clock Enable
                  |(1<<7);  //USB Device Port Clock Enable
                  
*AT91C_CKGR_MOR = (1<<0)   //Main Oscillator Enable
                  |(0<<1)   //Oscillator is NOT Bypassed
                  |(0xFF<<8);  //Main Oscillator Start-up Time(255)

while(!((*AT91C_PMC_SR)&0x01));  //wait for MOSCS to be set

*AT91C_CKGR_PLLR = (0x19<<0)  //DIV
                   |(0x3F<<8)  //PLL COUNT
                   |(0x00<<14)  //OUT
                   |(0x48<<16)  //MUL
                   |(0x01<<28); //USB DIV

while(!((*AT91C_PMC_SR)&(0x01<<2)));  //wait for LOCK to be set
while(!((*AT91C_PMC_SR)&(0x01<<3)));  //wait for MCKRDY to be set

*AT91C_PMC_MCKR = (0<<0)  //Slow Clock is selected
                  |(1<<2); //Selected clock divided by 2
                  
while(!((*AT91C_PMC_SR)&(0x01<<3)));  //wait for MCKRDY to be set

*AT91C_PMC_MCKR  |= (0x03<<0);  //PLL Clock is selected.
                  
while(!((*AT91C_PMC_SR)&(0x01<<3)));  //wait for MCKRDY to be set

*AT91C_PMC_PCER =0xFFFFFFFF;  //enable all Peripheral Clock
}

void IO_initialize(void)                           //I/O初始化
{
        *AT91C_PIOA_PER=0x00000001;
        *AT91C_PIOA_OER=0x00000001;
        *AT91C_PIOA_OWER=0x00000001;
        *AT91C_PIOA_ODSR=0x00000001;       
}

void RTT_initialize(void)                     //实时时钟初始化
{
        *AT91C_RTTC_RTMR=0x00028000;
}

void RTT(void)                                //中断服务程序
{
         if(*AT91C_PIOA_ODSR==0x00000000)
         {
                 *AT91C_PIOA_ODSR=0x00000001;
         }
         else
         {
                 *AT91C_PIOA_ODSR=0x00000000;
         }         
        a=*AT91C_RTTC_RTSR;               //读状态寄存器以清除中断标志
         *AT91C_AIC_EOICR =0x00000000;
}

void AIC_initializet(void)             //中断控制器配置
{
        AT91C_AIC_SMR[1]=0x00000020;
        AT91C_AIC_SVR[1]=(unsigned int)RTT;
        *AT91C_AIC_IECR=0x00000002;       
}

int main(void)
{
        SystemClock_initialize();
        IO_initialize();
        AIC_initializet();
        RTT_initialize();
        while(1)
        {
                ;                               
        }       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-7-16 22:38:56 | 显示全部楼层
没人回是不是因为标题错了啊?64被我不小心写成61了。

出0入0汤圆

发表于 2010-7-16 22:56:42 | 显示全部楼层
建议进入中断后,读取以下SR寄存器的内容,应该就可以解决了。

出0入0汤圆

 楼主| 发表于 2010-7-16 23:27:14 | 显示全部楼层
谢谢qiujianben;
我有读取RTT本身的状态寄存器的,这句:a=*AT91C_RTTC_RTSR; 。不会是要去读TC的吧?

出0入0汤圆

发表于 2010-7-17 11:04:34 | 显示全部楼层
放到前面去,一进中断就读!

出0入0汤圆

 楼主| 发表于 2010-7-17 13:35:01 | 显示全部楼层
回复【4楼】qiujianben
-----------------------------------------------------------------------

呵呵,原来就在前面的,这样:
void RTT(void)                                //中断服务程序
{
a=*AT91C_RTTC_RTSR;               //读状态寄存器以清除中断标志
if(*AT91C_PIOA_ODSR==0x00000000)
{
  *AT91C_PIOA_ODSR=0x00000001;
}
else
{
  *AT91C_PIOA_ODSR=0x00000000;
}   
*AT91C_AIC_EOICR =0x00000000;
}
不行才该来该去,改后面了。
忘说了,我用的mdk4.0和自带的启动代码。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 04:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表