我自己写的头文件,测试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++);*/
}
}
|