microscope-ring-light-remot.../main.c

110 lines
2.5 KiB
C

#include <i2c.h>
#include <stdint.h>
#include <stm32f0xx.h>
#include <stm-periph/stm32-gpio-macros.h>
#include <systick.h>
#include <dmx.h>
#define PCA9555_ADDR (0x40)
#define PCA9555_REG_IN_PORT0 (0x0)
#define PCA9555_REG_IN_PORT1 (0x1)
#define PCA9555_REG_OUT_PORT0 (0x2)
#define PCA9555_REG_OUT_PORT1 (0x3)
#define PCA9555_REG_POLARITY0 (0x4)
#define PCA9555_REG_POLARITY1 (0x5)
#define PCA9555_REG_CONFIG0 (0x6)
#define PCA9555_REG_CONFIG1 (0x7)
static uint8_t dmx_universe[129];
static void setup_pins(void)
{
uint32_t tmp;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN;
tmp = GPIOA->MODER;
/* Reset all used port pins */
tmp &= MODER_DELETE(0) & MODER_DELETE(1) & MODER_DELETE(2) & MODER_DELETE(3) & \
MODER_DELETE(4) & MODER_DELETE(5) & MODER_DELETE(6) & MODER_DELETE(7) & \
MODER_DELETE(8) & MODER_DELETE(9) & MODER_DELETE(10);
/* Analog ports for POTIs */
tmp |= ANALOG(0) | ANALOG(1) | ANALOG(4);
/* Setup USART1 RX/TX (AF1) */
tmp |= ALTFUNC(2) | ALTFUNC(3);
SETAF(GPIOA, 2, 1);
SETAF(GPIOA, 3, 1);
/* LED enables for Potentiometers */
tmp |= OUTPUT(5) | OUTPUT(6) | OUTPUT(7);
GPIOA->ODR &= ~((1 << 5) | (1 << 6) | (1 << 7));
/* Setup I2C pins (AF4) */
tmp |= ALTFUNC(9) | ALTFUNC(10);
SETAF(GPIOA, 9, 4);
SETAF(GPIOA, 10, 4);
/* Set I2C Pins to open drain. Others are push pull */
GPIOA->OTYPER = OTYP_OPENDRAIN(9) | OTYP_OPENDRAIN(10);
/* Write changes to GPIOA mode register */
GPIOA->MODER = tmp;
/* PB1 Input with pullup */
GPIOB->MODER &= MODER_DELETE(1);
GPIOB->PUPDR = PULLUP(1);
}
int main(void)
{
uint8_t i2c_command[2];
uint8_t port;
uint32_t odr;
setup_pins();
i2c_init();
dmx_init(dmx_universe, sizeof(dmx_universe), GPIOA, 2u, 2300u, 10u, 5u);
/* Setup Systick for 1ms ticks */
SysTick_Config(48000000UL/1000);
GPIOA->ODR |= (1<<5) | (1<<7);
/* Setup PCA */
i2c_command[0] = PCA9555_REG_CONFIG1;
i2c_command[1] = 0x00;
i2c_write(PCA9555_ADDR, i2c_command, 2u);
i2c_command[0] = PCA9555_REG_CONFIG0;
i2c_command[1] = 0xFF;
i2c_write(PCA9555_ADDR, i2c_command, 2u);
dmx_stream_start();
/* Blink the LEDs */
while (1) {
systick_wait_ms(3);
i2c_read(PCA9555_ADDR, PCA9555_REG_IN_PORT0, &port, 1u);
i2c_command[0] = PCA9555_REG_OUT_PORT1;
i2c_command[1] = ~port;
odr = GPIOA->ODR;
odr &= ~((1<<5) | (1<<6) | (1<<7));
if (port & (1<<0)) {
odr |= (1<<5);
}
if (port & (1<<1)) {
odr |= (1<<6);
}
if (port & (1<<2)) {
odr |= (1<<7);
}
GPIOA->ODR = odr;
i2c_write(PCA9555_ADDR, i2c_command, 2u);
}
}