#include "stm32f10x.h" /****** project hardware ******/ #define PCOUT GPIOC->ODR // for output LEDs PC8 PC9 #define PAIN GPIOA->IDR // for input push button PA0 #define PADDR_HIGH GPIOA->CRH #define PADDR_LOW GPIOA->CRL #define PBDDR_HIGH GPIOB->CRH #define PBDDR_LOW GPIOB->CRL #define PCDDR_HIGH GPIOC->CRH #define PCDDR_LOW GPIOC->CRL #define LED 8 // port C, bit 8 #define LED2 9 inline void gpio_set(int bitPosition, int value) { if (value) PCOUT |= (1<PR |= 1; // ack both } /** newEvent * add the event to the event queue * wrapped in critical section * * @param the event */ void newEvent(char e) { static unsigned char nextEvent; if (events[nextEvent]) return; dint(); // critical section events[nextEvent++] = e; if (nextEvent==NUM_EVENTS) nextEvent = 0; eint(); } /***** init ******/ /* called by newlib startup */ void _init(void) { // startup code // turn on all the GPIO's RCC->APB2ENR = 0x74A3D; // enable the GPIO devices and timers RCC -> APB1ENR = 0x1ff; // enable timers 2-14 AFIO -> MAPR |= 0x02008C00; // remap osc to PD0/1 and tim3 to PB4/5/0/1 PADDR_HIGH = 0x44444444; // PortA all inputs PCDDR_HIGH = 0x11111111; // PortC all outputs // keep the clocking system simple: just use the 8MHz HSI everywhere SysTick->LOAD = 10000; // 10 msec SysTick->Val = 0; SysTick->CTRL = 3; // count at 1usec, use interrupts /* configure the blue button on the discovery module, PA0 */ EXTI->IMR |= 1; // enable interrupt from line 0 EXTI->RTSR |= 1; // interrupt on rising edge AFIO->EXTICR[0] |= 0x0; // select port A /* enable all interrupt sources */ NVIC->ISER[0] = 0xFFFFFFFF; // enable in NVIC NVIC->ISER[1] = 0x00FFFFFF; // enable in NVIC gpio_set(9,0); gpio_set(8,0); } void main(void) { eint(); while(1) { int j; for (j=0; j TIMER_LIMIT) { gpio_set(LED, 0); rtbState = RTB_IDLE; rtbTimerCount = 0; } } break; } } #define LED_OFF 0 #define LED_ON 1 #define LED_ON_TIME 150 #define LED_OFF_TIME 50 static int ledState = LED_OFF; static int ledTimerCount = 0; void ledTask(char evt) { switch(ledState) { case LED_OFF: if (evt == EVT_TICK) { if (++ledTimerCount > LED_OFF_TIME) { gpio_set(LED2, LED_ON); ledTimerCount = 0; ledState = LED_ON; } } break; case LED_ON: if (evt == EVT_TICK) { if (++ledTimerCount > LED_ON_TIME) { gpio_set(LED2, LED_OFF); ledTimerCount = 0; ledState = LED_OFF; } } break; } } /* vector table */ #define STACK_TOP 0x20002000 void default_isr(void) {} extern void _start(void); void (*myvectors[])(void) __attribute__ ((section(".vectors")))= { (void(*)(void)) STACK_TOP, // stack pointer _start, // code entry point default_isr, // handle non-maskable interrupts default_isr, // handle hard faults 0,0,0,0, /* 10...1f */ 0,0,0,0, /* 20...2f */ 0,0,0,timer_isr, /* 30...3f */ 0,0,0,0, /* 40...4f */ 0,0,button_isr,0, /* 50...5f */ 0,0,0,0, /* 60...6f */ 0,0,0,0, /* 70...7f */ 0,0,0,0, /* 80...8f */ 0,0,0,0, /* 90...9f */ 0,0,0,0, /* a0...af */ 0,0,0,0, /* b0...bf */ 0,0,0,0, /* c0...cf */ 0,0,0,0, /* d0...df */ 0,0,0,0, /* e0...ef */ 0,0,0,0, /* f0...ff */ 0,0,0,0, /* 100.10f */ 0,0,0,0 /* 110.11f */ };