/* * Display number "2018" on the seven-segment LED of the EduBase board. * The four digit seven segment LED is driven by two shift registers, * one to control the anodes (segments) and the other the common cathodes * (digit select). The shift registers are daisy-chained to SPI1. * The pin assignments are: * SCLK - PA5 * MOSI - PA7 * 7SEG_CS - PA9 * * Each digit is enabled for 4 ms. With four digits, the cycle time is * 4 ms * 4 = 16 ms that translates to 62.5 Hz. */ #include "stm32f4xx.h" void delayMs(int n); void SPI1_init(void); void SPI1_write(unsigned char data); int main(void) { /* initialize SPI1 that connects to the shift registers */ SPI1_init(); while(1) { SPI1_write(~0x5B); /* write pattern 2 to the seven segments */ SPI1_write(1 << 3); /* select digit 3 */ delayMs(4); SPI1_write(~0x3F); /* write pattern 0 to the seven segments */ SPI1_write(1 << 2); /* select digit 2 */ delayMs(4); SPI1_write(~0x06); /* write pattern 1 to the seven segments */ SPI1_write(1 << 1); /* select digit 1 */ delayMs(4); SPI1_write(~0x7F); /* write pattern 8 to the seven segments */ SPI1_write(1 << 0); /* select digit 0 */ delayMs(4); } } /* configure SPI1 and the associated GPIO pins */ void SPI1_init(void) { RCC->AHB1ENR |= 1; /* enable GPIOA clock */ RCC->APB2ENR |= 0x1000; /* enable SPI1 clock */ /* PORTA 5, 7 for SPI1 MOSI and SCLK */ GPIOA->MODER &= ~0x0000CC00; /* clear pin mode */ GPIOA->MODER |= 0x00008800; /* set pin alternate mode */ GPIOA->AFR[0] &= ~0xF0F00000; /* clear alt mode */ GPIOA->AFR[0] |= 0x50500000; /* set alt mode SPI1 */ /* PA9 as GPIO output for SPI slave select */ GPIOA->MODER &= ~0x000C0000; /* clear pin mode */ GPIOA->MODER |= 0x00040000; /* set pin output mode */ SPI1->CR1 = 0x31F; SPI1->CR2 = 0; SPI1->CR1 |= 0x40; /* enable SPI1 module */ } /* This function enables slave select, writes one byte to SPI1, */ /* wait for transmit complete and deassert slave select. */ void SPI1_write(unsigned char data) { while (!(SPI1->SR & 2)) {} /* wait until Transfer buffer Empty */ GPIOA->BSRR = 0x02000000; /* assert slave select */ SPI1->DR = data; /* write data */ while (SPI1->SR & 0x80) {} /* wait for transmission done */ GPIOA->BSRR = 0x00000200; /* deassert slave select */ } /* 16 MHz SYSCLK */ void delayMs(int n) { int i; for (; n > 0; n--) for (i = 0; i < 3195; i++) ; }