123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #include "stm32f10x.h"
- #define PCOUT GPIOC->ODR
- #define PAIN GPIOA->IDR
- #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
- #define LED2 9
- inline void gpio_set(int bitPosition, int value) {
- if (value)
- PCOUT |= (1<<bitPosition);
- else
- PCOUT &= ~(1<<bitPosition);
- }
- void newEvent(char e);
- #define NUM_EVENTS 10
- volatile char events[NUM_EVENTS];
- #define EVT_NONE 0
- #define EVT_TICK 1
- #define EVT_BUTTON 2
- void ledTask(char evt);
- void respondToButtonTask(char evt);
- volatile int tick;
-
- #define eint() asm volatile("cpsie i")
- #define dint() asm volatile("cpsid i")
- void timer_isr(void) {
- tick++;
- newEvent(EVT_TICK);
-
- }
- void button_isr(void) {
- newEvent(EVT_BUTTON);
- EXTI->PR |= 1;
- }
- void newEvent(char e) {
- static unsigned char nextEvent;
- if (events[nextEvent])
- return;
- dint();
- events[nextEvent++] = e;
- if (nextEvent==NUM_EVENTS)
- nextEvent = 0;
- eint();
- }
- void _init(void) {
-
-
- RCC->APB2ENR = 0x74A3D;
- RCC -> APB1ENR = 0x1ff;
- AFIO -> MAPR |= 0x02008C00;
- PADDR_HIGH = 0x44444444;
- PCDDR_HIGH = 0x11111111;
-
- SysTick->LOAD = 10000;
- SysTick->Val = 0;
- SysTick->CTRL = 3;
-
-
- EXTI->IMR |= 1;
- EXTI->RTSR |= 1;
- AFIO->EXTICR[0] |= 0x0;
-
- NVIC->ISER[0] = 0xFFFFFFFF;
- NVIC->ISER[1] = 0x00FFFFFF;
- gpio_set(9,0);
- gpio_set(8,0);
-
- }
- void main(void) {
- eint();
- while(1) {
- int j;
- for (j=0; j<NUM_EVENTS; j++) {
- while (events[j]==EVT_NONE)
- {}
- ledTask(events[j]);
- respondToButtonTask(events[j]);
- events[j] = EVT_NONE;
- }
- }
- }
- #define RTB_IDLE 0
- #define RTB_ON 1
- #define TIMER_LIMIT 150
- static int rtbState = RTB_IDLE;
- static int rtbTimerCount = 0;
- void respondToButtonTask(char evt) {
- switch(rtbState) {
- case RTB_IDLE:
- if (evt == EVT_BUTTON) {
- rtbState = RTB_ON;
- gpio_set(LED, 1);
- }
- break;
- case RTB_ON:
- if (evt == EVT_TICK) {
- if (++rtbTimerCount > 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;
- }
- }
- #define STACK_TOP 0x20002000
- void default_isr(void) {}
- extern void _start(void);
- void (*myvectors[])(void) __attribute__ ((section(".vectors")))= {
- (void(*)(void)) STACK_TOP,
- _start,
- default_isr,
- default_isr,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,timer_isr,
- 0,0,0,0,
- 0,0,button_isr,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0,
- 0,0,0,0
- };
|