Merge pull request #596 from hexluthor/cc2538-uart-baudrate

cc2538: Support any UART baudrate.
This commit is contained in:
George Oikonomou 2014-04-13 02:51:58 +01:00
commit 22554e6d72
3 changed files with 18 additions and 53 deletions

View file

@ -92,7 +92,7 @@ reset(void)
uint32_t lchr; uint32_t lchr;
/* Make sure the UART is disabled before trying to configure it */ /* Make sure the UART is disabled before trying to configure it */
REG(UART_BASE | UART_CTL) = UART_CTL_TXE | UART_CTL_RXE; REG(UART_BASE | UART_CTL) = UART_CTL_VALUE;
/* Clear error status */ /* Clear error status */
REG(UART_BASE | UART_ECR) = 0xFF; REG(UART_BASE | UART_ECR) = 0xFF;
@ -165,11 +165,10 @@ uart_init(void)
UART_IFLS_RXIFLSEL_1_8 | UART_IFLS_TXIFLSEL_1_2; UART_IFLS_RXIFLSEL_1_8 | UART_IFLS_TXIFLSEL_1_2;
/* Make sure the UART is disabled before trying to configure it */ /* Make sure the UART is disabled before trying to configure it */
REG(UART_BASE | UART_CTL) = UART_CTL_TXE | UART_CTL_RXE; REG(UART_BASE | UART_CTL) = UART_CTL_VALUE;
/* Baud Rate Generation */ /* Baud Rate Generation */
REG(UART_BASE | UART_IBRD) = UART_CONF_IBRD; uart_set_baudrate(UART_CONF_BAUD_RATE);
REG(UART_BASE | UART_FBRD) = UART_CONF_FBRD;
/* UART Control: 8N1 with FIFOs */ /* UART Control: 8N1 with FIFOs */
REG(UART_BASE | UART_LCRH) = UART_LCRH_WLEN_8 | UART_LCRH_FEN; REG(UART_BASE | UART_LCRH) = UART_LCRH_WLEN_8 | UART_LCRH_FEN;

View file

@ -65,50 +65,24 @@
* \name Baud rate defines * \name Baud rate defines
* *
* Used in uart_init() to set the values of UART_IBRD and UART_FBRD in order to * Used in uart_init() to set the values of UART_IBRD and UART_FBRD in order to
* achieve some standard baud rates. These defines assume that the UART is * achieve some standard baud rates.
* clocked at 16MHz and that Clock Div is 16 (UART_CTL:HSE clear)
* @{ * @{
*/ */
#define UART_IBRD_9600 104 /**< IBRD value for baud rate 9600 */ #define UART_CLOCK_RATE 16000000 /* 16 MHz */
#define UART_FBRD_9600 11 /**< FBRD value for baud rate 9600 */ #define UART_CTL_HSE_VALUE 0
#define UART_IBRD_38400 26 /**< IBRD value for baud rate 38400 */ #define UART_CTL_VALUE ( UART_CTL_RXE | UART_CTL_TXE | (UART_CTL_HSE_VALUE << 5) )
#define UART_FBRD_38400 3 /**< FBRD value for baud rate 38400 */
#define UART_IBRD_57600 17 /**< IBRD value for baud rate 57600 */ /* DIV_ROUND() divides integers while avoiding a rounding error: */
#define UART_FBRD_57600 24 /**< FBRD value for baud rate 57600 */ #define DIV_ROUND(num, denom) ( ((num) + (denom) / 2) / (denom) )
#define UART_IBRD_115200 8 /**< IBRD value for baud rate 115200 */
#define UART_FBRD_115200 44 /**< FBRD value for baud rate 115200 */ #define BAUD2BRD(baud) DIV_ROUND(UART_CLOCK_RATE << (UART_CTL_HSE_VALUE + 2), (baud))
#define UART_IBRD_230400 4 /**< IBRD value for baud rate 230400 */
#define UART_FBRD_230400 22 /**< FBRD value for baud rate 230400 */ #define uart_set_baudrate(baud) do { \
#define UART_IBRD_460800 2 /**< IBRD value for baud rate 460800 */ REG(UART_BASE | UART_IBRD) = BAUD2BRD(baud) >> 6; \
#define UART_FBRD_460800 11 /**< FBRD value for baud rate 460800 */ REG(UART_BASE | UART_FBRD) = BAUD2BRD(baud) & 0x3f; \
REG(UART_BASE | UART_LCRH) = REG(UART_BASE | UART_LCRH); \
} while(0)
#if UART_CONF_BAUD_RATE==9600
#define UART_CONF_IBRD UART_IBRD_9600
#define UART_CONF_FBRD UART_FBRD_9600
#elif UART_CONF_BAUD_RATE==38400
#define UART_CONF_IBRD UART_IBRD_38400
#define UART_CONF_FBRD UART_FBRD_38400
#elif UART_CONF_BAUD_RATE==57600
#define UART_CONF_IBRD UART_IBRD_57600
#define UART_CONF_FBRD UART_FBRD_57600
#elif UART_CONF_BAUD_RATE==115200
#define UART_CONF_IBRD UART_IBRD_115200
#define UART_CONF_FBRD UART_FBRD_115200
#elif UART_CONF_BAUD_RATE==230400
#define UART_CONF_IBRD UART_IBRD_230400
#define UART_CONF_FBRD UART_FBRD_230400
#elif UART_CONF_BAUD_RATE==460800
#define UART_CONF_IBRD UART_IBRD_460800
#define UART_CONF_FBRD UART_FBRD_460800
#else /* Bail out with an error unless the user provided custom values */
#if !(defined UART_CONF_IBRD && defined UART_CONF_FBRD)
#error "UART baud rate misconfigured and custom IBRD/FBRD values not provided"
#error "Check the value of UART_CONF_BAUD_RATE in contiki-conf.h or project-conf.h"
#error "Supported values are 9600, 38400, 57600, 115200, 230400 and 460800."
#error "Alternatively, you can provide custom values for "
#error "UART_CONF_IBRD and UART_CONF_FBRD"
#endif
#endif
/** @} */ /** @} */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** \name UART Register Offsets /** \name UART Register Offsets

View file

@ -367,14 +367,6 @@ By default, the CC2538 UART is configured with a baud rate of 115200. It is easy
#define UART_CONF_BAUD_RATE 230400 #define UART_CONF_BAUD_RATE 230400
Currently, this configuration directive only supports values 115200, 230400 and 460800. Custom baud rates can also be achieved by following the steps below:
* Configure `UART_CONF_BAUD_RATE` with an unsupported value to prevent it from auto-choosing values for IBRD and FBRD. For instance, in your project-conf.h you can do:
#define UART_CONF_BAUD_RATE 0
* Provide custom values for `UART_CONF_IBRD` and `UART_CONF_FBRD` according to the guidelines in the CC2538 User Guide.
RF and USB DMA RF and USB DMA
-------------- --------------
Transfers between RAM and the RF and USB will be conducted with DMA. If for whatever reason you wish to disable this, here are the relevant configuration lines. Transfers between RAM and the RF and USB will be conducted with DMA. If for whatever reason you wish to disable this, here are the relevant configuration lines.