首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在I2C Arduino上启用定时器中断内的nRF52中断

在I2C Arduino上启用定时器中断内的nRF52中断
EN

Stack Overflow用户
提问于 2017-07-01 15:24:10
回答 1查看 1.3K关注 0票数 0

我正在为一个基于nRF52的董事会编写一个程序,使用Redbear库。有效地把我的董事会当作一个BLE纳米2。

我有一个计时器,每x毫秒计时一次,例如50毫秒。

在这个计时器中,我希望从I2C传感器读取数据,并将读取添加到缓冲区中。

我知道,默认情况下,在计时器ISR中,中断是禁用的。我想知道如何简单地重新启用I2C中断,并让传感器读取,然后再禁用中断。

传感器读数之间的间隔非常重要,我不想仅仅在计时器ISR中设置一个标志,因为我不知道要多久才能检查该标志。

请有人告诉我如何在一个计时器ISR中简短地启用I2C中断?

我试验过:

代码语言:javascript
复制
__disable_irq();

__enable_irq();

NVIC_EnableIRQ(SPI0_TWI0_IRQn);

NRF_TWI0->INTENSET = 1;

没有joy有任何这些,我知道他们中的一些只在软件的某些地方工作,所以在ISR中不能正常工作。

代码语言:javascript
复制
void setup() {
  // put your setup code here, to run once
  NVIC_SetPriority (TIMER0_IRQn, 2);
  NVIC_SetPriority (TIMER1_IRQn, 2);
  NVIC_SetPriority (TIMER2_IRQn, 2);
  NVIC_SetPriority (SPI0_TWI0_IRQn, 3);
  NVIC_SetPriority (SPI1_TWI1_IRQn, 3);
  Serial.begin(9600);
  Serial.println("Start ");
  Serial.print("Priority of TWI0: ");
  Serial.println(NVIC_GetPriority (SPI0_TWI0_IRQn));
  Serial.println(NVIC_GetPriority (SPI1_TWI1_IRQn));
  Serial.print("Priority of Ticker: ");
  Serial.println(NVIC_GetPriority (TIMER0_IRQn));
  Serial.println(NVIC_GetPriority (TIMER1_IRQn));
  Serial.println(NVIC_GetPriority (TIMER2_IRQn));


  Wire.begin();
  __disable_irq();
  __enable_irq();
  ticker1s.attach(task_handle, 1);
  Wire.requestFrom(0x02,6);

}

void task_handle(void) {
  __enable_irq();
  Serial.println("Task handle ");
  Serial.println("-IRQ enable status: ");
  Serial.println(NVIC_GetEnableIRQ(SPI0_TWI0_IRQn));
  Serial.println(NVIC_GetEnableIRQ(SPI1_TWI1_IRQn));
  NVIC_EnableIRQ(SPI0_TWI0_IRQn);
  NRF_TWI0->INTENSET = 1;

  NVIC_EnableIRQ(SPI1_TWI1_IRQn);
  NRF_TWI1->INTENSET = 1;
  Serial.println("-IRQ enable status: ");
  Serial.println(NVIC_GetEnableIRQ (SPI0_TWI0_IRQn));
  Serial.println(NVIC_GetEnableIRQ (SPI1_TWI1_IRQn));
  delay(1000);
  Wire.requestFrom(0x02,6);

}
EN

回答 1

Stack Overflow用户

发布于 2017-07-02 23:14:38

默认情况下,中断并不是在Cortex-M上的ISRs中禁用的,而是根据N维也纳国际中心(因此是N维也纳国际中心的“嵌套”部分)中设置的优先级抢占中断。这意味着您应该像通常那样启用I2C中断,然后使用NVIC_SetPriority(IRQn, priority)设置优先级。

但是请注意,优先级编号是反向排序的,所以优先级为0将抢占优先级(比如6 )。在这种情况下,您将定时器中断优先级设置为1,而I2C中断设置为0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44862559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档