\ 100 uS Systick by T. Porter \ For a STM32 Discovery board running Mecrisp-Stellaris \ Overclocked to 96 MHz using the crystal derived 8 MHz MCO clock from the SWD programmer. GPIOA_8 may be \ monitored to confirm the overclock is working. Look for 48MHz (1/2 clock) on this pin. \ A marker pulse on GPIOB_2 is generated every Systick for external measurement. Period = 100us, Width = 800 nS \ Flashes the BLUE LED (on GPIOC_8) at a rate of 1 second \ Overclock the default system clock from 8Mhz RC clock to 96 MHz Xtal clock via PLL : 96mhz \ Set flash wait states to 2, the flash can't run faster than 35MHz ? ) FLASH_ACR @ %1111 bic 2 or FLASH_ACR ! \ Enable HSE oscillator 1 16 lshift RCC_CR bis! BEGIN RCC_CR @ not 1 17 lshift and 0 = UNTIL \ Set PLL multiplication factor to 12, clock is 8Mhz MCO system clock from the SWD programmer. %1010 18 lshift \ input x12 = 96 Mhz $10000 or \ PLL SRC = HSE undivided RCC_CFGR ! \ Enable PLL 1 24 lshift RCC_CR bis! \ Wait for PLL to stabilise BEGIN RCC_CR @ not 1 25 lshift and 0 = UNTIL \ Switch to HSE, set APB1 and APB2 RCC_CFGR @ %11 bic %10 or %100 11 lshift or \ APB2CLK = HCLK %100 8 lshift or \ APB1CLK = half HCLK RCC_CFGR ! \ Wait for clock source to stabilize BEGIN RCC_CFGR @ 2 rshift 3 and %10 = UNTIL \ Update the Baud Rate Register so the serial comms is still 115200 baud. 416 USART1_BRR ! ( for 96 Mhz ) \ Optional monitor the MCO frequency on GPIOA_8 with a scope or frequency counter. It will be half the 96 Mhz clock frequency %10 16 lshift GPIOA_MODER bis! \ GPIOA_MODER8 SF1 %111 24 lshift RCC_CFGR bis! \ MCO: Microcontroller clock output: 111: PLL clock selected %11 16 lshift GPIOA_OSPEEDR bis! \ GPIOA_OSPEEDR8 hi speed ; \ Systick, note marker pulse is on GPIOB_2 $E000E010 CONSTANT STK_CSR \ SysTick control and status register. R/W reset value = $00000000 $E000E014 CONSTANT STK_RVR \ SysTick reload value register. R/W reset value = 6000 (6MHz clock) for the STM32F0 $E000E018 CONSTANT STK_CVR \ SysTick current value register. R/W value unknown $E000E01C CONSTANT STK_CALIB \ SysTick calibration value register. Read Only, $40001770 for the STM32F0 0 variable counter %01 4 lshift GPIOB_MODER bis! \ GPIOB_MODER2 set to push pull output for the Marker %01 8 2* lshift GPIOC_MODER bis! \ GPIOC_8 as output for F0 Disco blue LED : marker-set %1 2 lshift GPIOB_BSRR bis! \ GPIOB_BS2 set PB2 = 1 ; : marker-clear %1 18 lshift GPIOB_BSRR bis! \ GPIOB_BR2 clear PB2 ; : toggle-led GPIOC_ODR @ 1 8 lshift xor GPIOC_ODR ! ; : systick-calib-freq 9600 ; : systick-enable %101 STK_CSR bis! ; : systick-disable %101 STK_CSR bic! ; : systick-enable-irq %010 STK_CSR bis! ; : systick-disable-irq %010 STK_CSR bic! ; : systick-read STK_CVR @ ; systick-calib-freq STK_RVR ! systick-enable : systick-handler marker-set counter @ 1+ \ add one to the counter dup 10000 >= if \ If counter is > = 10,000 ... toggle-led \ blink the LED at 1s rate drop \ drop the counter value of 10,000 from the stack 0 \ put 0 on the stack to load in the counter after the 'then' then counter ! \ reset the counter to zero marker-clear ; ' systick-handler irq-systick ! systick-enable-irq 96mhz \ Overclock