16.8.2.1.3 Workflow

  1. Create a module software instance structure for the USART module to store the USART driver state while it is in use.
    struct usart_module usart_instance;
    
    Note: This should never go out of scope as long as the module is in use. In most cases, this should be global.
  2. Configure the USART module.
    1. Create a USART module configuration struct, which can be filled out to adjust the configuration of a physical USART peripheral.
      struct usart_config config_usart;
      
    2. Initialize the USART configuration struct with the module's default values.
      usart_get_config_defaults(&config_usart);
      
      Note: This should always be performed before using the configuration struct to ensure that all values are initialized to known default settings.
    3. Alter the USART settings to configure the physical pinout, baudrate, and other relevant parameters.
      config_usart.baudrate    = 9600;
      config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
      config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
      config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
      config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
      config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
      
    4. Configure the USART module with the desired settings, retrying while the driver is busy until the configuration is stressfully set.
      while (usart_init(&usart_instance,
              EDBG_CDC_MODULE, &config_usart) != STATUS_OK) {
      }
      
    5. Enable the USART module.
      usart_enable(&usart_instance);
      
  3. Configure the USART callbacks.
    1. Register the TX and RX callback functions with the driver.
      usart_register_callback(&usart_instance,
              usart_write_callback, USART_CALLBACK_BUFFER_TRANSMITTED);
      usart_register_callback(&usart_instance,
              usart_read_callback, USART_CALLBACK_BUFFER_RECEIVED);
      
    2. Enable the TX and RX callbacks so that they will be called by the driver when appropriate.
      usart_enable_callback(&usart_instance, USART_CALLBACK_BUFFER_TRANSMITTED);
      usart_enable_callback(&usart_instance, USART_CALLBACK_BUFFER_RECEIVED);