打印
[Cortex-M0技术交流]

中断函数问题

[复制链接]
3720|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qdwygdwxf|  楼主 | 2012-12-27 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己写的头文件,测试TMR0,有中断标志,但无法进入中断,程序跳到启动文件的NMI_Handler处停了
请各位老师帮忙看看
#include "nano1xx.h"
#include <stdint.h>
void sys_init(void)
{
       
                RST_SRC = 0x00000000;        // 系统复位寄存器清0       
          TEMPCTL = 0x000000AA;        // 禁止温度传感器功能清0
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;               
                PORCTL = 0x5AA5;                         // 禁止上电复位        
                BODCTL = 0x00000000;         // 掉电检测不使能
                BODSTS = 0x00000000;        // 掉电测试不使能
                VREFCTL = 0x00000F00;        // 基准电压不使能       

}
void colk_init(void)
{
                IRCTRIMCTL = 0x00000000;        // 禁用HIRC微调功能
                IRCTRIMIEN = 0x00000000;        // 禁用HIRC中断       
                CLKSTATUS = 0x00000000;
                while(!CLKSTATUSBIT -> LIRC_STB);
        do{
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;               
                PWRCTL = 0x0000031D;                        // 禁用掉电模式,LIRC_EN,HXT_EN使能,HIRC_EN禁用
                AHBCLK = 0x00000031;                        // 系统时钟使能,SRAM控制器时钟使能,GPIO_EN时钟使能
                                                                                                                        // EBI_EN、ISP_EN、DMA_EN禁止
               
                APBCLK = 0x1001013D;        // ADC,UART0,TMR2-3,WDT时钟使能
                CLKSEL1 = 0x000400F2; // TMR0-1,选择HXT时,UART_S,ADC_S选择PLL时钟
                CLKSEL2 = 0x000F88FB; // TMR2-3,选择HXT时钟,时钟分频时钟源选择HCLK
                CLKDIV0 = 0x00000000; // 分频器不分频
                CLKDIV1 = 0x00000000; // 分频器不分频
                PLLCTL = 0x0000FEC0;        // PLL时钟24MHz
                FRQDIV = 0x00000010;        // 分频器使能,分频选择1/2
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;       
                CLKSEL0 = 0x00000010;        // HCLK选择PLL时钟
        }while(!CLKSTATUSBIT -> HXT_STB);        // 判断HXT_STB时钟是否稳定

}
void wdt_init(void)
{
                RegLockAddr = 0x00000059;        // 解除寄存器保护序列
                RegLockAddr = 0x00000016;
                RegLockAddr = 0x00000088;
                WDT_CTL = 0x00000070;
                WDT_IER = 0x00000000;        // 禁用看门狗定时中断
          WDT_ISR = 0x00000000;
}
void GPIO_SET(void)
{
/*******************GPIOA_SET***********************/
        PA_L_MFP = 0x11111111; // 设置PA端口低8位为AD
        PA_H_MFP = 0x00000000; // 设置PA端口高8位为GPIO.
        GPIOA_PMD = 0x00000000; // 设置PA端口为输入模式
        GPIOA_PUEN = 0x00000000; // GPIOA无上拉
        GPIOA_OFFD = 0x00000000; // 关闭数字输入
        GPIOA_DOUT        = 0x00000000; // 数据输出为低
        GPIOA_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOA_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOA_DBEN = 0x00000000; // 禁止防反弹
        GPIOA_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOA_IER = 0x00000000; // 禁止中断使能
        GPIOA_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOB_SET***********************/       
        PB_L_MFP = 0x00000000; // 设置PB端口低8位为GPIO
        PB_H_MFP = 0x00000000; // 设置PB端口高8位为GPIO
        GPIOB_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOB_PUEN = 0x00000000; // GPIOB无上拉
        GPIOB_OFFD = 0x00000000; // 关闭数字输入
        GPIOB_DOUT        = 0x00000000; // 数据输出为低
        GPIOB_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOB_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOB_DBEN = 0x00000000; // 禁止防反弹
        GPIOB_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOB_IER = 0x00000000; // 禁止中断使能
        GPIOB_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOC_SET***********************/       
        PC_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        PC_H_MFP = 0x00000000; // 设置PC端口高8位为GPIO
        GPIOC_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOC_PUEN = 0x00000000; // GPIOB无上拉
        GPIOC_OFFD = 0x00000000; // 关闭数字输入
        GPIOC_DOUT        = 0x00000000; // 数据输出为低
        GPIOC_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOC_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOC_DBEN = 0x00000000; // 禁止防反弹
        GPIOC_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOC_IER = 0x00000000; // 禁止中断使能
        GPIOC_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOD_SET***********************/       
        PD_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        PD_H_MFP = 0x00000000; // 设置PC端口高8位为GPIO
        GPIOD_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOD_PUEN = 0x00000000; // GPIOB无上拉
        GPIOD_OFFD = 0x00000000; // 关闭数字输入
        GPIOD_DOUT        = 0x00000000; // 数据输出为低
        GPIOD_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOD_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOD_DBEN = 0x00000000; // 禁止防反弹
        GPIOD_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOD_IER = 0x00000000; // 禁止中断使能
        GPIOD_ISR = 0x00000000; // 中断状态寄存器清0拉
/*******************GPIOE_SET***********************/       
        PE_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        PE_H_MFP = 0x00000000; // 设置PC端口高8位为GPIO
        GPIOE_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOE_PUEN = 0x00000000; // GPIOB无上拉
        GPIOE_OFFD = 0x00000000; // 关闭数字输入
        GPIOE_DOUT        = 0x00000000; // 数据输出为低
        GPIOE_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOE_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOE_DBEN = 0x00000000; // 禁止防反弹
        GPIOE_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOE_IER = 0x00000000; // 禁止中断使能
        GPIOE_ISR = 0x00000000; // 中断状态寄存器清0
/*******************GPIOF_SET***********************/       
        PF_L_MFP = 0x00000000; // 设置PC端口低8位为GPIO
        GPIOF_PMD = 0x55555555; // 设置PA端口为输出模式
        GPIOF_PUEN = 0x00000000; // GPIOB无上拉
        GPIOF_OFFD = 0x00000000; // 关闭数字输入
        GPIOF_DOUT        = 0x00000000; // 数据输出为低
        GPIOF_PIN = 0x00000000; // 数据输入寄存器清0
        GPIOF_DMASK = 0x0000000; // 端口输出数据可以更新
        GPIOF_DBEN = 0x00000000; // 禁止防反弹
        GPIOF_IMD = 0x00000000; // 禁止边沿触发中断
        GPIOF_IER = 0x00000000; // 禁止中断使能
        GPIOF_ISR = 0x00000000; // 中断状态寄存器清0
}
void TMR0_SET(void)
{
        RegLockAddr = 0x00000059;        // 解除寄存器保护序列
        RegLockAddr = 0x00000016;
        RegLockAddr = 0x00000088;
        TMR_CTL0 = 0x00000012; // 周期定时模式,复位预分频器计数器
        TMR_PRECNT0 = 0x00000000; // 预分频不分频
        TMR_CMPR0 = 0x0000FFFF; // 定时器比较80
        TMR_IER0 = 0x00000001; // 定时器中断使能
        TMR_ISR0 = 0x00000000; // 定时器中断状态清0
        TMR_DR0 = 0x00000000; // 定时器处置为0
        MCU_IRQ = 0x00000000;
        NVIC_ISER = 0x00000100; // 使能中断号8
        NMI_SEL = 0x00000008;        // 选择中断号8,定时器0
        NVIC_IPR2 = 0x000000C0; // IRQ7优先低优先级
        TMR_CTL0BIT -> TMR_EN = 0x01; // 定时器启动
}
void TMR0_IRQHandler(void)
{
        TMR_ISR0 = 0x00000000;
        GPIOE6 = !GPIOE6;
}
unsigned long i;
main (void)
{
        sys_init();        // 系统初始化
        colk_init();        // 时钟初始化
        wdt_init();        // 看门狗初始化
        GPIO_SET();        // IO 口初始化
        TMR0_SET();
  while(1)
  {
        /*        GPIOE6 = 0x01; // GPIOE6 输出为高
                for(i=0;i<0x0000FFFF;i++);
                GPIOE6 = 0x00; // GPIOE6 输出为低
                for(i=0;i<0x0000FFFF;i++);*/
  }
}

相关帖子

沙发
xiaozhongde| | 2013-10-25 10:58 | 只看该作者
霍霍

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

1

粉丝