139 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**************************************************************************/
 | |
| /*!
 | |
|  @file    board_metro_m4_express.c
 | |
|  @author  hathach (tinyusb.org)
 | |
| 
 | |
|  @section LICENSE
 | |
| 
 | |
|  Software License Agreement (BSD License)
 | |
| 
 | |
|  Copyright (c) 2018, hathach (tinyusb.org)
 | |
|  All rights reserved.
 | |
| 
 | |
|  Redistribution and use in source and binary forms, with or without
 | |
|  modification, are permitted provided that the following conditions are met:
 | |
|  1. Redistributions of source code must retain the above copyright
 | |
|  notice, this list of conditions and the following disclaimer.
 | |
|  2. Redistributions in binary form must reproduce the above copyright
 | |
|  notice, this list of conditions and the following disclaimer in the
 | |
|  documentation and/or other materials provided with the distribution.
 | |
|  3. Neither the name of the copyright holders nor the
 | |
|  names of its contributors may be used to endorse or promote products
 | |
|  derived from this software without specific prior written permission.
 | |
| 
 | |
|  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
 | |
|  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | |
|  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | |
|  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
 | |
|  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | |
|  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | |
|  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 | |
|  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
|  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | |
|  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| 
 | |
|  This file is part of the tinyusb stack.
 | |
| */
 | |
| /**************************************************************************/
 | |
| 
 | |
| #include "bsp/board.h"
 | |
| 
 | |
| #include "stm32f4xx.h"
 | |
| 
 | |
| #include "tusb_option.h"
 | |
| 
 | |
| //--------------------------------------------------------------------+
 | |
| // MACRO TYPEDEF CONSTANT ENUM DECLARATION
 | |
| //--------------------------------------------------------------------+
 | |
| void board_init(void)
 | |
| {
 | |
|   // Init the LED on PD14
 | |
|   RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
 | |
|   GPIOD->MODER |= GPIO_MODER_MODE14_0;
 | |
| 
 | |
|   // USB Clock init
 | |
|   // PLL input- 8 MHz (External oscillator clock; HSI clock tolerance isn't
 | |
|   // tight enough- 1%, need 0.25%)
 | |
|   // VCO input- 1 to 2 MHz (2 MHz, M = 4)
 | |
|   // VCO output- 100 to 432 MHz (144 MHz, N = 72)
 | |
|   // Main PLL out- <= 180 MHz (18 MHz, P = 3- divides by 8)
 | |
|   // USB PLL out- 48 MHz (Q = 3)
 | |
|   RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE | (3 << RCC_PLLCFGR_PLLQ_Pos) | \
 | |
|     (3 << RCC_PLLCFGR_PLLP_Pos) | (72 << RCC_PLLCFGR_PLLN_Pos) | \
 | |
|     (4 << RCC_PLLCFGR_PLLM_Pos);
 | |
| 
 | |
|   // Wait for external clock to become ready
 | |
|   RCC->CR |= RCC_CR_HSEON;
 | |
|   while(!(RCC->CR & RCC_CR_HSERDY_Msk));
 | |
| 
 | |
|   // Wait for PLL to become ready
 | |
|   RCC->CR |= RCC_CR_PLLON;
 | |
|   while(!(RCC->CR & RCC_CR_PLLRDY_Msk));
 | |
| 
 | |
|   // Switch clocks!
 | |
|   RCC->CFGR |= RCC_CFGR_SW_1;
 | |
| 
 | |
|   // Notify runtime of frequency change.
 | |
|   SystemCoreClockUpdate();
 | |
|   // Systick init
 | |
|   #if CFG_TUSB_OS  == OPT_OS_NONE
 | |
|     SysTick_Config(SystemCoreClock / 1000);
 | |
|   #endif
 | |
| 
 | |
|   RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
 | |
| 
 | |
|   // USB Pin Init
 | |
|   // PA9- VUSB, PA10- ID, PA11- DM, PA12- DP
 | |
|   // PC0- Power on
 | |
|   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
 | |
|   GPIOA->MODER |= GPIO_MODER_MODE9_1 | GPIO_MODER_MODE10_1 | \
 | |
|     GPIO_MODER_MODE11_1 | GPIO_MODER_MODE12_1;
 | |
|   GPIOA->AFR[1] |= (10 << GPIO_AFRH_AFSEL9_Pos) | \
 | |
|     (10 << GPIO_AFRH_AFSEL10_Pos) | (10 << GPIO_AFRH_AFSEL11_Pos) | \
 | |
|     (10 << GPIO_AFRH_AFSEL12_Pos);
 | |
| 
 | |
|   // Pullup required on ID, despite the manual claiming there's an
 | |
|   // internal pullup already (page 1245, Rev 17)
 | |
|   GPIOA->PUPDR |= GPIO_PUPDR_PUPD10_0;
 | |
| }
 | |
| 
 | |
| 
 | |
| void board_led_control(bool state)
 | |
| {
 | |
|   if (!state) {
 | |
|     GPIOD->BSRR = GPIO_BSRR_BR14;
 | |
|   } else {
 | |
|     GPIOD->BSRR = GPIO_BSRR_BS14;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| /*------------------------------------------------------------------*/
 | |
| /* TUSB HAL MILLISECOND
 | |
|  *------------------------------------------------------------------*/
 | |
| #if CFG_TUSB_OS  == OPT_OS_NONE
 | |
| volatile uint32_t system_ticks = 0;
 | |
| 
 | |
| void SysTick_Handler (void)
 | |
| {
 | |
|   system_ticks++;
 | |
| }
 | |
| 
 | |
| uint32_t tusb_hal_millis(void)
 | |
| {
 | |
|   return board_tick2ms(system_ticks);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| void HardFault_Handler (void)
 | |
| {
 | |
|   asm("bkpt");
 | |
| }
 | |
| 
 | |
| // Required by __libc_init_array in startup code if we are compiling using
 | |
| // -nostdlib/-nostartfiles.
 | |
| void _init(void)
 | |
| {
 | |
| 
 | |
| }
 | 
