ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
966733
Ксения (24.12.2019 17:26 - 17:38, просмотров: 17523)
Въедливые вопросы закоренелой AVRовщицы по поводу STM32 :) 1) Как же все-таки на STM32 записать байт в порт? Т.е. провести операцию, которая в архитектуре AVR пишется примитивно просто: PORTA=byte. Я не спонталыку такой вопрос задаю на конференции, а лишь после того, как была несказанно удивлена ответами на эту тему, которые нашла в интернете, а так же тем, что рекомендует в этом случае наш любимый CubeMX :). Во-первых, все, как сговорились, предлагают выполнять эту операцию в две стадии: сперва стереть все биты порта (через BSR или BSRR), а затем через тот же BSRR установить нужные (те, что в моем байте стоят торчком). А от прямой записи в ODR всячески открещиваются, считая эту процедуру неатомарной, хотя неатомарность у них по другой причине - использования операции OR с регистром, где скрыто присутствует операция чтения. Отсюда мой вопрос распадается на две части: 1a) Почему через регистр BSRR нельзя СРАЗУ установить нужные биты и стереть ненужные? Ведь пишутся они в его разных местах: устанавливаемые - в младшей части регистра BSRR, а стираемые - в его старшей части. Так почему же этими частями пользуются исключительно раздельно? В том же CubeMX видим единственную функцию на вывод: void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); где PinState может принимать значение либо SET (1), либо RESET (0). Так почему же никто не использует обе половины регистра BSRR сразу? Вот так:GPIOA->BSRR = ((~byte & 0xFF) << 16) | byte; 1b) Почему в регистр ODR нельзя писать напрямую? И не OR-ом, а прямым присваиванием? Вот и evgeniy1294 к своей демо-программе, мигающей светодиодиком, написал в комментарии:// С регистром ODR нужно обращаться крайне нежно!!! GPIOA->ODR ^= 1<<6; Но в чем заключается нежность, так и не сказал. :) Предположу, что нежность здесь в том же, что XOR, как и OR, неатомарен. Однако вопрос о том, отчего никто не использует прямое присваивание, остается открытым. Вероятно, народ здесь боится повредить другие биты регистра ODR, которые выходят за пределы байта. В этой связи еще один подвопрос: 1с) Что случится с битами порта, если долбануть по его ODR, когда эти биты уже несут альтернативные функции (JTAG, UART, SPI, ADC и т.п.)? Способно ли повредить их альтернативной функции изменение ODR порта, которому они принадлежат?