Перейти к содержанию
    

ATSAMD - 2 UARTa

Работающая конфигурация UART -

PM->APBCMASK.reg |= PM_APBCMASK_SERCOM0;
    
    /* Enable peripheral Multiplexer */
    PORT->Group[0].PINCFG[6].reg = 0 | 1 * PORT_PINCFG_PMUXEN;        // TXD
    PORT->Group[0].PINCFG[5].reg =  0                                // RXD
                                    | 1 * PORT_PINCFG_INEN
                                    | 1 * PORT_PINCFG_PULLEN
                                    | 1 * PORT_PINCFG_PMUXEN;
    
    /* Peripheral Function D selected */
    PORT->Group[0].PMUX[6/2].bit.PMUXE = PORT_PMUX_PMUXE_D_Val;        // TXD
    PORT->Group[0].PMUX[5/2].bit.PMUXO = PORT_PMUX_PMUXO_D_Val;        // RXD
        
    /* Baudrate Register */
    uint64_t BaudReg_S0 = (uint64_t)(65536 * (f_cpu - (16 * baud)) / f_cpu);
        
    /*   */
    GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(0)
                        | GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE)
                        | GCLK_CLKCTRL_CLKEN;
    
    
    
    /*   */
    SERCOM0->USART.CTRLA.reg =  0
                                | 1 * SERCOM_USART_CTRLA_DORD                    // Data Order LSB
                                | SERCOM_USART_CTRLA_TXPO(0x1)                    // Transmit Data PA6 SERCOM0_PAD[2]
                                | SERCOM_USART_CTRLA_RXPO(0x1)                    // Receive Data PA5 SERCOM0_PAD[1]
                                | SERCOM_USART_CTRLA_SAMPR(0x0)                    // Sample Rate 16x
                                | 1 * SERCOM_USART_CTRLA_RUNSTDBY                // Run In Standby
                                | 1 * SERCOM_USART_CTRLA_MODE_USART_INT_CLK;    // Operating Mode, Internal Clock
    
    //while(SERCOM0->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE);    // synchronization busy
    
    SERCOM0->USART.CTRLB.reg =  0
                                |SERCOM_USART_CTRLB_CHSIZE(0x0)                    // Character Size, 8 bits
                                | 1 * SERCOM_USART_CTRLB_TXEN                    // TX Enable
                                | 1 * SERCOM_USART_CTRLB_RXEN;                    // RX Enable
    
    while(SERCOM0->USART.SYNCBUSY.bit.CTRLB);                    // synchronization
        
    SERCOM0->USART.BAUD.reg = (uint16_t)BaudReg_S0;                            // Baudrate value
    
    SERCOM0->USART.CTRLA.reg |= SERCOM_USART_CTRLA_ENABLE;                    // SERCOM0 peripheral enabled
    while(SERCOM0->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE);        // synchronization busy

 

Добавляю такой же конфиг для другого UART -

зависает на последней строке

 while(SERCOM2->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE);        // synchronization busy

 

Где я ошибаюсь ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 hours ago, Kolobokov said:

зависает на последней строке

 while(SERCOM2->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE);        // synchronization busy

Где я ошибаюсь ?

зависание на этой строке может происходить в случае если для соответствующего SERCOM не включено тактирование. Проверено личным, очень скромным, опытом.

 

вероятно для второго уарта  вот в этой строке

 

 

    GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(0)
                        | GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE)
                        | GCLK_CLKCTRL_CLKEN;

у Вас не исправлено SERCOM0_GCLK_ID_CORE на SERCOM2_GCLK_ID_CORE, или что то в этом духе.

По возможности, прошу отписаться, в этом ли была причина.

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22.09.2021 в 12:08, nanorobot сказал:

вероятно для второго уарта  вот в этой строке

 

 


    GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(0)
                        | GCLK_CLKCTRL_ID(SERCOM0_GCLK_ID_CORE)
                        | GCLK_CLKCTRL_CLKEN;

у Вас не исправлено SERCOM0_GCLK_ID_CORE на SERCOM2_GCLK_ID_CORE, или что то в этом духе.

По возможности, прошу отписаться, в этом ли была причина.

 

Нет, там был именно SERCOM2_GCLK_ID_CORE

Причина была вот эта -

GCLK->CLKCTRL.reg I= ...

 

надо было -

GCLK->CLKCTRL.reg = etc...

 

теперь работает

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...