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;
+}