ПРИМЕЧАНИЕ: PORT->Group[0].PMUX
- это массив! Что превращается в указатель на первый элемент, если вы выполняете PMUX->bit
, поэтому он компилируется, но это неверно. Вы устанавливаете первый элемент вместо интересующего вас пина PIN_PA22/2
.
Тип регистра маршрутизации PMUX
в карте регистров ASF выглядит следующим образом:
typedef union {
struct {
uint8_t PMUXE:4; /*!< bit: 0.. 3 Peripheral Multiplexing for Even-Numbered Pin */
uint8_t PMUXO:4; /*!< bit: 4.. 7 Peripheral Multiplexing for Odd-Numbered Pin */
} bit; /*!< Structure used for bit access */
uint8_t reg; /*!< Type used for register access */
} PORT_PMUX_Type;
Это означает, что вы можете писать в 8-битные reg
или 4-битные bit
полубайты. Вы, кажется, делаете последнее. Если 0x05
- это «число магов c», полученное в руководстве, вы должны записать это число как в «четный», так и в «нечетный» полубайт. То есть:
PORT->Group[0].PMUX[PIN_PA22/2].bit.PMUXE = (0x5 << 4);
PORT->Group[0].PMUX[PIN_PA22/2].bit.PMUXO = (0x5 << 0);
Или, если хотите, вы можете альтернативно использовать бессмысленные макросы раздутого ПО ASF, чтобы скрыть "страшные" побитовые логики. c:
PORT->Group[0].PMUX[PIN_PA22/2].reg = PORT_PMUX_PMUXE(0x5) | PORT_PMUX_PMUXO(0x5);
Если вы этого не сделаете Если вы правильно поняли, на пине не будет никакой активности.