#define RCC_SEGMENT_START 0x40021000
#define GPIOA_SEGMENT_START 0x50000000
volatile int *RCC_ioclock_enable = (volatile int*)(0x34 + RCC_SEGMENT_START);
volatile int *GPIO_MODE = (volatile int*)(0x00 + GPIOA_SEGMENT_START);
volatile int *GPIO_OT = (volatile int*)(0x04 + GPIOA_SEGMENT_START);
volatile int *GPIO_DATA_OUT = (volatile int*)(0x14 + GPIOA_SEGMENT_START);
void setup() {
*RCC_ioclock_enable |= 0b1; // enable PORT A
*GPIO_MODE &= ~(0b101010);
*GPIO_MODE |= 0b010101; // set PA0, PA1, PA2 as OUTPUT
*GPIO_OT &= ~(0b111); // PA0, PA1, PA2 in push-pull config
}
void loop() {
// Red
send_data(0b11011011);
delay(500);
// Green
send_data(0b10110111);
delay(500);
// Purple
send_data(0b01001011);
delay(500);
}
void send_data(char data){
*GPIO_DATA_OUT &= ~(0b10);
spi_transfer(data);
*GPIO_DATA_OUT |= 0b10;
}
void spi_transfer(char data){
for(char n=0;n<8;n++){
*GPIO_DATA_OUT &= ~(0b100);
if(data & 0b1) *GPIO_DATA_OUT |= 0b1;
else *GPIO_DATA_OUT &= ~(0b1);
delay(1);
*GPIO_DATA_OUT |= 0b100;
data >>= 1;
}
}