- fix F411 F334 systeminit when HSI used - portinout always read IDR regardless of port direction
Fork of mbed-src by
Diff: targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/serial_api.c
- Revision:
- 300:55638feb26a4
- Parent:
- 288:17565898c031
--- a/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/serial_api.c Wed Aug 27 04:00:07 2014 +0100 +++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/serial_api.c Wed Aug 27 08:45:06 2014 +0100 @@ -29,22 +29,22 @@ static uint32_t serial_irq_ids[UART_NUM] = {0}; static uart_irq_handler irq_handler; -static uint32_t acceptedSpeeds[16][2] = {{1200,UART_BAUDRATE_BAUDRATE_Baud1200}, - {2400,UART_BAUDRATE_BAUDRATE_Baud2400}, - {4800,UART_BAUDRATE_BAUDRATE_Baud4800}, - {9600,UART_BAUDRATE_BAUDRATE_Baud9600}, - {14400,UART_BAUDRATE_BAUDRATE_Baud14400}, - {19200,UART_BAUDRATE_BAUDRATE_Baud19200}, - {28800,UART_BAUDRATE_BAUDRATE_Baud28800}, - {38400,UART_BAUDRATE_BAUDRATE_Baud38400}, - {57600,UART_BAUDRATE_BAUDRATE_Baud57600}, - {76800,UART_BAUDRATE_BAUDRATE_Baud76800}, - {115200,UART_BAUDRATE_BAUDRATE_Baud115200}, - {230400,UART_BAUDRATE_BAUDRATE_Baud230400}, - {250000,UART_BAUDRATE_BAUDRATE_Baud250000}, - {460800,UART_BAUDRATE_BAUDRATE_Baud460800}, - {921600,UART_BAUDRATE_BAUDRATE_Baud921600}, - {1000000,UART_BAUDRATE_BAUDRATE_Baud1M}}; +static uint32_t acceptedSpeeds[16][2] = {{1200, UART_BAUDRATE_BAUDRATE_Baud1200}, + {2400, UART_BAUDRATE_BAUDRATE_Baud2400}, + {4800, UART_BAUDRATE_BAUDRATE_Baud4800}, + {9600, UART_BAUDRATE_BAUDRATE_Baud9600}, + {14400, UART_BAUDRATE_BAUDRATE_Baud14400}, + {19200, UART_BAUDRATE_BAUDRATE_Baud19200}, + {28800, UART_BAUDRATE_BAUDRATE_Baud28800}, + {38400, UART_BAUDRATE_BAUDRATE_Baud38400}, + {57600, UART_BAUDRATE_BAUDRATE_Baud57600}, + {76800, UART_BAUDRATE_BAUDRATE_Baud76800}, + {115200, UART_BAUDRATE_BAUDRATE_Baud115200}, + {230400, UART_BAUDRATE_BAUDRATE_Baud230400}, + {250000, UART_BAUDRATE_BAUDRATE_Baud250000}, + {460800, UART_BAUDRATE_BAUDRATE_Baud460800}, + {921600, UART_BAUDRATE_BAUDRATE_Baud921600}, + {1000000, UART_BAUDRATE_BAUDRATE_Baud1M}}; int stdio_uart_inited = 0; serial_t stdio_uart; @@ -52,78 +52,81 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) { UARTName uart = UART_0; - + MBED_ASSERT((int)uart != NC); - + obj->uart = (NRF_UART_Type *)uart; - + //pin configurations -- //outputs - NRF_GPIO->DIR |= (1<<tx);//TX_PIN_NUMBER); - NRF_GPIO->DIR |= (1<<RTS_PIN_NUMBER); + NRF_GPIO->DIR |= (1 << tx); //TX_PIN_NUMBER); + NRF_GPIO->DIR |= (1 << RTS_PIN_NUMBER); - NRF_GPIO->DIR &= ~(1<<rx);//RX_PIN_NUMBER); - NRF_GPIO->DIR &= ~(1<<CTS_PIN_NUMBER); - + NRF_GPIO->DIR &= ~(1 << rx); //RX_PIN_NUMBER); + NRF_GPIO->DIR &= ~(1 << CTS_PIN_NUMBER); + obj->uart->PSELRTS = RTS_PIN_NUMBER; - obj->uart->PSELTXD = tx;//TX_PIN_NUMBER; - + obj->uart->PSELTXD = tx; //TX_PIN_NUMBER; + //inputs obj->uart->PSELCTS = CTS_PIN_NUMBER; - obj->uart->PSELRXD = rx;//RX_PIN_NUMBER; - - + obj->uart->PSELRXD = rx; //RX_PIN_NUMBER; + + // set default baud rate and format serial_baud (obj, 9600); serial_format(obj, 8, ParityNone, 1); - - obj->uart->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos);; + + obj->uart->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos); obj->uart->TASKS_STARTTX = 1; obj->uart->TASKS_STARTRX = 1; - obj->uart->EVENTS_RXDRDY =0; - + obj->uart->EVENTS_RXDRDY = 0; + obj->index = 0; - + // set rx/tx pins in PullUp mode pin_mode(tx, PullUp); pin_mode(rx, PullUp); - + if (uart == STDIO_UART) { stdio_uart_inited = 1; memcpy(&stdio_uart, obj, sizeof(serial_t)); } } -void serial_free(serial_t *obj) { +void serial_free(serial_t *obj) +{ serial_irq_ids[obj->index] = 0; } // serial_baud // set the baud rate, taking in to account the current SystemFrequency -void serial_baud(serial_t *obj, int baudrate) { - if(baudrate<=1200){ +void serial_baud(serial_t *obj, int baudrate) +{ + if (baudrate<=1200) { obj->uart->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200; return; } - - for(int i=1;i<16;i++){ - if(baudrate<acceptedSpeeds[i][0]){ - obj->uart->BAUDRATE = acceptedSpeeds[i-1][1]; + + for (int i = 1; i<16; i++) { + if (baudrate<acceptedSpeeds[i][0]) { + obj->uart->BAUDRATE = acceptedSpeeds[i - 1][1]; return; } } obj->uart->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M; } -void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) { +void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) +{ // 0: 1 stop bits, 1: 2 stop bits - // int parity_enable, parity_select; + // int parity_enable, parity_select; switch (parity) { case ParityNone: - obj->uart->CONFIG = 0; - break; + obj->uart->CONFIG = 0; + break; default: - obj->uart->CONFIG = (UART_CONFIG_PARITY_Included<<UART_CONFIG_PARITY_Pos); + obj->uart->CONFIG = (UART_CONFIG_PARITY_Included << UART_CONFIG_PARITY_Pos); return; } //no Flow Control @@ -132,74 +135,85 @@ //****************************************************************************** // * INTERRUPT HANDLING //****************************************************************************** -static inline void uart_irq(uint32_t iir, uint32_t index) { +static inline void uart_irq(uint32_t iir, uint32_t index) +{ SerialIrq irq_type; switch (iir) { case 1: irq_type = TxIrq; - break; + break; case 2: irq_type = RxIrq; - break; - - default: return; + break; + + default: + return; } - - if (serial_irq_ids[index] != 0){ + + if (serial_irq_ids[index] != 0) { irq_handler(serial_irq_ids[index], irq_type); } } + #ifdef __cplusplus extern "C" { #endif void UART0_IRQHandler() { - uint32_t irtype =0; - - if(NRF_UART0->EVENTS_TXDRDY){ - irtype =1; - } - else if(NRF_UART0->EVENTS_RXDRDY){ - irtype =2; + uint32_t irtype = 0; + + if (NRF_UART0->EVENTS_TXDRDY) { + irtype = 1; + } else if (NRF_UART0->EVENTS_RXDRDY) { + irtype = 2; } uart_irq(irtype, 0); } + #ifdef __cplusplus } #endif -void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) { - irq_handler = handler; +void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) +{ + irq_handler = handler; serial_irq_ids[obj->index] = id; } -void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { +void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) +{ IRQn_Type irq_n = (IRQn_Type)0; switch ((int)obj->uart) { - case UART_0: irq_n=UART0_IRQn ; + case UART_0: + irq_n = UART0_IRQn; break; } - + if (enable) { switch (irq) { - case RxIrq: obj->uart->INTENSET |= (UART_INTENSET_RXDRDY_Msk);break; - case TxIrq: obj->uart->INTENSET |= (UART_INTENSET_TXDRDY_Msk);break; + case RxIrq: + obj->uart->INTENSET |= (UART_INTENSET_RXDRDY_Msk); + break; + case TxIrq: + obj->uart->INTENSET |= (UART_INTENSET_TXDRDY_Msk); + break; } NVIC_SetPriority(irq_n, 3); NVIC_EnableIRQ(irq_n); - } - else { // disable + } else { // disable int all_disabled = 0; switch (irq) { - case RxIrq: obj->uart->INTENSET &= ~(UART_INTENSET_RXDRDY_Msk); - all_disabled = (obj->uart->INTENSET& (UART_INTENSET_TXDRDY_Msk))==0; - break; - case TxIrq: obj->uart->INTENSET &= ~(UART_INTENSET_TXDRDY_Msk); - all_disabled = (obj->uart->INTENSET& (UART_INTENSET_RXDRDY_Msk))==0; - break; + case RxIrq: + obj->uart->INTENSET &= ~(UART_INTENSET_RXDRDY_Msk); + all_disabled = (obj->uart->INTENSET & (UART_INTENSET_TXDRDY_Msk))==0; + break; + case TxIrq: + obj->uart->INTENSET &= ~(UART_INTENSET_TXDRDY_Msk); + all_disabled = (obj->uart->INTENSET & (UART_INTENSET_RXDRDY_Msk))==0; + break; } - - if (all_disabled){ + + if (all_disabled) { NVIC_DisableIRQ(irq_n); } } @@ -208,35 +222,43 @@ //****************************************************************************** //* READ/WRITE //****************************************************************************** -int serial_getc(serial_t *obj) { - while (!serial_readable(obj)); - +int serial_getc(serial_t *obj) +{ + while (!serial_readable(obj)) { + } + obj->uart->EVENTS_RXDRDY = 0; - + return (uint8_t)obj->uart->RXD; } -void serial_putc(serial_t *obj, int c) { +void serial_putc(serial_t *obj, int c) +{ obj->uart->TXD = (uint8_t)c; - - while (!serial_writable(obj)); - - obj->uart->EVENTS_TXDRDY =0; + + while (!serial_writable(obj)) { + } + + obj->uart->EVENTS_TXDRDY = 0; } -int serial_readable(serial_t *obj) { +int serial_readable(serial_t *obj) +{ return (obj->uart->EVENTS_RXDRDY == 1); } -int serial_writable(serial_t *obj) { +int serial_writable(serial_t *obj) +{ return (obj->uart->EVENTS_TXDRDY ==1); } -void serial_break_set(serial_t *obj) { +void serial_break_set(serial_t *obj) +{ obj->uart->TASKS_SUSPEND = 1; } -void serial_break_clear(serial_t *obj) { +void serial_break_clear(serial_t *obj) +{ obj->uart->TASKS_STARTTX = 1; obj->uart->TASKS_STARTRX = 1; }