static void usb_setup(void) { /* Enable clocks for GPIO port A (for GPIO_USART2_TX) and USART2. */ rcc_usb_prescale_1(); rcc_periph_clock_enable(RCC_USB); rcc_periph_clock_enable(RCC_GPIOA); /* Setup GPIO pin GPIO_USART2_TX/GPIO9 on GPIO port A for transmit. */ gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO11 | GPIO12); gpio_set_af(GPIOA, GPIO_AF14, GPIO11| GPIO12); }
int main() { rcc_clock_setup_hsi(&hsi_8mhz[CLOCK_48MHZ]); rcc_usb_prescale_1(); rcc_peripheral_reset(&RCC_APB1RSTR, RCC_APB1RSTR_USBRST); rcc_peripheral_reset(&RCC_AHBRSTR, RCC_AHBRSTR_IOPARST); rcc_peripheral_clear_reset(&RCC_APB1RSTR, RCC_APB1RSTR_USBRST); rcc_peripheral_clear_reset(&RCC_AHBRSTR, RCC_AHBRSTR_IOPARST); rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USBEN); rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_IOPAEN); gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO11 | GPIO12); gpio_clear(GPIOA, GPIO11 | GPIO12); for (int i = 0; i < 0x800000; i++) __asm__ volatile("nop"); gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO11 | GPIO12); gpio_set_af(GPIOA, GPIO_AF14, GPIO11| GPIO12); arm_bootloader::Dest dest = arm_bootloader::get_unique_dest(); char serial[10] = {0}; { uint32_t x = dest; char hex[] = "0123456789abcdef"; for(int i = 0; i < 8; i++) { serial[7-i] = hex[x & 0xF]; x = x >> 4; } } /* Buffer to be used for control requests. */ uint8_t usbd_control_buffer[128]; char const *usb_strings[] = { "uf-mil", "subbus", serial, }; usbd_device * usbd_dev = usbd_init(&stm32f103_usb_driver, &uf_subbus_protocol::usb::dev, &uf_subbus_protocol::usb::config, usb_strings, 3, usbd_control_buffer, sizeof(usbd_control_buffer)); usbd_register_set_config_callback(usbd_dev, cdcacm_set_config); uf_subbus_protocol::usb::Sink sink(usbd_dev); arm_bootloader::Handler handler( sink, dest, 2048); handlerp = &handler; while (1) usbd_poll(usbd_dev); }
/** * Setup clocks to run from PLL. * The arguments provide the pll source, multipliers, dividers, all that's * needed to establish a system clock. * @param clock clock information structure */ void rcc_clock_setup_pll(const struct rcc_clock_scale *clock) { if (clock->pllsrc == RCC_CFGR_PLLSRC_HSE_PREDIV) { rcc_osc_on(RCC_HSE); rcc_wait_for_osc_ready(RCC_HSE); } else { rcc_osc_on(RCC_HSI); rcc_wait_for_osc_ready(RCC_HSI); } rcc_osc_off(RCC_PLL); rcc_usb_prescale_1_5(); if (clock->usbdiv1) { rcc_usb_prescale_1(); } rcc_wait_for_osc_not_ready(RCC_PLL); rcc_set_pll_source(clock->pllsrc); rcc_set_pll_multiplier(clock->pllmul); rcc_set_prediv(clock->plldiv); /* Enable PLL oscillator and wait for it to stabilize. */ rcc_osc_on(RCC_PLL); rcc_wait_for_osc_ready(RCC_PLL); /* Configure flash settings. */ flash_prefetch_enable(); flash_set_ws(clock->flash_waitstates); rcc_set_hpre(clock->hpre); rcc_set_ppre2(clock->ppre2); rcc_set_ppre1(clock->ppre1); /* Select PLL as SYSCLK source. */ rcc_set_sysclk_source(RCC_CFGR_SW_PLL); /* Wait for PLL clock to be selected. */ rcc_wait_for_sysclk_status(RCC_PLL); /* Set the peripheral clock frequencies used. */ rcc_ahb_frequency = clock->ahb_frequency; rcc_apb1_frequency = clock->apb1_frequency; rcc_apb2_frequency = clock->apb2_frequency; }