#include <stdint.h>
#include <stm32h747xx.h>
#include <core_cm7.h>
#include <stdlib.h>
#include "delay.h"
#include "usb_device.h"
#include "usb_device_cdc.h"
#include "clocks.h"
#include "exti.h"
#include "registers.h"
#include "pin.h"
#define LED1_GPIO GPIOI
#define LED1_PIN 12
/* #define LED2_PIN 13 */
void hard_fault_handler() {
while(1) {}
}
void usage_fault_handler() {
while(1) {}
}
void nmi_handler() {
while(1) {}
}
void bus_fault_handler() {
while(1) {}
}
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()
{
systick_configure();
// Clocks section
// Enable hsi48 for usb
RCC->CR |= RCC_CR_HSI48ON;
while ((RCC->CR & RCC_CR_HSI48RDY) == 0);
// TODO: pll, system clock switch... too complicated it seems.
// Getting hard faults, apparently because of too low voltage
// Has to be enabled before vco can be changed
/* PWR->CR3 |= PWR_CR3_LDOEN; */
/* PWR->CR3 &= ~PWR_CR3_LDOEN; */
/* reg_write_bits_pos(&PWR->D3CR, 2, PWR_D3CR_VOS_Pos, 3); */
/* /\* SYSCFG->PWRCR |= SYSCFG_PWRCR_ODEN; *\/ */
/* while((PWR->CSR1 & PWR_CSR1_ACTVOSRDY) == 0); */
/* /\* while((PWR->D3CR & PWR_D3CR_VOSRDY) == 0); *\/ */
/* reg_write_bits(&FLASH->ACR, FLASH_ACR_LATENCY_3WS, FLASH_ACR_LATENCY_Msk); */
/* // HSI is 64 MHz, not divided */
/* // Diving by 32 to put to PLL -> 2 MHz */
/* // DIVN = 360 -> F_VCO = 720 MHz */
/* // DIVP = 2 -> pll1_p is 360 MHz */
/* // DIVQ = 8 -> pll1_q is 90 MHz */
/* // DIVR = 8 -> pll1_r is 90 MHz */
/* clocks_pll_configure(CLOCK_PLL1, 32, PLL_SOURCE_HSI, */
/* 360, 2, 8, 8); */
/* clocks_pll_enable(CLOCK_PLL1); */
/* clocks_pll_wait_ready(CLOCK_PLL1, 300); */
/* clocks_system_clock_source(CLOCK_SOURCE_PLL_1_P_CK, */
/* 1, 1, 2, 300); */
// Clock gating
RCC->APB4ENR |= RCC_APB4ENR_SYSCFGEN;
volatile uint32_t dummy;
dummy = RCC->APB4ENR;
dummy = RCC->APB4ENR;
RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN | RCC_AHB4ENR_GPIOBEN | RCC_AHB4ENR_GPIOCEN | RCC_AHB4ENR_GPIOHEN | RCC_AHB4ENR_GPIOIEN | RCC_AHB4ENR_GPIOJEN;
dummy = RCC->AHB4ENR;
dummy = RCC->AHB4ENR;
// Pins init
pin_t* led1 = pin_init(LED1_GPIO, LED1_PIN);
pin_into_output_pushpull(led1);
pin_toggle(led1);
pin_toggle(led1);
// pc13 input - wakeup button
pin_t* wkup = pin_init(GPIOC, 13);
pin_into_input(wkup);
exti_t* exti = exti_init(EXTI, SYSCFG);
// exti13 pc
exti_external_interrupt(exti, 13, 2);
exti_rising_interrupt(exti, 13);
exti_nvic_setup(exti, 13);
/* NVIC_SetPriority(EXTI15_10_IRQn, 2); */
/* NVIC_EnableIRQ(EXTI15_10_IRQn); */
__enable_irq();
// TODO: ULPI inputs to alternate mode...
pin_t* ulpi_ck = pin_init(GPIOA, 5);
pin_t* ulpi_stp = pin_init(GPIOC, 0);
pin_t* ulpi_dir = pin_init(GPIOI, 11);
pin_t* ulpi_nxt = pin_init(GPIOH, 4);
pin_t* ulpi_d0 = pin_init(GPIOA, 3);
pin_t* ulpi_d1 = pin_init(GPIOB, 0);
pin_t* ulpi_d2 = pin_init(GPIOB, 1);
pin_t* ulpi_d3 = pin_init(GPIOB, 10);
pin_t* ulpi_d4 = pin_init(GPIOB, 11);
pin_t* ulpi_d5 = pin_init(GPIOB, 12);
pin_t* ulpi_d6 = pin_init(GPIOB, 13);
pin_t* ulpi_d7 = pin_init(GPIOB, 5);
pin_t* otg_hs_overcurrent = pin_init(GPIOJ, 1);
pin_into_alternate_highspeed(ulpi_ck, 10);
pin_into_alternate_highspeed(ulpi_stp, 10);
pin_into_alternate_highspeed(ulpi_dir, 10);
pin_into_alternate_highspeed(ulpi_nxt, 10);
pin_into_alternate_highspeed(ulpi_d0, 10);
pin_into_alternate_highspeed(ulpi_d1, 10);
pin_into_alternate_highspeed(ulpi_d2, 10);
pin_into_alternate_highspeed(ulpi_d3, 10);
pin_into_alternate_highspeed(ulpi_d4, 10);
pin_into_alternate_highspeed(ulpi_d5, 10);
pin_into_alternate_highspeed(ulpi_d6, 10);
pin_into_alternate_highspeed(ulpi_d7, 10);
// TODO: ?
pin_into_input_highspeed(otg_hs_overcurrent);
void *usb_dev = usb_device_init(USB_OTG_HS1, &USB_CLASS_CDC_ACM,
0x1234, 0x1111, "Frantisek Bohacek",
"Display", 1, NULL);
usb_device_cdc_acm_configure(usb_dev);
usb_device_setup(usb_dev);
usb_device_wait_for_handshake(usb_dev);
while(1) {}
}