~ruther/stm32h747i-disco-usb-image-viewer

3644d05456728e9e59ae8fa9deeead6768544eff — Rutherther 5 months ago 1062cf2
chore: some renames
4 files changed, 45 insertions(+), 25 deletions(-)

M include/registers.h
M src/exti.c
M src/pin.c
M src/registers.c
M include/registers.h => include/registers.h +9 -5
@@ 3,10 3,14 @@
#ifndef REGISTERS_H
#define REGISTERS_H

void reg_set_bits_pos(volatile uint32_t *reg, uint32_t data, uint8_t pos, uint8_t mask);
void reg_set_bits(volatile uint32_t *reg, uint32_t data, uint8_t mask);
void reg_toggle_bits_pos(volatile uint32_t *reg, uint8_t pos, uint8_t mask);
void reg_toggle_bits(volatile uint32_t *reg, uint8_t mask);
uint32_t reg_read_bits_pos(volatile uint32_t *reg, uint8_t pos, uint8_t mask);
extern inline void reg_write_bits_pos(volatile uint32_t *reg, uint32_t data, uint8_t pos, uint32_t mask);
extern inline void reg_write_bits(volatile uint32_t *reg, uint32_t data, uint32_t mask);
extern inline void reg_set_bits_pos(volatile uint32_t *reg, uint32_t mask);
extern inline void reg_set_bits(volatile uint32_t *reg, uint32_t mask);
extern inline void reg_toggle_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask);
extern inline void reg_toggle_bits(volatile uint32_t *reg, uint32_t mask);
extern inline void reg_clear_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask);
extern inline void reg_clear_bits(volatile uint32_t *reg, uint32_t mask);
extern inline uint32_t reg_read_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask);

#endif // REGISTERS_H

M src/exti.c => src/exti.c +8 -8
@@ 19,23 19,23 @@ void exti_external_interrupt(exti_t *exti, uint8_t line, uint8_t gpio) {
  uint8_t index = line >> 2;
  uint8_t pos = (line & 0x3) * 4;
  volatile uint32_t *exticr = exti->syscfg->EXTICR;
  reg_set_bits_pos(exticr + index, gpio, pos, 0x0F);
  reg_write_bits_pos(exticr + index, gpio, pos, 0x0F);
}

void exti_rising_interrupt(exti_t *exti, uint8_t line) {
  reg_set_bits_pos(&exti->exti->RTSR1, 1, line, 1);
  reg_set_bits_pos(&exti->exti->FTSR1, 0, line, 1);
  reg_set_bits_pos(&exti->exti->IMR1, 1, line, 1);
  reg_write_bits_pos(&exti->exti->RTSR1, 1, line, 1);
  reg_write_bits_pos(&exti->exti->FTSR1, 0, line, 1);
  reg_write_bits_pos(&exti->exti->IMR1, 1, line, 1);
}

void exti_falling_interrupt(exti_t *exti, uint8_t line) {
  reg_set_bits_pos(&exti->exti->FTSR1, 1, line, 1);
  reg_set_bits_pos(&exti->exti->RTSR1, 0, line, 1);
  reg_set_bits_pos(&exti->exti->IMR1, 1, line, 1);
  reg_write_bits_pos(&exti->exti->FTSR1, 1, line, 1);
  reg_write_bits_pos(&exti->exti->RTSR1, 0, line, 1);
  reg_write_bits_pos(&exti->exti->IMR1, 1, line, 1);
}

void exti_disable_interrupt(exti_t *exti, uint8_t line) {
  reg_set_bits_pos(&exti->exti->IMR1, 0, line, 1);
  reg_write_bits_pos(&exti->exti->IMR1, 0, line, 1);
}

IRQn_Type exti_irq_idx(uint8_t line) {

M src/pin.c => src/pin.c +7 -7
@@ 12,13 12,13 @@ pin_t *pin_init(GPIO_TypeDef *gpio, uint8_t pin) {
}

void pin_mode(pin_t *pin, pin_mode_t mode) {
  reg_set_bits_pos(&pin->gpio->MODER, (uint32_t)mode, pin->pin << 1, 0b11);
  reg_write_bits_pos(&pin->gpio->MODER, (uint32_t)mode, pin->pin << 1, 0b11);
}
void pin_pull(pin_t *pin, pin_pullmode_t mode) {
  reg_set_bits_pos(&pin->gpio->PUPDR, (uint32_t)mode, pin->pin << 1, 0b11);
  reg_write_bits_pos(&pin->gpio->PUPDR, (uint32_t)mode, pin->pin << 1, 0b11);
}
void pin_speed(pin_t *pin, pin_speedmode_t mode) {
  reg_set_bits_pos(&pin->gpio->OSPEEDR, (uint32_t)mode, pin->pin << 1, 0b11);
  reg_write_bits_pos(&pin->gpio->OSPEEDR, (uint32_t)mode, pin->pin << 1, 0b11);
}

uint8_t pin_read(pin_t *pin) {


@@ 26,7 26,7 @@ uint8_t pin_read(pin_t *pin) {
}

uint8_t pin_write(pin_t *pin, uint8_t val) {
  reg_set_bits_pos(&pin->gpio->ODR, val, pin->pin, 1);
  reg_write_bits_pos(&pin->gpio->ODR, val, pin->pin, 1);
}
void pin_toggle(pin_t *pin) {
  reg_toggle_bits_pos(&pin->gpio->ODR, pin->pin, 1);


@@ 51,10 51,10 @@ void pin_into_output_opendrain(pin_t *pin) {
}

void pin_into_pushpull(pin_t *pin) {
  reg_set_bits_pos(&pin->gpio->OTYPER, 0, pin->pin, 1);
  reg_write_bits_pos(&pin->gpio->OTYPER, 0, pin->pin, 1);
}
void pin_into_opendrain(pin_t *pin) {
  reg_set_bits_pos(&pin->gpio->OTYPER, 1, pin->pin, 1);
  reg_write_bits_pos(&pin->gpio->OTYPER, 1, pin->pin, 1);
}

void pin_into_input(pin_t *pin) {


@@ 70,7 70,7 @@ void pin_into_alternate(pin_t *pin, uint8_t alternate) {
  uint8_t index = pin->pin >> 3;
  uint8_t pos = (pin->pin & 0x7) * 4;
  volatile uint32_t *afr = pin->gpio->AFR;
  reg_set_bits_pos(afr + index, alternate, pos, 0xF);
  reg_write_bits_pos(afr + index, alternate, pos, 0xF);
}
void pin_into_alternate_highspeed(pin_t *pin, uint8_t alternate) {
  pin_into_alternate(pin, alternate);

M src/registers.c => src/registers.c +21 -5
@@ 1,23 1,39 @@
#include <stdint.h>

void reg_set_bits_pos(volatile uint32_t *reg, uint32_t data, uint8_t pos, uint8_t mask) {
void reg_write_bits_pos(volatile uint32_t *reg, uint32_t data, uint8_t pos, uint32_t mask) {
  *reg &= ~(mask << pos);
  *reg |= (data & mask) << pos;
}

void reg_set_bits(volatile uint32_t *reg, uint32_t data, uint8_t mask) {
void reg_write_bits(volatile uint32_t *reg, uint32_t data, uint32_t mask) {
  *reg &= ~(mask);
  *reg |= (data & mask);
}

void reg_toggle_bits_pos(volatile uint32_t *reg, uint8_t pos, uint8_t mask) {
void reg_set_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask) {
  *reg |= mask << pos;
}

void reg_set_bits(volatile uint32_t *reg, uint32_t mask) {
  *reg |= mask;
}

void reg_toggle_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask) {
  *reg ^= (mask << pos);
}

void reg_toggle_bits(volatile uint32_t *reg, uint8_t mask) {
void reg_toggle_bits(volatile uint32_t *reg, uint32_t mask) {
  *reg ^= mask;
}

uint32_t reg_read_bits_pos(volatile uint32_t *reg, uint8_t pos, uint8_t mask) {
uint32_t reg_read_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask) {
  return ((*reg) >> pos) & mask;
}

void reg_clear_bits_pos(volatile uint32_t *reg, uint8_t pos, uint32_t mask) {
  *reg ^= ~(mask << pos);
}

void reg_clear_bits(volatile uint32_t *reg, uint8_t pos, uint32_t mask) {
  *reg ^= ~mask;
}

Do not follow this link