122 lines
3 KiB
C
122 lines
3 KiB
C
|
|
#include <stm32f0xx.h>
|
|
#include <stdint.h>
|
|
#include <system_stm32f0xx.h>
|
|
#include <stm32f0xx_ll_utils.h>
|
|
#include <stm32f0xx_ll_spi.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
/*
|
|
* Part number: STM32F030F4C6
|
|
*/
|
|
|
|
void tick(void) {
|
|
for(int i=0; i<50; i++)
|
|
__asm__("nop");
|
|
}
|
|
|
|
void spi_send(int data) {
|
|
SPI1->DR = data;
|
|
while (SPI1->SR & SPI_SR_BSY);
|
|
}
|
|
|
|
void strobe_aux(void) {
|
|
GPIOA->BSRR = GPIO_BSRR_BS_10;
|
|
tick();
|
|
GPIOA->BSRR = GPIO_BSRR_BR_10;
|
|
}
|
|
|
|
void strobe_leds(void) {
|
|
GPIOA->BSRR = GPIO_BSRR_BS_9;
|
|
tick();
|
|
GPIOA->BSRR = GPIO_BSRR_BR_9;
|
|
}
|
|
|
|
int main(void) {
|
|
RCC->CR |= RCC_CR_HSEON;
|
|
while (!(RCC->CR&RCC_CR_HSERDY));
|
|
RCC->CFGR &= ~RCC_CFGR_PLLMUL_Msk & ~RCC_CFGR_SW_Msk;
|
|
RCC->CFGR |= (2<<RCC_CFGR_PLLMUL_Pos) | RCC_CFGR_PLLSRC_HSE_PREDIV; /* PLL x4 */
|
|
RCC->CFGR2 &= ~RCC_CFGR2_PREDIV_Msk;
|
|
RCC->CFGR2 |= RCC_CFGR2_PREDIV_DIV2;
|
|
RCC->CR |= RCC_CR_PLLON;
|
|
while (!(RCC->CR&RCC_CR_PLLRDY));
|
|
RCC->CFGR |= (2<<RCC_CFGR_SW_Pos);
|
|
SystemCoreClockUpdate();
|
|
|
|
LL_Init1msTick(SystemCoreClock);
|
|
|
|
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
|
|
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
|
|
|
|
GPIOA->MODER |=
|
|
(2<<GPIO_MODER_MODER5_Pos) /* PA5 - SCLK */
|
|
| (1<<GPIO_MODER_MODER6_Pos) /* PA6 - LED !OE */
|
|
| (2<<GPIO_MODER_MODER7_Pos) /* PA7 - MOSI */
|
|
| (1<<GPIO_MODER_MODER9_Pos) /* PA9 - LED strobe */
|
|
| (1<<GPIO_MODER_MODER10_Pos);/* PA10 - Auxiliary strobe */
|
|
|
|
/* Set shift register IO GPIO output speed */
|
|
GPIOA->OSPEEDR |=
|
|
(2<<GPIO_OSPEEDR_OSPEEDR5_Pos) /* SCLK FIXME maybe try 0x2 here? */
|
|
| (2<<GPIO_OSPEEDR_OSPEEDR6_Pos) /* LED !OE */
|
|
| (2<<GPIO_OSPEEDR_OSPEEDR7_Pos) /* MOSI */
|
|
| (2<<GPIO_OSPEEDR_OSPEEDR9_Pos) /* LED strobe */
|
|
| (2<<GPIO_OSPEEDR_OSPEEDR10_Pos); /* Auxiliary strobe */
|
|
|
|
GPIOA->AFR[0] |=
|
|
(0<<GPIO_AFRL_AFRL5_Pos) /* SPI1_SCK */
|
|
| (0<<GPIO_AFRL_AFRL7_Pos); /* SPI1_MOSI */
|
|
|
|
/* Configure SPI controller */
|
|
SPI1->I2SCFGR = 0;
|
|
SPI1->CR2 &= ~SPI_CR2_DS_Msk;
|
|
SPI1->CR2 &= ~SPI_CR2_DS_Msk;
|
|
SPI1->CR2 |= LL_SPI_DATAWIDTH_16BIT;
|
|
/* FIXME maybe try w/o BIDI */
|
|
SPI1->CR1 = SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_SPE | (1<<SPI_CR1_BR_Pos) | SPI_CR1_MSTR | SPI_CR1_CPOL | SPI_CR1_CPHA;
|
|
|
|
int i = 0;
|
|
int val = 0x5555;
|
|
GPIOA->BSRR = GPIO_BSRR_BR_6;
|
|
while (42) {
|
|
if (i == 8) {
|
|
i = 0;
|
|
val = ~val;
|
|
}
|
|
spi_send((i&1 ? 0xfa00 : 0xf000) | (0xff^(1<<i)));
|
|
i++; // 1100'0100"0000'0000
|
|
strobe_aux();
|
|
|
|
spi_send(val);
|
|
spi_send(val);
|
|
strobe_leds();
|
|
/*if (i == 32) {
|
|
i = 0;
|
|
}
|
|
i++;
|
|
spi_send((i&16) ? 0 : (1<<i));
|
|
spi_send((i&16) ? (1<<(i&15)) : 0);
|
|
strobe_leds();
|
|
*/
|
|
LL_mDelay(200);
|
|
}
|
|
}
|
|
|
|
void NMI_Handler(void) {
|
|
}
|
|
|
|
void HardFault_Handler(void) {
|
|
for(;;);
|
|
}
|
|
|
|
void SVC_Handler(void) {
|
|
}
|
|
|
|
|
|
void PendSV_Handler(void) {
|
|
}
|
|
|
|
void SysTick_Handler(void) {
|
|
}
|
|
|