105 lines
2 KiB
C
105 lines
2 KiB
C
#include <libopencm3/cm3/systick.h>
|
|
#include <libopencm3/stm32/rcc.h>
|
|
#include <libopencm3/stm32/gpio.h>
|
|
|
|
#include <string.h>
|
|
|
|
typedef unsigned char byte;
|
|
|
|
static void delay_ms(unsigned int ms)
|
|
{
|
|
systick_clear();
|
|
for (unsigned int i=0; i<ms; i++)
|
|
while (!systick_get_countflag())
|
|
;
|
|
}
|
|
|
|
static void wait(void)
|
|
{
|
|
for (int i=0; i<7200; i++)
|
|
asm volatile ("");
|
|
}
|
|
|
|
static void set_reg(int reg, int data)
|
|
{
|
|
data |= reg << 8;
|
|
|
|
gpio_clear(GPIOB, GPIO13);
|
|
wait();
|
|
|
|
for (int mask=0x8000; mask; mask >>= 1) {
|
|
if (data & mask)
|
|
gpio_set(GPIOB, GPIO12);
|
|
else
|
|
gpio_clear(GPIOB, GPIO12);
|
|
wait();
|
|
gpio_set(GPIOB, GPIO14);
|
|
wait();
|
|
gpio_clear(GPIOB, GPIO14);
|
|
wait();
|
|
}
|
|
|
|
gpio_set(GPIOB, GPIO13);
|
|
wait();
|
|
}
|
|
|
|
static byte display[8] = {
|
|
0x66, /* .##..##. */
|
|
0x66, /* .##..##. */
|
|
0x00, /* ........ */
|
|
0x18, /* ...##... */
|
|
0x00, /* ........ */
|
|
0xc3, /* ##....## */
|
|
0x66, /* .##..##. */
|
|
0x3c, /* ..####.. */
|
|
};
|
|
|
|
static void refresh_display(void)
|
|
{
|
|
for (int i=1; i<=8; i++)
|
|
set_reg(i, display[8-i]);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);
|
|
rcc_periph_clock_enable(RCC_GPIOA);
|
|
rcc_periph_clock_enable(RCC_GPIOB);
|
|
rcc_periph_clock_enable(RCC_GPIOC);
|
|
|
|
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
|
|
systick_set_reload(71999);
|
|
systick_counter_enable();
|
|
|
|
// PC13 = BluePill LED
|
|
gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
|
|
|
|
// PB12 = display DIN
|
|
// PB13 = display CS*
|
|
// PB14 = display CLK
|
|
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12 | GPIO13 | GPIO14);
|
|
gpio_clear(GPIOB, GPIO12);
|
|
gpio_set(GPIOB, GPIO13);
|
|
gpio_clear(GPIOB, GPIO14);
|
|
|
|
#if 0
|
|
// PA0 = left button
|
|
// PA1 = right button
|
|
gpio_set_mode(GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO0 | GPIO1);
|
|
gpio_set(GPIOA, GPIO0 | GPIO1);
|
|
#endif
|
|
|
|
refresh_display();
|
|
set_reg(9, 0);
|
|
set_reg(10, 0); // intensity
|
|
set_reg(11, 7);
|
|
set_reg(13, 0); // test
|
|
set_reg(12, 1); // shutdown
|
|
|
|
for (;;) {
|
|
gpio_clear(GPIOC, GPIO13);
|
|
delay_ms(100);
|
|
gpio_set(GPIOC, GPIO13);
|
|
delay_ms(500);
|
|
}
|
|
}
|