~ruther/stm32h747i-disco-usb-image-viewer

99242d8cf1d78fcece091151b4a79d4e5ad52ac1 — Rutherther 5 months ago 6e7520f
feat: toggle led on exti interrupt push button
1 files changed, 63 insertions(+), 10 deletions(-)

M src/main.c
M src/main.c => src/main.c +63 -10
@@ 1,25 1,78 @@
#include <stdint.h>
#include "stm32h747xx.h"
#include <stm32h747xx.h>
#include <core_cm7.h>

#define LED1_PIN 12
#define LED2_PIN 13

void led_toggle()
{
  GPIOI->ODR ^= (1 << LED1_PIN);
}

void led_input()
{
  GPIOI->MODER = (1 << LED1_PIN*2);
}

void led_gpio_en()
{
  RCC->AHB4ENR |= (1 << RCC_AHB4ENR_GPIOIEN_Pos);
  volatile uint32_t dummy;
  dummy = RCC->AHB4ENR;
  dummy = RCC->AHB4ENR;
}

void exti15_10_handler(void)
{
  if (EXTI->PR1 & EXTI_PR1_PR13) {
    led_toggle();
    EXTI->PR1 &= EXTI_PR1_PR13;
  }
}

void main()
{
 RCC->AHB4ENR |= (1 << RCC_AHB4ENR_GPIOIEN_Pos);
  led_gpio_en();
  led_input();
  led_toggle();

  // do two dummy reads after enabling the peripheral clock
  RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN;
  volatile uint32_t dummy;
  dummy = RCC->APB4ENR;
  dummy = RCC->APB4ENR;

  RCC->AHB4ENR |= (1 << RCC_AHB4ENR_GPIOCEN_Pos);
  dummy = RCC->AHB4ENR;
  dummy = RCC->AHB4ENR;

  GPIOI->MODER = (1 << GPIO_MODER_MODE12_Pos) | (1 << GPIO_MODER_MODE13_Pos);
  // pc13 input
  GPIOC->MODER &= ~((0x3) << (13*2));

  SYSCFG->EXTICR[3] |= (SYSCFG_EXTICR4_EXTI13_PC);
  EXTI->RTSR1 |= EXTI_RTSR1_TR13;
  EXTI->FTSR1 &= ~(EXTI_FTSR1_TR13);
  EXTI->IMR1 |= EXTI_IMR1_IM13;

  GPIOI->ODR ^= (1 << LED2_PIN);
  while(1)
  {
    GPIOI->ODR ^= (1 << LED1_PIN);
    GPIOI->ODR ^= (1 << LED2_PIN);
    for (uint32_t i = 0; i < 2000000; i++);
  NVIC_SetPriority(EXTI15_10_IRQn, 2);
  NVIC_EnableIRQ(EXTI15_10_IRQn);
  /* NVIC->IPR[EXTI15_10_IRQn] |= 2 << (8U - __NVIC_PRIO_BITS); */
  /* NVIC->ISER[(((uint32_t)EXTI15_10_IRQn) >> 5UL)] = (1 << (EXTI15_10_IRQn & 0x1FUL)); */

  __enable_irq();

  while(1) {
    int toggle = (GPIOC->IDR >> 13) & 1;

    if (toggle) {
      led_toggle();
      while(1) {}
    }
  }
  /* void* usb_otg = usb_device_init(USB_OTG_ADDR); */
  /* usb_device_setup(usb_otg); */

  /* usb_device_wait_for_handshake(usb_otg); */

  /* // do two dummy reads after enabling the peripheral clock */
}

Do not follow this link