alien
This commit is contained in:
@@ -8,11 +8,13 @@
|
||||
#include "utils/timebase.h"
|
||||
|
||||
#include "bus/event_queue.h"
|
||||
#include "com/debug.h"
|
||||
|
||||
// ---- Private prototypes --------
|
||||
|
||||
static void conf_gpio(void);
|
||||
static void conf_usart(void);
|
||||
static void conf_spi(void);
|
||||
static void conf_systick(void);
|
||||
static void conf_subsystems(void);
|
||||
static void conf_irq_prios(void);
|
||||
@@ -27,6 +29,7 @@ void hw_init(void)
|
||||
conf_gpio();
|
||||
conf_usart();
|
||||
conf_systick();
|
||||
conf_spi();
|
||||
conf_irq_prios();
|
||||
conf_subsystems();
|
||||
}
|
||||
@@ -71,6 +74,7 @@ static void conf_subsystems(void)
|
||||
static void conf_gpio(void)
|
||||
{
|
||||
GPIO_InitTypeDef gpio_cnf;
|
||||
GPIO_StructInit(&gpio_cnf);
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
||||
@@ -96,6 +100,18 @@ static void conf_gpio(void)
|
||||
// A0-sonar trig | UART2 - debug, UART1 - esp
|
||||
gpio_cnf.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_9 | GPIO_Pin_10;
|
||||
gpio_cnf.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
gpio_cnf.GPIO_Speed = GPIO_Speed_10MHz;
|
||||
GPIO_Init(GPIOA, &gpio_cnf);
|
||||
|
||||
// SPI
|
||||
gpio_cnf.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
|
||||
gpio_cnf.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
gpio_cnf.GPIO_Speed = GPIO_Speed_10MHz;
|
||||
GPIO_Init(GPIOA, &gpio_cnf);
|
||||
// SPI NSS out
|
||||
gpio_cnf.GPIO_Pin = GPIO_Pin_4;
|
||||
gpio_cnf.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
gpio_cnf.GPIO_Speed = GPIO_Speed_10MHz;
|
||||
GPIO_Init(GPIOA, &gpio_cnf);
|
||||
}
|
||||
|
||||
@@ -115,6 +131,26 @@ static void conf_usart(void)
|
||||
data_iface = usart_iface_init(USART1, 460800, 256, 256);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Configure SPI
|
||||
*/
|
||||
static void conf_spi(void)
|
||||
{
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2ENR_SPI1EN, ENABLE);
|
||||
|
||||
SPI_InitTypeDef spi_cnf;
|
||||
SPI_StructInit(&spi_cnf);
|
||||
|
||||
spi_cnf.SPI_Direction = SPI_Direction_1Line_Tx;
|
||||
spi_cnf.SPI_Mode = SPI_Mode_Master;
|
||||
spi_cnf.SPI_NSS = SPI_NSS_Soft;
|
||||
spi_cnf.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
|
||||
|
||||
SPI_Init(SPI1, &spi_cnf);
|
||||
|
||||
SPI_Cmd(SPI1, ENABLE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Configure 1 kHz SysTick w/ interrupt
|
||||
|
||||
+56
-13
@@ -13,7 +13,10 @@
|
||||
#include <math.h>
|
||||
#include <sbmp.h>
|
||||
|
||||
void poll_subsystems(void)
|
||||
#include "matrixdsp.h"
|
||||
|
||||
|
||||
static void poll_subsystems(void)
|
||||
{
|
||||
// poll serial buffers (runs callback)
|
||||
com_poll(debug_iface);
|
||||
@@ -36,29 +39,69 @@ void poll_subsystems(void)
|
||||
|
||||
|
||||
|
||||
void blinky(void* arg)
|
||||
{
|
||||
(void)arg;
|
||||
GPIOC->ODR ^= 1<<13;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
hw_init();
|
||||
display_init();
|
||||
// display_init();
|
||||
|
||||
banner("*** STM32F103K8T6 RGB LED demo ***");
|
||||
banner("*** LED MATRIX DEMO ***");
|
||||
banner_info("(c) Ondrej Hruska, 2016");
|
||||
banner_info("Katedra mereni K338, CVUT FEL");
|
||||
|
||||
ms_time_t last;
|
||||
|
||||
add_periodic_task(blinky, NULL, 500, false);
|
||||
mdsp_send_command_all(CMD_DECODE_MODE, 0x00);
|
||||
mdsp_send_command_all(CMD_SCAN_LIMIT, 0x07);
|
||||
mdsp_send_command_all(CMD_SHUTDOWN, 0x01);
|
||||
mdsp_send_command_all(CMD_DISPLAY_TEST, 0x00);
|
||||
mdsp_send_command_all(CMD_INTENSITY, 0x05);
|
||||
|
||||
mdsp_clear();
|
||||
|
||||
// ---
|
||||
|
||||
const uint16_t inva0[] = {
|
||||
0b00100000100,
|
||||
0b00010001000,
|
||||
0b00111111100,
|
||||
0b01101110110,
|
||||
0b11111111111,
|
||||
0b10111111101,
|
||||
0b10100000101,
|
||||
0b00011011000,
|
||||
};
|
||||
|
||||
const uint16_t inva1[] = {
|
||||
0b00100000100,
|
||||
0b10010001001,
|
||||
0b10111111101,
|
||||
0b11101110111,
|
||||
0b11111111111,
|
||||
0b01111111110,
|
||||
0b00100000100,
|
||||
0b01000000010,
|
||||
};
|
||||
|
||||
while (1) {
|
||||
if (ms_loop_elapsed(&last, 500)) {
|
||||
GPIOC->ODR ^= 1 << 13;
|
||||
}
|
||||
|
||||
poll_subsystems();
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
uint32_t x = __RBIT(inva0[7-i]);
|
||||
mdsp_set(i, x >> 21);
|
||||
mdsp_set(8+i, (x >> 29) & 0b111);
|
||||
}
|
||||
delay_ms(500);
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
uint32_t x = __RBIT(inva1[7-i]);
|
||||
mdsp_set(i, x >> 21);
|
||||
mdsp_set(8+i, (x >> 29) & 0b111);
|
||||
}
|
||||
delay_ms(500);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
#include <main.h>
|
||||
#include <matrixdsp.h>
|
||||
|
||||
#include "com/debug.h"
|
||||
|
||||
#include "utils/timebase.h"
|
||||
|
||||
static void send_byte(uint8_t b)
|
||||
{
|
||||
MDSP_SPIx->DR = b;
|
||||
while (!(MDSP_SPIx->SR & SPI_SR_TXE));
|
||||
}
|
||||
|
||||
static void set_nss(bool nss)
|
||||
{
|
||||
if (nss) {
|
||||
MDSP_NSS_GPIO->BSRR = MDSP_NSS_PIN;
|
||||
} else {
|
||||
MDSP_NSS_GPIO->BRR = MDSP_NSS_PIN;
|
||||
}
|
||||
}
|
||||
|
||||
static void send_word(MDSP_Command cmd, uint8_t data)
|
||||
{
|
||||
send_byte(cmd);
|
||||
send_byte(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Send a command to n-th chained driver
|
||||
* @param idx Driver index (0, 1, 2 ...)
|
||||
* @param cmd command to send
|
||||
* @param data command argument
|
||||
*/
|
||||
void mdsp_send_command(uint8_t idx, MDSP_Command cmd, uint8_t data)
|
||||
{
|
||||
dbg("Set %d: cmd 0x%02x, data 0x%02x", idx, cmd, data);
|
||||
|
||||
set_nss(false);
|
||||
while (MDSP_SPIx->SR & SPI_SR_BSY);
|
||||
|
||||
for (uint8_t i = 0; i < MDSP_CHAIN_COUNT - idx - 1; i++) {
|
||||
send_word(CMD_NOOP, 0);
|
||||
}
|
||||
|
||||
send_word(cmd, data);
|
||||
|
||||
for (uint8_t i = 0; i < idx; i++) {
|
||||
send_word(CMD_NOOP, 0);
|
||||
}
|
||||
|
||||
while (MDSP_SPIx->SR & SPI_SR_BSY);
|
||||
set_nss(false);
|
||||
set_nss(true);
|
||||
}
|
||||
|
||||
|
||||
void mdsp_send_command_all(MDSP_Command cmd, uint8_t data)
|
||||
{
|
||||
dbg("Set cmd 0x%02x, data 0x%02x ALL", cmd, data);
|
||||
|
||||
set_nss(false);
|
||||
while (MDSP_SPIx->SR & SPI_SR_BSY);
|
||||
|
||||
for (uint8_t i = 0; i < MDSP_CHAIN_COUNT; i++) {
|
||||
send_word(cmd, data);
|
||||
}
|
||||
|
||||
while (MDSP_SPIx->SR & SPI_SR_BSY);
|
||||
|
||||
set_nss(false);
|
||||
set_nss(true);
|
||||
}
|
||||
|
||||
void mdsp_set(uint8_t column, uint8_t bits)
|
||||
{
|
||||
if (column >= MDSP_COLUMN_COUNT) return;
|
||||
|
||||
mdsp_send_command(column >> 3, CMD_DIGIT0 + (column & 0x7), bits);
|
||||
}
|
||||
|
||||
void mdsp_clear(void)
|
||||
{
|
||||
for (uint8_t i = 0; i < 8; i++) {
|
||||
mdsp_send_command_all(CMD_DIGIT0+i, 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#ifndef MATRIXDSP_H
|
||||
#define MATRIXDSP_H
|
||||
|
||||
#include <main.h>
|
||||
|
||||
#define MDSP_SPIx SPI1
|
||||
#define MDSP_NSS_GPIO GPIOA
|
||||
#define MDSP_NSS_PIN GPIO_Pin_4;
|
||||
|
||||
#define MDSP_CHAIN_COUNT 4
|
||||
#define MDSP_COLUMN_COUNT (MDSP_CHAIN_COUNT*8)
|
||||
|
||||
typedef enum {
|
||||
CMD_NOOP = 0x00,
|
||||
|
||||
CMD_DIGIT0 = 0x01,
|
||||
CMD_DIGIT1 = 0x02,
|
||||
CMD_DIGIT2 = 0x03,
|
||||
CMD_DIGIT3 = 0x04,
|
||||
CMD_DIGIT4 = 0x05,
|
||||
CMD_DIGIT5 = 0x06,
|
||||
CMD_DIGIT6 = 0x07,
|
||||
CMD_DIGIT7 = 0x08,
|
||||
|
||||
CMD_DECODE_MODE = 0x09,
|
||||
CMD_INTENSITY = 0x0A,
|
||||
CMD_SCAN_LIMIT = 0x0B,
|
||||
CMD_SHUTDOWN = 0x0C,
|
||||
CMD_DISPLAY_TEST = 0x0F,
|
||||
} MDSP_Command;
|
||||
|
||||
void mdsp_set(uint8_t column, uint8_t bits);
|
||||
|
||||
void mdsp_clear(void);
|
||||
|
||||
/**
|
||||
* @brief Send a command to n-th chained driver
|
||||
* @param idx Driver index (0, 1, 2 ...)
|
||||
* @param cmd command to send
|
||||
* @param data command argument
|
||||
*/
|
||||
void mdsp_send_command(uint8_t idx, MDSP_Command cmd, uint8_t data);
|
||||
|
||||
|
||||
void mdsp_send_command_all(MDSP_Command cmd, uint8_t data);
|
||||
|
||||
#endif // MATRIXDSP_H
|
||||
Reference in New Issue
Block a user