ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
1042019 Топик полностью
evgeniy1294 (04.10.2020 16:04 - 16:20, просмотров: 395) ответил teap0t на Это код для работы с регистрами периферии (линиями внешних прерываний) в STM32 и к CMSIS не относится. Лень и "оптимизация" часто следуют вместе, но вопрос о правильности (допустимости) подхода, или, наоборот, необходимости всяческого уклонения и недопущения.
Поправил ответ. Вообще подход не очень, я бы записал через условие: 
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 )
{
//.... if (EXTI_InitStruct->EXTI_Mode == EXTI_Mode_Event) EXTI->EMR |= EXTI_InitStruct->EXTI_Line; else EXTI->IMR |= EXTI_InitStruct->EXTI_Line;

//.... }



// Либо так
void EXTI_Init( EXTI_InitTypeDef* EXTI_InitStruct )
{
//....
switch(EXTI_Mode) {
case EXTI_Mode_Event:
EXTI->EMR |= EXTI_InitStruct->EXTI_Line;
break;
case EXTI_Mode_Interrupt:
EXTI->IMR |= EXTI_InitStruct->EXTI_Line;
break;
default:
// Ловим ошибочный параметр через отладчик
// Такую проверку принято делать через assert на входе в функцию
AlarmLedOn();
while(1);
}
//....

}