我目前是这样的
中断向量表正常
SVC模式 启动timer0 开启了timer0 irq enable
读cur value 寄存器得知timer0在跑 timer的pending标志是1
但是不进入中断 请教一下漏了哪些步骤
看demod的例子,也是没有中断的 只是循环查询pending标志位
离线
昨天用jlink查看是<SVC mod,frq dis,irq dis>
是不是还需要修改CPSR寄存器的irq位来开启irq?
哇 好想试试 可惜还在上班 只能下班回去试
离线
__irq void sysIrqHandler()
{
static int i = 0;
i++;
}
#define INTC_EN_REG0 (0x01C20400 + 0x20)
#define INTC_MASK_REG0 (0x01C20400 + 0x30)
int main(void)
{
//void* _mOldIrqVect = *(void volatile *)0x38;
*(void* volatile *)0x38 = (void* volatile)sysIrqHandler;
sys_clock_init();
sys_uart_init();
write32(TMR_IRQ_EN_REG, 1);
write32(INTC_EN_REG0, (read32(INTC_EN_REG0)) | 1 << 13);
write32(TMR_IRQ_EN_REG, (read32(TMR_IRQ_EN_REG)) | 1 << 13);
write32(TMR0_INTV_VALUE_REG, 0x2EE0); //Set interval value
write32(TMR0_CTRL_REG, 0x10); //Select Single mode,24MHz clock source,2 pre-scale
write32(TMR0_CTRL_REG, read32(TMR0_CTRL_REG)|(1<<1)); //Set Reload bit
while((read32(TMR0_CTRL_REG)>>1)&1); //Waiting Reload bit turns to 0
write32(TMR0_CTRL_REG, read32(TMR0_CTRL_REG)|(1<<0)); //Enable Timer0
u32_t temp;
__asm
{
MRS temp, CPSR
AND temp, temp, 0x7F
MSR CPSR_c, temp
}
u32_t old = 0;
while(1)
{
//sysprintf("hello %s: %d 0x%x \n", "world", 10, 20);
//sys_uart_putc('A');
volatile u32_t a = read32(TMR0_CUR_VALUE_REG);
if(old == a)
{
}
else
{
old = a;
if(a % 256 == 0)
{
sysprintf("%d\n", a);
}
}
}
u32_t cnt = 0;
GPIOG->CFG[0] = (1 << 0) << 8;
for(;;)
{
if(cnt==0)
GPIOG->DAT &= ~(1U << 2);
if(cnt==100000)
GPIOG->DAT = 1U << 2;
if(++cnt>200000)cnt = 0;
}
int i = 0;
while(1)
{
i++;
}
return 0;
}
实现了定时器中断的简单demo: f1c100s_project_run_in_sram_6.7z
仍然感谢新唐提供的裸奔程序。
离线
*(void* volatile *)0x38 = (void* volatile)sysIrqHandler;
这句话怎么理解? 为何是0X38呢?
离线
*(void* volatile *)0x38 = (void* volatile)sysIrqHandler;
这句话怎么理解? 为何是0X38呢?
arm9体系结构决定的,这个地址就是 irq 的中断地址。
把新的指针(地址)放到这个地址。
在 cortex M3 里面,不再是存中断地址 而是一条 跳转指令。
离线
厉害,在搞这么底层的东西,准备上自己的操作系统吗
小薏科技------全志F系列芯片供应、方案开发、技术支持 QQ:610943940
离线
arm9体系结构决定的,这个地址就是 irq 的中断地址。
把新的指针(地址)放到这个地址。
在 cortex M3 里面,不再是存中断地址 而是一条 跳转指令。
你说反了。应该是Cortex-M3里面不再是跳转指令而是中断函数地址。
ARM9里0x38放的是函数地址,0x18地址是跳转指令;一般放的是LDR指令,负责把0x38处的函数地址Load到PC实现跳转。
最近编辑记录 armstrong (2020-04-01 19:12:21)
离线
看看前几天写的,不过是RTT用的
https://whycan.cn/t_3984.html
离线
我目前是这样的
中断向量表正常
SVC模式 启动timer0 开启了timer0 irq enable
读cur value 寄存器得知timer0在跑 timer的pending标志是1
但是不进入中断 请教一下漏了哪些步骤
看demod的例子,也是没有中断的 只是循环查询pending标志位
1 高级中断管理器中的中断向量要打开
2 进中断第一条语句是pending写1清除挂起状态,不然一直进
离线
厉害,在搞这么底层的东西,准备上自己的操作系统吗
离线
中断还不会用,学习下。是不是需要设置INTC_BASE_ADDR_REG寄存器?
离线
我的timer0和INTC设置如图片所示,但是进不去IRQ_Handler()中断程序,请教论坛大佬们该如何设置,谢谢!
离线
@超级萌新
这也是一个跳转啊
离线