SAMD21 как настроить ШИМ с помощью Т CC? - PullRequest
0 голосов
/ 27 мая 2020

Я программирую SAMD21 и мне нужен ШИМ Когда я выбрал вывод с функцией F Выход TCC0: PA22 - TCC0 / WO [4] PA23 - TCC0 / WO [5]

Я успешно настроил базовый счетчик TCC0 :

// enable clock for TCC0 - disable clock masking
PM->APBCMASK.reg |= PM_APBCMASK_TCC0;

// set GCLK1 as source to the TCC0 counter
GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(1) | GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_ID(0x1A);
while(!SYSCTRL->PCLKSR.bit.DFLLRDY);

// set counter
TCC0->CTRLA.reg |= TCC_CTRLA_PRESCALER_DIV64; // setting prescaler
TCC0->WAVE.reg |=  TCC_WAVE_WAVEGEN_NPWM | TCC_WAVE_POL0;
while (TCC0->SYNCBUSY.bit.WAVE);

// set TOP (PER) value of counter - frequency
TCC0->CTRLA.bit.RESOLUTION = 0;
TCC0->PER.reg = 48'000'000 / (100 * 64) - 1; // Fpwm = Fglk / (PRESC(PER+1))  --> PER = Fglk / (Fpwm * PRESC) - 1
while (TCC0->SYNCBUSY.bit.PER);

Но проблема заключалась в том, как настроить каналы сравнения - SAMD21 имеет только 4 канала сравнения (CC), но я хочу выводить данные в WO [4] и WO [5].

Как я могу подключить указанные каналы сравнения к выводам WO [x]?

Спасибо за ответ

РЕДАКТИРОВАТЬ:

Я также настроил выводы для мультиплексирования (не уверен, что правильно):

PORT->Group[0].PINCFG->reg |= (1 << PIN_PA22) | (1 << PIN_PA23);
PORT->Group[0].PMUX->bit.PMUXE = (0x5 << (PIN_PA22/2));
PORT->Group[0].PMUX->bit.PMUXO = (0x5 << (PIN_PA23/2 + 1));

1 Ответ

0 голосов
/ 27 мая 2020

ПРИМЕЧАНИЕ: 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);

Если вы этого не сделаете Если вы правильно поняли, на пине не будет никакой активности.

...