赞
踩
使用nRF52840进行开发的时候需要用到UART通信功能,同时我们也需要串口进行打印和调试。所以进行了双UART串口功能的开发。我这边在nRF52840 DK开发板上面进行开发。nRF52840的UART的PIN脚可以任选4个通用GPIO Pin脚。
官方例程中,使用了UART0作为虚拟COM串口,这个COM串口是通过USB引出来的。所以使用这个UART0作为调试打印串口。
接下来,开发UART1通信功能。任选四个引脚:
- #define UART1_RX_PIN_NUMBER NRF_GPIO_PIN_MAP(1, 4)
- #define UART1_TX_PIN_NUMBER NRF_GPIO_PIN_MAP(1, 2)
- #define UART1_CTS_PIN_NUMBER NRF_GPIO_PIN_MAP(1, 3)
- #define UART1_RTS_PIN_NUMBER NRF_GPIO_PIN_MAP(1, 1)
user_uart.c
- #include <stdbool.h>
- #include <stdint.h>
- #include <stdio.h>
- #include "app_uart.h"
- #include "app_error.h"
- #include "nrf_delay.h"
- #include "nrf.h"
- #include "bsp.h"
- #if defined (UART_PRESENT)
- #include "nrf_uart.h"
- #endif
- #if defined (UARTE_PRESENT)
- #include "nrf_uarte.h"
- #endif
-
-
- //#define ENABLE_LOOPBACK_TEST /**< if defined, then this example will be a loopback test, which means that TX should be connected to RX to get data loopback. */
-
- #define MAX_TEST_DATA_BYTES (15U) /**< max number of test bytes to be used for tx and rx. */
- #define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */
- #define UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */
-
- void uart_error_handle(app_uart_evt_t * p_event)
- {
- if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
- {
- APP_ERROR_HANDLER(p_event->data.error_communication);
- }
- else if (p_event->evt_type == APP_UART_FIFO_ERROR)
- {
- APP_ERROR_HANDLER(p_event->data.error_code);
- }
- }
-
- /**@brief Function for handling app_uart events.
- *
- * @details This function will receive a single character from the app_uart module and append it to
- * a string. The string will be be sent over BLE when the last character received was a
- * 'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
- */
- /**@snippet [Handling the data received over UART] */
- void uart_event_handle(app_uart_evt_t * p_event)
- {
- // static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
- // static uint8_t index = 0;
- uint32_t err_code;
- uint8_t data;
-
- switch (p_event->evt_type)
- {
- case APP_UART_DATA_READY:
- UNUSED_VARIABLE(app_uart_get(&data));
- while (app_uart_put(data) != NRF_SUCCESS);
-
- break;
-
- case APP_UART_COMMUNICATION_ERROR:
- APP_ERROR_HANDLER(p_event->data.error_communication);
- break;
-
- case APP_UART_FIFO_ERROR:
- APP_ERROR_HANDLER(p_event->data.error_code);
- break;
-
- default:
- break;
- }
- }
- /**@snippet [Handling the data received over UART] */
-
- /* When UART is used for communication with the host do not use flow control.*/
- #define UART_HWFC APP_UART_FLOW_CONTROL_DISABLED
-
- /**@brief Function for initializing the UART module.
- */
- /**@snippet [UART Initialization] */
- void uart_init(void)
- {
- uint32_t err_code;
- app_uart_comm_params_t const uart0_comm_params =
- {
- .rx_pin_no = RX_PIN_NUMBER,
- .tx_pin_no = TX_PIN_NUMBER,
- .rts_pin_no = RTS_PIN_NUMBER,
- .cts_pin_no = CTS_PIN_NUMBER,
- .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
- .use_parity = false,
- #if defined (UART_PRESENT)
- .baud_rate = NRF_UART_BAUDRATE_115200
- #else
- .baud_rate = NRF_UARTE_BAUDRATE_115200
- #endif
- };
-
- APP_UART_FIFO_INIT(APP_UART_DRIVER_INSTANCE,
- &uart0_comm_params,
- UART_RX_BUF_SIZE,
- UART_TX_BUF_SIZE,
- NULL,
- APP_IRQ_PRIORITY_LOWEST,
- err_code);
- APP_ERROR_CHECK(err_code);
-
-
- const app_uart_comm_params_t uart1_comm_params =
- {
- UART1_RX_PIN_NUMBER,
- UART1_TX_PIN_NUMBER,
- UART1_RTS_PIN_NUMBER,
- UART1_CTS_PIN_NUMBER,
- UART_HWFC,
- false,
- #if defined (UART_PRESENT)
- NRF_UART_BAUDRATE_115200
- #else
- NRF_UARTE_BAUDRATE_115200
- #endif
- };
-
- APP_UART_FIFO_INIT(APP_UART1_DRIVER_INSTANCE,
- &uart1_comm_params,
- UART_RX_BUF_SIZE,
- UART_TX_BUF_SIZE,
- uart_event_handle,
- APP_IRQ_PRIORITY_LOWEST,
- err_code);
-
- APP_ERROR_CHECK(err_code);
- }
app_uart.h
- /**@file
- *
- * @defgroup app_uart UART module
- * @{
- * @ingroup app_common
- *
- * @brief UART module interface.
- */
-
- #ifndef APP_UART_H__
- #define APP_UART_H__
-
- #include <stdint.h>
- #include <stdbool.h>
- #include "app_util_platform.h"
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #define UART_PIN_DISCONNECTED 0xFFFFFFFF /**< Value indicating that no pin is connected to this UART register. */
-
- /**@brief UART Flow Control modes for the peripheral.
- */
- typedef enum
- {
- APP_UART_FLOW_CONTROL_DISABLED, /**< UART Hw Flow Control is disabled. */
- APP_UART_FLOW_CONTROL_ENABLED, /**< Standard UART Hw Flow Control is enabled. */
- } app_uart_flow_control_t;
-
- /**@brief UART communication structure holding configuration settings for the peripheral.
- */
- typedef struct
- {
- uint32_t rx_pin_no; /**< RX pin number. */
- uint32_t tx_pin_no; /**< TX pin number. */
- uint32_t rts_pin_no; /**< RTS pin number, only used if flow control is enabled. */
- uint32_t cts_pin_no; /**< CTS pin number, only used if flow control is enabled. */
- app_uart_flow_control_t flow_control; /**< Flow control setting, if flow control is used, the system will use low power UART mode, based on CTS signal. */
- bool use_parity; /**< Even parity if TRUE, no parity if FALSE. */
- uint32_t baud_rate; /**< Baud rate configuration. */
- } app_uart_comm_params_t;
-
- /**@brief UART buffer for transmitting/receiving data.
- */
- typedef struct
- {
- uint8_t * rx_buf; /**< Pointer to the RX buffer. */
- uint32_t rx_buf_size; /**< Size of the RX buffer. */
- uint8_t * tx_buf; /**< Pointer to the TX buffer. */
- uint32_t tx_buf_size; /**< Size of the TX buffer. */
- } app_uart_buffers_t;
-
- /**@brief Enumeration which defines events used by the UART module upon data reception or error.
- *
- * @details The event type is used to indicate the type of additional information in the event
- * @ref app_uart_evt_t.
- */
- typedef enum
- {
- APP_UART_DATA_READY, /**< An event indicating that UART data has been received. The data is available in the FIFO and can be fetched using @ref app_uart_get. */
- APP_UART_FIFO_ERROR, /**< An error in the FIFO module used by the app_uart module has occured. The FIFO error code is stored in app_uart_evt_t.data.error_code field. */
- APP_UART_COMMUNICATION_ERROR, /**< An communication error has occured during reception. The error is stored in app_uart_evt_t.data.error_communication field. */
- APP_UART_TX_EMPTY, /**< An event indicating that UART has completed transmission of all available data in the TX FIFO. */
- APP_UART_DATA, /**< An event indicating that UART data has been received, and data is present in data field. This event is only used when no FIFO is configured. */
- } app_uart_evt_type_t;
-
- /**@brief Struct containing events from the UART module.
- *
- * @details The app_uart_evt_t is used to notify the application of asynchronous events when data
- * are received on the UART peripheral or in case an error occured during data reception.
- */
- typedef struct
- {
- app_uart_evt_type_t evt_type; /**< Type of event. */
- union
- {
- uint32_t error_communication; /**< Field used if evt_type is: APP_UART_COMMUNICATION_ERROR. This field contains the value in the ERRORSRC register for the UART peripheral. The UART_ERRORSRC_x defines from nrf5x_bitfields.h can be used to parse the error code. See also the \nRFXX Series Reference Manual for specification. */
- uint32_t error_code; /**< Field used if evt_type is: NRF_ERROR_x. Additional status/error code if the error event type is APP_UART_FIFO_ERROR. This error code refer to errors defined in nrf_error.h. */
- uint8_t value; /**< Field used if evt_type is: NRF_ERROR_x. Additional status/error code if the error event type is APP_UART_FIFO_ERROR. This error code refer to errors defined in nrf_error.h. */
- } data;
- } app_uart_evt_t;
-
- /**@brief Function for handling app_uart event callback.
- *
- * @details Upon an event in the app_uart module this callback function will be called to notify
- * the application about the event.
- *
- * @param[in] p_app_uart_event Pointer to UART event.
- */
- typedef void (* app_uart_event_handler_t) (app_uart_evt_t * p_app_uart_event);
-
- /**@brief Macro for safe initialization of the UART module in a single user instance when using
- * a FIFO together with UART.
- *
- * @param[in] P_COMM_PARAMS Pointer to a UART communication structure: app_uart_comm_params_t
- * @param[in] RX_BUF_SIZE Size of desired RX buffer, must be a power of 2 or ZERO (No FIFO).
- * @param[in] TX_BUF_SIZE Size of desired TX buffer, must be a power of 2 or ZERO (No FIFO).
- * @param[in] EVT_HANDLER Event handler function to be called when an event occurs in the
- * UART module.
- * @param[in] IRQ_PRIO IRQ priority, app_irq_priority_t, for the UART module irq handler.
- * @param[out] ERR_CODE The return value of the UART initialization function will be
- * written to this parameter.
- *
- * @note Since this macro allocates a buffer and registers the module as a GPIOTE user when flow
- * control is enabled, it must only be called once.
- */
- #define APP_UART_FIFO_INIT(INSTANCE, P_COMM_PARAMS, RX_BUF_SIZE, TX_BUF_SIZE, EVT_HANDLER, IRQ_PRIO, ERR_CODE) \
- do \
- { \
- app_uart_buffers_t buffers; \
- static uint8_t rx_buf[RX_BUF_SIZE]; \
- static uint8_t tx_buf[TX_BUF_SIZE]; \
- \
- buffers.rx_buf = rx_buf; \
- buffers.rx_buf_size = sizeof (rx_buf); \
- buffers.tx_buf = tx_buf; \
- buffers.tx_buf_size = sizeof (tx_buf); \
- ERR_CODE = app_uart_init(INSTANCE, P_COMM_PARAMS, &buffers, EVT_HANDLER, IRQ_PRIO); \
- } while (0)
-
- /**@brief Macro for safe initialization of the UART module in a single user instance.
- *
- * @param[in] P_COMM_PARAMS Pointer to a UART communication structure: app_uart_comm_params_t
- * @param[in] EVT_HANDLER Event handler function to be called when an event occurs in the
- * UART module.
- * @param[in] IRQ_PRIO IRQ priority, app_irq_priority_t, for the UART module irq handler.
- * @param[out] ERR_CODE The return value of the UART initialization function will be
- * written to this parameter.
- *
- * @note Since this macro allocates registers the module as a GPIOTE user when flow control is
- * enabled, it must only be called once.
- */
- #define APP_UART_INIT(INSTANCE, P_COMM_PARAMS, EVT_HANDLER, IRQ_PRIO, ERR_CODE) \
- do \
- { \
- ERR_CODE = app_uart_init(INSTANCE, P_COMM_PARAMS, NULL, EVT_HANDLER, IRQ_PRIO); \
- } while (0)
-
- /**@brief Function for initializing the UART module. Use this initialization when several instances of the UART
- * module are needed.
- *
- *
- * @note Normally single initialization should be done using the APP_UART_INIT() or
- * APP_UART_INIT_FIFO() macro depending on whether the FIFO should be used by the UART, as
- * that will allocate the buffers needed by the UART module (including aligning the buffer
- * correctly).
-
- * @param[in] p_comm_params Pin and communication parameters.
- * @param[in] p_buffers RX and TX buffers, NULL is FIFO is not used.
- * @param[in] error_handler Function to be called in case of an error.
- * @param[in] irq_priority Interrupt priority level.
- *
- * @retval NRF_SUCCESS If successful initialization.
- * @retval NRF_ERROR_INVALID_LENGTH If a provided buffer is not a power of two.
- * @retval NRF_ERROR_NULL If one of the provided buffers is a NULL pointer.
- *
- * The below errors are propagated by the UART module to the caller upon registration when Hardware
- * Flow Control is enabled. When Hardware Flow Control is not used, these errors cannot occur.
- * @retval NRF_ERROR_INVALID_STATE The GPIOTE module is not in a valid state when registering
- * the UART module as a user.
- * @retval NRF_ERROR_INVALID_PARAM The UART module provides an invalid callback function when
- * registering the UART module as a user.
- * Or the value pointed to by *p_uart_uid is not a valid
- * GPIOTE number.
- * @retval NRF_ERROR_NO_MEM GPIOTE module has reached the maximum number of users.
- */
- uint32_t app_uart_init(const uint8_t instance,
- const app_uart_comm_params_t * p_comm_params,
- app_uart_buffers_t * p_buffers,
- app_uart_event_handler_t error_handler,
- app_irq_priority_t irq_priority);
-
- /**@brief Function for getting a byte from the UART.
- *
- * @details This function will get the next byte from the RX buffer. If the RX buffer is empty
- * an error code will be returned and the app_uart module will generate an event upon
- * reception of the first byte which is added to the RX buffer.
- *
- * @param[out] p_byte Pointer to an address where next byte received on the UART will be copied.
- *
- * @retval NRF_SUCCESS If a byte has been received and pushed to the pointer provided.
- * @retval NRF_ERROR_NOT_FOUND If no byte is available in the RX buffer of the app_uart module.
- */
- uint32_t app_uart_get(uint8_t * p_byte);
-
- uint32_t app_uart_instance_put(int instance, uint8_t byte);
-
- /**@brief Function for putting a byte on the UART.
- *
- * @details This call is non-blocking.
- *
- * @param[in] byte Byte to be transmitted on the UART.
- *
- * @retval NRF_SUCCESS If the byte was successfully put on the TX buffer for transmission.
- * @retval NRF_ERROR_NO_MEM If no more space is available in the TX buffer.
- * NRF_ERROR_NO_MEM may occur if flow control is enabled and CTS signal
- * is high for a long period and the buffer fills up.
- * @retval NRF_ERROR_INTERNAL If UART driver reported error.
- */
- uint32_t app_uart_put(uint8_t byte);
-
- /**@brief Function for flushing the RX and TX buffers (Only valid if FIFO is used).
- * This function does nothing if FIFO is not used.
- *
- * @retval NRF_SUCCESS Flushing completed (Current implementation will always succeed).
- */
- uint32_t app_uart_flush(void);
-
- /**@brief Function for closing the UART module.
- *
- * @retval NRF_SUCCESS If successfully closed.
- * @retval NRF_ERROR_INVALID_PARAM If an invalid user id is provided or the user id differs from
- * the current active user.
- */
- uint32_t app_uart_close(int instance);
-
-
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif //APP_UART_H__
app_uart_fifo.c
- #include "sdk_common.h"
- #if NRF_MODULE_ENABLED(APP_UART)
- #include "app_uart.h"
- #include "app_fifo.h"
- #include "nrf_drv_uart.h"
- #include "nrf_assert.h"
-
- // Use array instead
- static nrf_drv_uart_t app_uart_inst[2] = {NRF_DRV_UART_INSTANCE(APP_UART_DRIVER_INSTANCE), NRF_DRV_UART_INSTANCE(APP_UART1_DRIVER_INSTANCE)};
-
- static __INLINE uint32_t fifo_length(app_fifo_t * const fifo)
- {
- uint32_t tmp = fifo->read_pos;
- return fifo->write_pos - tmp;
- }
-
- #define FIFO_LENGTH(F) fifo_length(&F) /**< Macro to calculate length of a FIFO. */
-
- static app_uart_event_handler_t m_event_handler; /**< Event handler function. */
- static uint8_t tx_buffer[2];
- static uint8_t rx_buffer[1]; // Only UART1 receive data
- static bool m_rx_ovf;
-
- // Use array instead
- static app_fifo_t m_rx_fifo; /**< RX FIFO buffer for storing data received on the UART until the application fetches them using app_uart_get(). */
- static app_fifo_t m_tx_fifo[2]; /**< TX FIFO buffer for storing data to be transmitted on the UART when TXD is ready. Data is put to the buffer on using app_uart_put(). */
-
- static void uart0_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
- {
- app_uart_evt_t app_uart_event;
- uint32_t err_code;
-
- switch (p_event->type)
- {
- case NRF_DRV_UART_EVT_TX_DONE:
- // Get next byte from FIFO.
- if (app_fifo_get(&m_tx_fifo[APP_UART_DRIVER_INSTANCE], &tx_buffer[APP_UART_DRIVER_INSTANCE]) == NRF_SUCCESS)
- {
- (void)nrf_drv_uart_tx(&app_uart_inst[APP_UART_DRIVER_INSTANCE], &tx_buffer[APP_UART_DRIVER_INSTANCE], 1);
- }
- break;
-
- default:
- break;
- }
- }
-
- static void uart1_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
- {
- app_uart_evt_t app_uart_event;
- uint32_t err_code;
-
- switch (p_event->type)
- {
- case NRF_DRV_UART_EVT_RX_DONE:
- // If 0, then this is a RXTO event with no new bytes.
- if(p_event->data.rxtx.bytes == 0)
- {
- // A new start RX is needed to continue to receive data
- (void)nrf_drv_uart_rx(&app_uart_inst[APP_UART1_DRIVER_INSTANCE], rx_buffer, 1);
- break;
- }
-
- // Write received byte to FIFO.
- err_code = app_fifo_put(&m_rx_fifo, p_event->data.rxtx.p_data[0]);
- if (err_code != NRF_SUCCESS)
- {
- app_uart_event.evt_type = APP_UART_FIFO_ERROR;
- app_uart_event.data.error_code = err_code;
- m_event_handler(&app_uart_event);
- }
- // Notify that there are data available.
- else if (FIFO_LENGTH(m_rx_fifo) != 0)
- {
- app_uart_event.evt_type = APP_UART_DATA_READY;
- m_event_handler(&app_uart_event);
- }
-
- // Start new RX if size in buffer.
- if (FIFO_LENGTH(m_rx_fifo) <= m_rx_fifo.buf_size_mask)
- {
- (void)nrf_drv_uart_rx(&app_uart_inst[APP_UART1_DRIVER_INSTANCE], rx_buffer, 1);
- }
- else
- {
- // Overflow in RX FIFO.
- m_rx_ovf = true;
- }
-
- break;
-
- case NRF_DRV_UART_EVT_ERROR:
- app_uart_event.evt_type = APP_UART_COMMUNICATION_ERROR;
- app_uart_event.data.error_communication = p_event->data.error.error_mask;
- (void)nrf_drv_uart_rx(&app_uart_inst[APP_UART1_DRIVER_INSTANCE], rx_buffer, 1);
- m_event_handler(&app_uart_event);
- break;
-
- case NRF_DRV_UART_EVT_TX_DONE:
- // Get next byte from FIFO.
- if (app_fifo_get(&m_tx_fifo[APP_UART1_DRIVER_INSTANCE], &tx_buffer[APP_UART1_DRIVER_INSTANCE]) == NRF_SUCCESS)
- {
- (void)nrf_drv_uart_tx(&app_uart_inst[APP_UART1_DRIVER_INSTANCE], &tx_buffer[APP_UART1_DRIVER_INSTANCE], 1);
- }
- else
- {
- // Last byte from FIFO transmitted, notify the application.
- app_uart_event.evt_type = APP_UART_TX_EMPTY;
- m_event_handler(&app_uart_event);
- }
- break;
-
- default:
- break;
- }
- }
-
-
- uint32_t app_uart_init(const uint8_t instance,
- const app_uart_comm_params_t * p_comm_params,
- app_uart_buffers_t * p_buffers,
- app_uart_event_handler_t event_handler,
- app_irq_priority_t irq_priority)
- {
- uint32_t err_code;
-
- if(instance == APP_UART1_DRIVER_INSTANCE)
- {
- m_event_handler = event_handler;
- }
-
- if (p_buffers == NULL)
- {
- return NRF_ERROR_INVALID_PARAM;
- }
-
- if(instance == APP_UART1_DRIVER_INSTANCE)
- {
- // Configure buffer RX buffer.
- err_code = app_fifo_init(&m_rx_fifo, p_buffers->rx_buf, p_buffers->rx_buf_size);
- VERIFY_SUCCESS(err_code);
- }
-
- // Configure buffer TX buffer.
- err_code = app_fifo_init(&m_tx_fifo[instance], p_buffers->tx_buf, p_buffers->tx_buf_size);
- VERIFY_SUCCESS(err_code);
-
- nrf_drv_uart_config_t config = NRF_DRV_UART_DEFAULT_CONFIG;
- config.baudrate = (nrf_uart_baudrate_t)p_comm_params->baud_rate;
- config.hwfc = (p_comm_params->flow_control == APP_UART_FLOW_CONTROL_DISABLED) ?
- NRF_UART_HWFC_DISABLED : NRF_UART_HWFC_ENABLED;
- config.interrupt_priority = irq_priority;
- config.parity = p_comm_params->use_parity ? NRF_UART_PARITY_INCLUDED : NRF_UART_PARITY_EXCLUDED;
- config.pselcts = p_comm_params->cts_pin_no;
- config.pselrts = p_comm_params->rts_pin_no;
- config.pselrxd = p_comm_params->rx_pin_no;
- config.pseltxd = p_comm_params->tx_pin_no;
-
- nrf_uart_event_handler_t local_event_handler = (instance == APP_UART1_DRIVER_INSTANCE) ? uart1_event_handler : uart0_event_handler;
- err_code = nrf_drv_uart_init(&app_uart_inst[instance], &config, local_event_handler);
- VERIFY_SUCCESS(err_code);
-
- if(instance == APP_UART1_DRIVER_INSTANCE)
- {
- m_rx_ovf = false;
-
- // Turn on receiver if RX pin is connected
- if (p_comm_params->rx_pin_no != UART_PIN_DISCONNECTED)
- {
- return nrf_drv_uart_rx(&app_uart_inst[instance], rx_buffer,1);
- }
- else
- {
- return NRF_SUCCESS;
- }
- }
- }
-
- uint32_t app_uart_flush(void)
- {
- uint32_t err_code;
-
- err_code = app_fifo_flush(&m_rx_fifo);
- VERIFY_SUCCESS(err_code);
-
- err_code = app_fifo_flush(&m_tx_fifo[APP_UART_DRIVER_INSTANCE]);
- VERIFY_SUCCESS(err_code);
-
- err_code = app_fifo_flush(&m_tx_fifo[APP_UART1_DRIVER_INSTANCE]);
- VERIFY_SUCCESS(err_code);
-
- return NRF_SUCCESS;
- }
-
-
- uint32_t app_uart_get(uint8_t * p_byte)
- {
- ASSERT(p_byte);
- bool rx_ovf = m_rx_ovf;
-
- ret_code_t err_code = app_fifo_get(&m_rx_fifo, p_byte);
-
- // If FIFO was full new request to receive one byte was not scheduled. Must be done here.
- if (rx_ovf)
- {
- m_rx_ovf = false;
- uint32_t uart_err_code = nrf_drv_uart_rx(&app_uart_inst[APP_UART1_DRIVER_INSTANCE], rx_buffer, 1);
-
- // RX resume should never fail.
- APP_ERROR_CHECK(uart_err_code);
- }
-
- return err_code;
- }
-
- uint32_t app_uart_instance_put(int instance, uint8_t byte)
- {
- uint32_t err_code;
- err_code = app_fifo_put(&m_tx_fifo[instance], byte);
- if (err_code == NRF_SUCCESS)
- {
- // The new byte has been added to FIFO. It will be picked up from there
- // (in 'uart_event_handler') when all preceding bytes are transmitted.
- // But if UART is not transmitting anything at the moment, we must start
- // a new transmission here.
- if (!nrf_drv_uart_tx_in_progress(&app_uart_inst[instance]))
- {
- // This operation should be almost always successful, since we've
- // just added a byte to FIFO, but if some bigger delay occurred
- // (some heavy interrupt handler routine has been executed) since
- // that time, FIFO might be empty already.
- if (app_fifo_get(&m_tx_fifo[instance], &tx_buffer[instance]) == NRF_SUCCESS)
- {
- err_code = nrf_drv_uart_tx(&app_uart_inst[instance], &tx_buffer[instance], 1);
- }
- }
- }
- return err_code;
- }
-
- // Default use UART1
- uint32_t app_uart_put(uint8_t byte)
- {
- return app_uart_instance_put(APP_UART1_DRIVER_INSTANCE, byte);
- }
-
- uint32_t app_uart_close(int instance)
- {
- nrf_drv_uart_uninit(&app_uart_inst[instance]);
- return NRF_SUCCESS;
- }
- #endif //NRF_MODULE_ENABLED(APP_UART)
sdk_config.h
- // <e> UART1_ENABLED - Enable UART1 instance
- //==========================================================
- #ifndef UART1_ENABLED
- #define UART1_ENABLED 1
- #endif
-
- #ifndef APP_UART1_DRIVER_INSTANCE
- #define APP_UART1_DRIVER_INSTANCE 1
- #endif
-
retarget.c
- #if defined(__SES_VERSION) && (__SES_VERSION >= 34000)
- int __putchar(int ch, __printf_tag_ptr tag_ptr)
- {
- UNUSED_PARAMETER(tag_ptr);
-
- UNUSED_VARIABLE(app_uart_instance_put(APP_UART_DRIVER_INSTANCE, (uint8_t)ch));
- return ch;
- }
注意:
nrf52840的uart管脚输出是TTL格式的,用TTL线才可以正常显示。而且接收和发送最好间隔一个PIN脚,否则容易产生干扰。如果用RS232转USB模块进行接收的话,会不断接收到乱码数据。
UART1的接收和发送引脚不要和TTL接收器接反,否则容易重启。接反的时候还是会收到数据的,可能是干扰所致。正常接线以后,就正常了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。