我正在为一个基于nRF52的董事会编写一个程序,使用Redbear库。有效地把我的董事会当作一个BLE纳米2。
我有一个计时器,每x毫秒计时一次,例如50毫秒。
在这个计时器中,我希望从I2C传感器读取数据,并将读取添加到缓冲区中。
我知道,默认情况下,在计时器ISR中,中断是禁用的。我想知道如何简单地重新启用I2C中断,并让传感器读取,然后再禁用中断。
传感器读数之间的间隔非常重要,我不想仅仅在计时器ISR中设置一个标志,因为我不知道要多久才能检查该标志。
请有人告诉我如何在一个计时器ISR中简短地启用I2C中断?
我试验过:
__disable_irq();
__enable_irq();
NVIC_EnableIRQ(SPI0_TWI0_IRQn);
NRF_TWI0->INTENSET = 1;没有joy有任何这些,我知道他们中的一些只在软件的某些地方工作,所以在ISR中不能正常工作。
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);
}发布于 2017-07-02 23:14:38
默认情况下,中断并不是在Cortex-M上的ISRs中禁用的,而是根据N维也纳国际中心(因此是N维也纳国际中心的“嵌套”部分)中设置的优先级抢占中断。这意味着您应该像通常那样启用I2C中断,然后使用NVIC_SetPriority(IRQn, priority)设置优先级。
但是请注意,优先级编号是反向排序的,所以优先级为0将抢占优先级(比如6 )。在这种情况下,您将定时器中断优先级设置为1,而I2C中断设置为0。
https://stackoverflow.com/questions/44862559
复制相似问题