ATSAMD10 UART config

Go To Last Post
5 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Hi all

 

There are errors in this configuration ?

 

 

void UART_Init()
{
    PM->APBCMASK.reg |= 0
                                       | 1 * PM_APBCMASK_SERCOM2
                                       | 1 * PM_APBCMASK_SERCOM0;        //
                            
    //***********************************************************************************************//                    
    //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[3].bit.PMUXO = PORT_PMUX_PMUXO_D_Val;        // TXD
    PORT->Group[0].PMUX[2].bit.PMUXE = PORT_PMUX_PMUXE_D_Val;        // RXD
    
    
    /*   */
    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
    
   
    SERCOM0->USART.BAUD.reg = 55470;                            // Baudrate value

 

    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.CTRLA.reg |= SERCOM_USART_CTRLA_ENABLE;        // SERCOM0 peripheral enabled
    
    while(SERCOM0->USART.SYNCBUSY.reg & SERCOM_USART_SYNCBUSY_ENABLE);    // synchronization busy

}

This topic has a solution.
Last Edited: Mon. Sep 20, 2021 - 01:39 PM
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

 

    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[3].bit.PMUXO = PORT_PMUX_PMUXO_D_Val;        // TXD
    PORT->Group[0].PMUX[2].bit.PMUXE = PORT_PMUX_PMUXE_D_Val;        // RXD

PA05, PA06 are updated in PINCFG but PA07 and PA04 in PMUX.
/Lars

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Lajon wrote:

 

    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[3].bit.PMUXO = PORT_PMUX_PMUXO_D_Val;        // TXD
    PORT->Group[0].PMUX[2].bit.PMUXE = PORT_PMUX_PMUXE_D_Val;        // RXD

PA05, PA06 are updated in PINCFG but PA07 and PA04 in PMUX.
/Lars

 

Сan I explain it in more detail ?

 

I think about that -

Pmux [0]  = Pins 0 and 1
Pmux [1] = pins 2 and 3
Pmux [2] = pins 4 and 5
Pmux [3] = pins 6 and 7

etc.

 

***************************************************

and

 

     PORT->Group[0].DIRSET.reg=PORT_PA19;
     PORT->Group[0].PINCFG[19].reg |= PORT_PINCFG_PMUXEN;
     PORT->Group[0].PMUX[19 / 2].bit.PMUXO = 4;

 

 

This reply has been marked as the solution. 
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

Kolobokov wrote:

Pmux [0]  = Pins 0 and 1
Pmux [1] = pins 2 and 3
Pmux [2] = pins 4 and 5
Pmux [3] = pins 6 and 7

Yes that's right but:

 In PMUX[3] you set the odd config, this is for PA07.

 In PMUX[2] you set the even config, this is for PA04.
/Lars

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0
The correct option - 


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.PMUXO = PORT_PMUX_PMUXE_D_Val;        // TXD
PORT->Group[0].PMUX[5/2].bit.PMUXE = PORT_PMUX_PMUXO_D_Val;        // RXD