Для управления пинами создал структуру и соответствующую функцию к ней:
Файл OutputPin.h
#include <stdint.h>
#include <stdbool.h>
#include "stm32f10x_gpio.h"
typedef struct outputPin {
GPIO_TypeDef* bus;
uint8_t pinNum;
bool state;
} outputPin;
void OutputPin_SetState(outputPin* pin, bool state) {
pin->bus->BSRR = (uint32_t)(
0b1 << (pin->pinNum + (!state * 16))
);
pin->state = state;
}
Здесь я провожу инит всех моих структур:
H3.bus = GPIOA;
H3.pinNum = 12;
H3.state = READ_BIT(GPIOA->ODR, H3.pinNum);
H1.bus = GPIOA;
H1.pinNum = 11;
H1.state = READ_BIT(GPIOA->ODR, H3.pinNum);
H2.bus = GPIOA;
H2.pinNum = 10;
H2.state = READ_BIT(GPIOA->ODR, H3.pinNum);
relay1.bus = GPIOB;
relay1.pinNum = 9;
relay1.state = READ_BIT(GPIOA->ODR, relay1.pinNum);
relay2.bus = GPIOC;
relay2.pinNum = 13;
relay2.state = READ_BIT(GPIOA->ODR, relay1.pinNum);
relay3.bus = GPIOC;
relay3.pinNum = 14;
relay3.state = READ_BIT(GPIOA->ODR, relay1.pinNum);
relay4.bus = GPIOC;
relay4.pinNum = 15;
relay4.state = READ_BIT(GPIOA->ODR, relay1.pinNum);
В отдельной функции провожу какие-то манипуляции с моими структурами:
OutputPin_SetState(&H2, false);
OutputPin_SetState(&H3, false);
OutputPin_SetState(&H1, false); // На этом моменте косяк. Если удалю эту строчку, то все ОК
OutputPin_SetState(&relay1, false);
OutputPin_SetState(&relay2, false);
OutputPin_SetState(&relay3, false);
OutputPin_SetState(&relay4, false);
Все было хорошо. Однако проблема началась тогда, когда я начал писать другой файл для управления DS18B20. Интересна ситуация тем, что ошибка возникает именно тогда, когда я запихиваю в функцию переменную H1, и только из-за нее. То есть если я удалю строчку где я вставляю H1 в функцию, то программа будет работать нормально, и остальные структуры будут нормально работать с этой функцией!
Пошел смотреть что мне говорит МК:
Из источника (
https://interrupt.memfault.com/blog/cortex-m-hardf...) понял, что бит CFSR->IMPRECISERR это неизвестная ошибка.