Нужно так: uint16_t tmpccer = 0,
tmpccer &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP);
Лишние приведения к uint16_t ни к чему. Перед оператором | выполняется приведение к int. Перед & также tmpccer приводится к int. Ну а перед присваиванием int приводится к uint16_t, но в старших разрядах нули, поэтому пофиг.
Поправка. Перед оператором | выполняется приведение к int, если TIM_CCER_CC4P и TIM_CCER_CCNP имеют тип меньше, чем int (uint16_t, например). Можно себе представить, что TIM_CCER_CC4P и TIM_CCER_CCNP имеют тип uint32_t (я в хедеры не заглядывал), в этом случае перед & также tmpccer будет приводится к uint32_t.