Does anyone have a libopencm3 based example, against the STM32 F2, 
that illustrates ISR's invoking based on timers?

        I did try using a couple of the examples (see timer.c) in the F1 
directory to no avail; I've got a few attempts at it, and it looks like 
(guessing, didn't hook up a debugger yet) the ISR is just not being 
called.

        This is just the bare STM32F205RE sitting in a breadboard, with a 
crystal and some caps. (No dev/eval board.)

        // set to 120MHz - success
        rcc_clock_setup_hse_3v3 ( &hse_8mhz_3v3 [ CLOCK_3V3_120MHZ ] );

        The good bits .. mostly ripped from examples :)

static void nvic_setup(void) {
   nvic_enable_irq(NVIC_TIM2_IRQ);
   nvic_set_priority(NVIC_TIM2_IRQ, 1);
}

static void timer2_setup ( void ) {

   /* Enable TIM2 clock. */
   rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_TIM2EN);

   /* Set timer start value. */
   TIM_CNT(TIM2) = 1;

   /* Set timer prescaler. 72MHz/1440 => 50000 counts per second. */
   TIM_PSC(TIM2) = 2000; // 120M/2000 = 60k/second

   /* End timer value. If this is reached an interrupt is generated. */
   TIM_ARR(TIM2) = 60000;

   /* Update interrupt enable. */
   TIM_DIER(TIM2) |= TIM_DIER_UIE;

   /* Start timer. */
   TIM_CR1(TIM2) |= TIM_CR1_CEN;

#endif

   return;
}

void tim2_isr ( void ) {

   GPIO_ODR(GPIOC) ^= GPIO3; // GPIO stuff works fine, outside of the ISR

   TIM2_SR &= ~TIM_SR_UIF;    //clearing update interrupt flag
   //TIM_SR(TIM2) &= ~TIM_SR_UIF; /* Clear interrrupt flag. */
}

.. and the relevent bits of main:

#if 1
   //__enable_irq();
   cm_enable_interrupts();

   gpio_setup();
   gpio_set ( GPIOC, GPIO3 );

   nvic_setup();

   timer2_setup();

   while ( 1 ) {
     __asm__("nop");
   } // while forever
#endif

        Now, on the other hand, the code below works -- not using an ISR, 
just polling things:

        polling timer setup:
#if 0 // simple manual setup
   rcc_peripheral_enable_clock ( &RCC_APB1ENR, RCC_APB1ENR_TIM2EN );

   // 120,000,000 / 1000 == 120,000
   TIM2_CR1 |= TIM_CR1_CEN;
   TIM2_PSC = 1000;     //setting prescaler to 1000
   TIM2_ARR = 60000;    //auto reload value adjusted for 1 second
#endif

        polling timer check:
#if 0
   gpio_setup();
   gpio_set ( GPIOC, GPIO3 );

   timer2_setup();

   while ( 1 ) {

     while (!(TIM2_SR & (TIM_SR_UIF))) ;    //polling for update interrupt 
flag

     TIM2_SR &= ~TIM_SR_UIF;    //clearing update interrupt flag

     GPIO_ODR(GPIOC) ^= GPIO3;

   } // while forever
#endif

        So much of the code is working fine, but I'm obviously missing 
something to enable the ISR itself :)

        Any tips?

                jeff


--
If everyone would put barbecue sauce on their food, there would be no war.

------------------------------------------------------------------------------
CenturyLink Cloud: The Leader in Enterprise Cloud Services.
Learn Why More Businesses Are Choosing CenturyLink Cloud For
Critical Workloads, Development Environments & Everything In Between.
Get a Quote or Start a Free Trial Today. 
http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk
_______________________________________________
libopencm3-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libopencm3-devel

Reply via email to