Xplained pro SAM4SD32C - Таймер 1 - Не могу записать в регистр RA - PullRequest
0 голосов
/ 23 октября 2018

Я борюсь с конфигурацией таймера 1 SAM4SD32C платы XPlained Pro Sam4s ... Сначала я использовал таймер 0, и я мог генерировать сигнал, который мне нужен.

Итак, я скопировал код, адаптировал его для таймера 1, чтобы генерировать другой сигнал, следуя той же методике.Во время отладки я заметил, что не могу войти в режим прерывания.Далее я проверил и заметил, что не могу записать в регистр RA и RC таймера 1, используя функции tc_write_ra() и tc_write_rc().

Вот часть моего кода, которая, по моему мнению, может помочь ответить на мою проблему.Если вам нужно больше кода, спросите в комментариях.

#define TIMER_DOOR          TC1
#define TIMER_DOOR_ID       ID_TC1
#define TIMER_DOOR_CHANNEL  1
#define TIMER_DOOR_Handler  TC1_Handler
#define TIMER_DOOR_IRQn     TC1_IRQn

...

void ConfigureDoorTimer(uint32_t ra, uint32_t rc)
{
    uint32_t debug1, debug2 = 0;
    TcChannel *tc_channel =0;
    sysclk_enable_peripheral_clock(TIMER_DOOR_ID);
    tc_init(TIMER_DOOR, TIMER_DOOR_CHANNEL,
                                            TC_CMR_TCCLKS_TIMER_CLOCK4        // Clock selected: MCK/128 : 1 cycle = 128 / 120000000 = 1.06 usec
                                            | TC_CMR_WAVE                     // Waveform mode is enabled
                                            | TC_CMR_WAVSEL_UP_RC);           // UP mode with automatic trigger on RC Compare
    tc_channel = TIMER_DOOR->TC_CHANNEL + TIMER_DOOR_CHANNEL;
    tc_channel->TC_CMR = tc_channel->TC_CMR;
    debug1 = (uint32_t) tc_channel->TC_CMR & TC_CMR_WAVE;
    /* Configure max value before overflow */
    tc_write_ra(TIMER_DOOR, TIMER_DOOR_CHANNEL, ra);
    tc_write_rc(TIMER_DOOR, TIMER_DOOR_CHANNEL, rc);

    NVIC_EnableIRQ(TIMER_DOOR_IRQn);
    NVIC_SetPriority(TIMER_DOOR_IRQn, TIMER_DOOR_IRQ_PRIO);
    tc_enable_interrupt(TIMER_DOOR, TIMER_DOOR_CHANNEL, TC_IER_CPAS | TC_IER_CPCS);//Enables the RA, RC Compare Interrupt
    tc_stop(TIMER_DOOR, TIMER_DOOR_CHANNEL);          // will be started later
}

Вы можете видеть в этом примере, что я пытался прочитать регистр CMR, применяя к нему маску = TC_CMR_WAVE, потому что это сказано в Sam4sd16cтаблица данных, что если если TC_CMRx.WAVE = 1, то регистр RA доступен W / R.И во время отладки я заметил, что этот тест был правдивым ... Так что я не знаю, почему я не могу написать на таймере 1 :(

1 Ответ

0 голосов
/ 24 октября 2018

Что ж, я продолжал проверять свой код и, кажется, понял, в чем ошибка ...

В TC0 есть 3 таймера: ID_TC0 (канал 0), ID_TC1 (канал 1)и ID_TC2 (канал 2)

И в TC1 также есть 3 таймера: ID_TC3 (канал 0), ID_TC4 (канал 1) и ID_TC5 (канал 2)

Для активации определенного канала, вы должны активировать правую периферию часов, используя функцию sysclk_enable_peripheral_clock(TIMER_DOOR_ID), все оставшиеся функции, вызываемые в приведенном выше коде, работают хорошо после применения коррекции.

...