mi programa incluye temporizadores (timer0 para llamar a un ISR periódicamente, timer3 para medir el tiempo de ejecución), spi para leer (sin DMA) y fatfs.
Llamo a una función cada 250 µs periódicamente usando timer0, esta función lee datos y los coloca en buffer1, mientras almacena buffer2 en una memoria USB externa (en main ()) usando fatfs. Una vez que se llena el buffer1 y se almacena el buffer2, los revertimos (doble búfer).
Los datos se leen y almacenan bien. el problema es que quiero un período de 250us, pero tengo 500us). Parece que una interrupción se pierde, la siguiente interrupción se maneja, la siguiente se pierde, la siguiente se maneja, la siguiente ... Pero si es realmente un conflicto de interrupciones del temporizador0 / fatfs, de dónde vino y cómo resolverlo ?!
Hice systick_irq (es decir, maneja la interrupción de escritura en usb) con una prioridad más baja que timer0 y viceversa, pero aún así el período doble. Supongo que el fatfs está bloqueando la interrupción de los temporizadores, pero debería existir una manera de lidiar con esto.
#include ...
Timer t; //we use timer class, based on timer3, to mesure execution time.
void my_periodic_func(void) { //18us execution time for each call
{
begin=t.read();
//my_periodic_func_code
end=t.read();
period=end-begin;
//save 'period' value for execution time and 'begin' for calls instant
}
int main(void){
//init code
fp = fopen( ... , "wb");
t.start();
//timer0 configuration
LPC_SC->PCONP |= 1<<1;
LPC_TIM0->MR0 = 5995; // Match count for 250us, timer0 is 24mhz
LPC_TIM0->MCR = 3; // Interrupt and Reset on Match
LPC_TIM0->TCR = 1; // Enable Timer0
NVIC_SetVector(TIMER0_IRQn,(uint32_t)&my_periodic_func);
NVIC_EnableIRQ(TIMER0_IRQn);
//storing loop
while (1){
//store
}
}
Hace un tiempo que estuve intentando resolver este problema y ahora busco tus ideas, gracias.