Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * startup.c
- *
- */
- void startup(void) __attribute__((naked)) __attribute__((section (".start_section")) );
- //get ready for some defines!
- #define SYSCFG_BASE ((volatile unsigned int *) 0x40013800)
- #define SYSCFG_EXTICR1 ((volatile unsigned int *) 0x40013808)
- #define EXTI_IMR ((volatile unsigned int *) 0x40013C00)
- #define EXTI_FTSR ((volatile unsigned int *) 0x40013C0C)
- #define EXTI_RTSR ((volatile unsigned int *) 0x40013C08)
- #define EXTI_PR ((volatile unsigned int *) 0x40013C14)
- #define EXTI3_IRQVEC ((void (**) (void)) 0x2001C064)
- #define EXTI2_IRQVEC ((void (**) (void)) 0x2001C060)
- #define EXTI1_IRQVEC ((void (**) (void)) 0x2001C05C)
- #define EXTI0_IRQVEC ((void (**) (void)) 0x2001C058)
- #define NVIC_ISER0 ((volatile unsigned int *) 0xE000E100)
- #define NVIC_EXTI3_IRQ_BPOS (1<<9)
- #define NVIC_EXTI2_IRQ_BPOS (1<<8)
- #define NVIC_EXTI1_IRQ_BPOS (1<<7)
- #define NVIC_EXTI0_IRQ_BPOS (1<<6)
- #define EXTI3_IRQ_BPOS (1<<3)
- #define EXTI2_IRQ_BPOS (1<<2)
- #define EXTI1_IRQ_BPOS (1<<1)
- #define EXTI0_IRQ_BPOS (1<<0)
- void startup ( void )
- {
- __asm volatile(
- " LDR R0,=0x2001C000\n" /* set stack */
- " MOV SP,R0\n"
- " BL main\n" /* call main */
- "_exit: B .\n" /* never return */
- ) ;
- }
- typedef struct {
- union {
- struct {
- unsigned short MODER_LOW, MODER_HIGH;
- };
- unsigned int MODER;
- };
- unsigned short OTYPER;
- unsigned short reserved1;
- unsigned int OSPEEDR, PUPDR;
- union {
- unsigned short WHOLE;
- struct {
- unsigned char LOW, HIGH;
- };
- unsigned int reserved2;
- } IDR, ODR;
- } *PGPIO;
- te
- #define GPIO_D ((volatile PGPIO) 0x40020C00)
- #define GPIO_E ((volatile PGPIO) 0x40021000)
- int count = 0;
- void irq0_handler()
- {
- GPIO_E->ODR.LOW |= 1<<4;
- GPIO_E->ODR.LOW &= ~(1<<4);
- count++;
- //Kvittera avbrott från EXTI0
- *EXTI_PR |= EXTI0_IRQ_BPOS;
- }
- void irq1_handler()
- {
- GPIO_E->ODR.LOW |= 1<<5;
- GPIO_E->ODR.LOW &= ~(1<<5);
- count++;
- //Kvittera avbrott från EXTI1
- *EXTI_PR |= EXTI1_IRQ_BPOS;
- }
- void irq2_handler()
- {
- GPIO_E->ODR.LOW |= 1<<6;
- GPIO_E->ODR.LOW &= ~(1<<6);
- if(GPIO_D->ODR.HIGH){
- GPIO_D->ODR.HIGH = 0x00;
- } else {
- GPIO_D->ODR.HIGH = 0xFF;
- }
- //Kvittera avbrott från EXTI2
- *EXTI_PR |= EXTI2_IRQ_BPOS;
- }
- void init_app()
- {
- //Sätt upp PD0-7 som visningsenhet
- GPIO_D->MODER_LOW = 0x5555;
- //Sätt upp PD8-15 som diodramp
- GPIO_D->MODER = 0x55555555;
- GPIO_E->MODER_LOW = 0x5500;
- //Koppla PE3 till avbrottslina EXTI3
- *SYSCFG_EXTICR1 &= ~0x0FFF;
- *SYSCFG_EXTICR1 |= 0x0444;
- //Konfigurera EXTI2-0 för att generera avbrott
- *EXTI_IMR |= EXTI2_IRQ_BPOS;
- *EXTI_IMR |= EXTI1_IRQ_BPOS;
- *EXTI_IMR |= EXTI0_IRQ_BPOS;
- //Konfigurera för avbrott på negativ flank
- *EXTI_FTSR |= EXTI2_IRQ_BPOS;
- *EXTI_FTSR |= EXTI1_IRQ_BPOS;
- *EXTI_FTSR |= EXTI0_IRQ_BPOS;
- //inget avbrott på positiv flank;
- *EXTI_RTSR &= ~EXTI2_IRQ_BPOS;
- *EXTI_RTSR &= ~EXTI1_IRQ_BPOS;
- *EXTI_RTSR &= ~EXTI0_IRQ_BPOS;
- //Sätt upp avbrottsvektorer
- *EXTI2_IRQVEC = irq2_handler;
- *EXTI1_IRQVEC = irq1_handler;
- *EXTI0_IRQVEC = irq0_handler;
- //Konfigurera de bitar i NVIC som kontrollerar den avbrottslina som EXTI2-0 kopplats till.
- *NVIC_ISER0 |= NVIC_EXTI2_IRQ_BPOS;
- *NVIC_ISER0 |= NVIC_EXTI1_IRQ_BPOS;
- *NVIC_ISER0 |= NVIC_EXTI0_IRQ_BPOS;
- }
- void main(void)
- {
- init_app();
- while(1){
- GPIO_D->ODR.LOW = count;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement