ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 апреля
1042014 Топик полностью
evgeniy1294 (04.10.2020 15:32 - 15:55, просмотров: 426) ответил teap0t на #15 Разбирая библиотеки обнаружил такой вид адресной арифметики. Насколько такой метод подходит/не_подходит под понятие "говнокод"? Имеем такой фрагмент (коменты мои): (UPD подправил слегка)
Это "библиотечная" реализация, видимо индус сделал так, чтобы не зависить от именования регистров Interrupt и Event в CMSIS для разных микроконтроллеров. Хотя не совсем, я ошибся. Там смысл такой: 
// Это элемент списка параметров для настройки. Эвенты можно использовать для запуска некоторой периферии, а прерывания - для тупой регистрации события: rising/falling/both edge.
typedef enum { EXTI_Mode_Interrupt = 0x00, /* Offset to EXTI_IMR reg */ EXTI_Mode_Event = 0x04 /* Offset to EXTI_EMR reg */ } EXTIMode_TypeDef; // Настройка периферии void EXTI_Init( EXTI_InitTypeDef* EXTI_InitStruct ) { uint32_t tmp; tmp = (uint32_t)EXTI_BASE; <...> tmp += EXTI_InitStruct->EXTI_Mode; // Нужный режим определяется через регистр, смещение до которого берется в EXTIMode и сохраняется в InitStruct. Там наверняка ещё битовая маска есть с номером пина. *(__IO uint32_t *) tmp |= EXTI_InitStruct->EXTI_Line; // А вот и маска, определяется скорее всего как EXTI_Line = 1 << pin_number; <...> }