DebugDump Forum

本站无需注册,无需积分,无需回复可下载所有资料,如果真的喜欢小站,请您注册之后请至少回复一个帖子激活Id,谢谢支持! 站长QQ: 516333132 (挖坑网/填坑网) admin@debugdump.com

您尚未登录。

#1 2018-08-20 09:11:15

Jin劲
会员
注册时间: 2018-04-06
累计积分: 122

f1c100s怎样才能timer产生并进入中断?

我目前是这样的
中断向量表正常
SVC模式 启动timer0 开启了timer0 irq enable
读cur value 寄存器得知timer0在跑 timer的pending标志是1
但是不进入中断 请教一下漏了哪些步骤
看demod的例子,也是没有中断的 只是循环查询pending标志位

离线

#2 2018-08-20 09:19:40

Jin劲
会员
注册时间: 2018-04-06
累计积分: 122

Re: f1c100s怎样才能timer产生并进入中断?

昨天用jlink查看是<SVC mod,frq dis,irq dis>
是不是还需要修改CPSR寄存器的irq位来开启irq?
哇 好想试试 可惜还在上班 只能下班回去试

离线

#3 2018-08-20 09:50:57

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,759

Re: f1c100s怎样才能timer产生并进入中断?

这个,中断还不会玩,表示关注一下.

离线

#4 2018-08-20 16:56:05

晕哥
Administrator
注册时间: 1970-01-01
累计积分: 5,759

Re: f1c100s怎样才能timer产生并进入中断?

QQ20180820164457.png

__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

仍然感谢新唐提供的裸奔程序。

离线

#5 2019-03-11 20:10:54

wadezyb
会员
注册时间: 2018-08-18
累计积分: 1

Re: f1c100s怎样才能timer产生并进入中断?

*(void* volatile *)0x38 = (void* volatile)sysIrqHandler;

这句话怎么理解? 为何是0X38呢?

离线

#6 2019-03-11 21:06:40

超级萌新
会员
注册时间: 2018-05-04
累计积分: 159

Re: f1c100s怎样才能timer产生并进入中断?

wadezyb 说:

*(void* volatile *)0x38 = (void* volatile)sysIrqHandler;

这句话怎么理解? 为何是0X38呢?

arm9体系结构决定的,这个地址就是 irq 的中断地址。

把新的指针(地址)放到这个地址。


在 cortex M3 里面,不再是存中断地址 而是一条 跳转指令。

离线

#7 2019-03-13 09:43:51

九霄云外
会员
注册时间: 2019-01-09
累计积分: 40

Re: f1c100s怎样才能timer产生并进入中断?

厉害,在搞这么底层的东西,准备上自己的操作系统吗


全志芯片供应、方案开发、技术支持 QQ:610943940

离线

页脚