Перед выполнением атомарных операций с GPIO в прерывании в STM32 выключать прерывания не нужно. Спасибо, что есть регистры BRR, BSRR. При работе через библиотеку они так же используются:
Код
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRR = GPIO_Pin;
}
...
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BRR = GPIO_Pin;
}
Если нужно работать атомарно с любым битом в любом регистре, включая RAM, то можно еще дальше пойти, используя атомарные возможности Cortex-M3-4, но если используется M0, то этой возможности уже не будет.
Сообщение отредактировал kan35 - Jan 8 2015, 13:33