This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

NRF_ERROR_SVC_HANDLER_MISSING whith uart

When I use the uart to transparently transmit, there is no problem at around 4k/s. When I increase the transparent transmission rate, there will be NRF_ERROR_SVC_HANDLER_MISSING this error in the APP_UART_COMMUNICATION_ERROR event. 

What is the reason, I have been unable to find the reason, if you want a higher transmission rate, what should I do, I do not want to use flow control, dma is not a better choice?

Parents
  • Hi,

    I believe that the error is really NRF_UARTE_ERROR_OVERRUN_MASK. Please check this by taking a look at the value of app_uart_evt_t::error_communication when the error occurs. As indicated here, the value is 1 when the UART is overrun.

    Please enable the EasyDMA if you have not already done that, and see if it improves the situation.

  • but i find this error only 1kb/s  this sometimes , which is strange,  what happen , is this  error code of myself?

  • PROJECT_NAME     := ble_app_uart_pca10040_s132
    TARGETS          := BLE_UART_NRF52832_xxaa
    OUTPUT_DIRECTORY := _build
    
    SDK_ROOT := ../../../../../..
    PROJ_DIR := ../../..
    
    $(OUTPUT_DIRECTORY)/BLE_UART_NRF52832_xxaa.out: \
      LINKER_SCRIPT  := ble_app_uart_gcc_nrf52.ld
    
    # Source files common to all targets
    SRC_FILES += \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_backend_rtt.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_backend_serial.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_default_backends.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_frontend.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_str_formatter.c \
      $(SDK_ROOT)/components/libraries/button/app_button.c \
      $(SDK_ROOT)/components/libraries/util/app_error.c \
      $(SDK_ROOT)/components/libraries/util/app_error_weak.c \
      $(SDK_ROOT)/components/libraries/fifo/app_fifo.c \
      $(SDK_ROOT)/components/libraries/scheduler/app_scheduler.c \
      $(SDK_ROOT)/components/libraries/timer/app_timer.c \
      $(SDK_ROOT)/components/libraries/uart/app_uart_fifo.c \
      $(SDK_ROOT)/components/libraries/util/app_util_platform.c \
      $(SDK_ROOT)/components/libraries/hardfault/hardfault_implementation.c \
      $(SDK_ROOT)/components/libraries/util/nrf_assert.c \
      $(SDK_ROOT)/components/libraries/atomic_fifo/nrf_atfifo.c \
      $(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \
      $(SDK_ROOT)/external/fprintf/nrf_fprintf.c \
      $(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \
      $(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage.c \
      $(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage_sd.c \
      $(SDK_ROOT)/components/libraries/experimental_memobj/nrf_memobj.c \
      $(SDK_ROOT)/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c \
      $(SDK_ROOT)/components/libraries/experimental_section_vars/nrf_section_iter.c \
      $(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \
      $(SDK_ROOT)/components/libraries/uart/retarget.c \
      $(SDK_ROOT)/components/libraries/util/sdk_mapped_flags.c \
      $(SDK_ROOT)/components/drivers_nrf/clock/nrf_drv_clock.c \
      $(SDK_ROOT)/components/drivers_nrf/common/nrf_drv_common.c \
      $(SDK_ROOT)/components/drivers_nrf/gpiote/nrf_drv_gpiote.c \
      $(SDK_ROOT)/components/drivers_nrf/uart/nrf_drv_uart.c \
      $(PROJ_DIR)/main.c \
      $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \
      $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \
      $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \
      $(SDK_ROOT)/components/ble/common/ble_advdata.c \
      $(SDK_ROOT)/components/ble/ble_advertising/ble_advertising.c \
      $(SDK_ROOT)/components/ble/common/ble_conn_params.c \
      $(SDK_ROOT)/components/ble/common/ble_conn_state.c \
      $(SDK_ROOT)/components/ble/common/ble_srv_common.c \
      $(SDK_ROOT)/components/ble/nrf_ble_gatt/nrf_ble_gatt.c \
      $(SDK_ROOT)/components/toolchain/gcc/gcc_startup_nrf52.S \
      $(SDK_ROOT)/components/toolchain/system_nrf52.c \
      $(SDK_ROOT)/components/ble/ble_services/ble_nus/ble_nus.c \
      $(SDK_ROOT)/components/softdevice/common/nrf_sdh.c \
      $(SDK_ROOT)/components/softdevice/common/nrf_sdh_ble.c \
      $(SDK_ROOT)/components/softdevice/common/nrf_sdh_soc.c \
      $(SDK_ROOT)/components/libraries/simple_timer/app_simple_timer.c\
      $(SDK_ROOT)/components/libraries/fds/fds.c \
      $(SDK_ROOT)/components/libraries/gpiote/app_gpiote.c \
      $(SDK_ROOT)/components/drivers_nrf/wdt/nrf_drv_wdt.c \
      $(SDK_ROOT)/components/drivers_nrf/timer/nrf_drv_timer.c \
      $(SDK_ROOT)/components/drivers_nrf/power/nrf_drv_power.c\
    
    
    
    # Include folders common to all targets
    INC_FOLDERS += \
      $(SDK_ROOT)/components/libraries/gpiote\
      $(SDK_ROOT)/components/drivers_nrf/comp \
      $(SDK_ROOT)/components/drivers_nrf/twi_master \
      $(SDK_ROOT)/components/ble/ble_services/ble_ancs_c \
      $(SDK_ROOT)/components/ble/ble_services/ble_ias_c \
      $(SDK_ROOT)/components/libraries/pwm \
      $(SDK_ROOT)/components/softdevice/s132/headers/nrf52 \
      $(SDK_ROOT)/components/libraries/usbd/class/cdc/acm \
      $(SDK_ROOT)/components/libraries/usbd/class/hid/generic \
      $(SDK_ROOT)/components/libraries/usbd/class/msc \
      $(SDK_ROOT)/components/libraries/usbd/class/hid \
      $(SDK_ROOT)/components/libraries/experimental_log \
      $(SDK_ROOT)/components/ble/ble_services/ble_gls \
      $(SDK_ROOT)/components/libraries/fstorage \
      $(SDK_ROOT)/components/drivers_nrf/i2s \
      $(SDK_ROOT)/components/libraries/mutex \
      $(SDK_ROOT)/components/libraries/experimental_log/src \
      $(SDK_ROOT)/components/drivers_nrf/gpiote \
      $(SDK_ROOT)/components/libraries/fifo \
      $(SDK_ROOT)/components/libraries/experimental_memobj \
      $(SDK_ROOT)/components/drivers_nrf/common \
      $(SDK_ROOT)/components/libraries/fds \
      $(SDK_ROOT)/components/ble/ble_advertising \
      $(SDK_ROOT)/components/ble/ble_services/ble_bas_c \
      $(SDK_ROOT)/components/ble/ble_services/ble_hrs_c \
      $(SDK_ROOT)/components/libraries/queue \
      $(SDK_ROOT)/components/libraries/pwr_mgmt \
      $(SDK_ROOT)/components/ble/ble_dtm \
      $(SDK_ROOT)/components/toolchain/cmsis/include \
      $(SDK_ROOT)/components/ble/ble_services/ble_rscs_c \
      $(SDK_ROOT)/components/drivers_nrf/uart \
      $(SDK_ROOT)/components/ble/common \
      $(SDK_ROOT)/components/ble/ble_services/ble_lls \
      $(SDK_ROOT)/components/drivers_nrf/wdt \
      $(SDK_ROOT)/components/ble/ble_services/ble_bas \
      $(SDK_ROOT)/components/libraries/experimental_section_vars \
      $(SDK_ROOT)/components/softdevice/s132/headers \
      $(SDK_ROOT)/components/ble/ble_services/ble_ans_c \
      $(SDK_ROOT)/components/libraries/slip \
      $(SDK_ROOT)/components/libraries/mem_manager \
      $(SDK_ROOT)/external/segger_rtt \
      $(SDK_ROOT)/components/libraries/usbd/class/cdc \
      $(SDK_ROOT)/components/drivers_nrf/hal \
      $(SDK_ROOT)/components/ble/ble_services/ble_nus_c \
      $(SDK_ROOT)/components/drivers_nrf/rtc \
      $(SDK_ROOT)/components/softdevice/common \
      $(SDK_ROOT)/components/ble/ble_services/ble_ias \
      $(SDK_ROOT)/components/libraries/usbd/class/hid/mouse \
      $(SDK_ROOT)/components/libraries/ecc \
      $(SDK_ROOT)/components/drivers_nrf/ppi \
      $(SDK_ROOT)/components/ble/ble_services/ble_dfu \
      $(SDK_ROOT)/external/fprintf \
      $(SDK_ROOT)/components/drivers_nrf/twis_slave \
      $(SDK_ROOT)/components/libraries/atomic \
      $(SDK_ROOT)/components \
      $(SDK_ROOT)/components/libraries/scheduler \
      $(SDK_ROOT)/components/libraries/cli \
      $(SDK_ROOT)/components/ble/ble_services/ble_lbs \
      $(SDK_ROOT)/components/ble/ble_services/ble_hts \
      $(SDK_ROOT)/components/drivers_nrf/delay \
      $(SDK_ROOT)/components/libraries/crc16 \
      $(SDK_ROOT)/components/drivers_nrf/timer \
      $(SDK_ROOT)/components/libraries/util \
      $(SDK_ROOT)/components/drivers_nrf/pwm \
      ../config \
      $(SDK_ROOT)/components/libraries/csense_drv \
      $(SDK_ROOT)/components/libraries/csense \
      $(SDK_ROOT)/components/libraries/balloc \
      $(SDK_ROOT)/components/libraries/low_power_pwm \
      $(SDK_ROOT)/components/libraries/hardfault \
      $(SDK_ROOT)/components/ble/ble_services/ble_cscs \
      $(SDK_ROOT)/components/libraries/uart \
      $(SDK_ROOT)/components/libraries/hci \
      $(SDK_ROOT)/components/libraries/usbd/class/hid/kbd \
      $(SDK_ROOT)/components/drivers_nrf/spi_slave \
      $(SDK_ROOT)/components/drivers_nrf/lpcomp \
      $(SDK_ROOT)/components/libraries/timer \
      $(SDK_ROOT)/components/drivers_nrf/rng \
      $(SDK_ROOT)/components/drivers_nrf/power \
      $(SDK_ROOT)/components/libraries/usbd/config \
      $(SDK_ROOT)/components/toolchain \
      $(SDK_ROOT)/components/libraries/led_softblink \
      $(SDK_ROOT)/components/drivers_nrf/qdec \
      $(SDK_ROOT)/components/ble/ble_services/ble_cts_c \
      $(SDK_ROOT)/components/drivers_nrf/spi_master \
      $(SDK_ROOT)/components/ble/ble_services/ble_nus \
      $(SDK_ROOT)/components/libraries/twi_mngr \
      $(SDK_ROOT)/components/ble/ble_services/ble_hids \
      $(SDK_ROOT)/components/libraries/strerror \
      $(SDK_ROOT)/components/drivers_nrf/pdm \
      $(SDK_ROOT)/components/libraries/crc32 \
      $(SDK_ROOT)/components/libraries/usbd/class/audio \
      $(SDK_ROOT)/components/ble/peer_manager \
      $(SDK_ROOT)/components/drivers_nrf/swi \
      $(SDK_ROOT)/components/ble/ble_services/ble_tps \
      $(SDK_ROOT)/components/ble/ble_services/ble_dis \
      $(SDK_ROOT)/components/device \
      $(SDK_ROOT)/components/ble/nrf_ble_gatt \
      $(SDK_ROOT)/components/ble/nrf_ble_qwr \
      $(SDK_ROOT)/components/libraries/button \
      $(SDK_ROOT)/components/libraries/usbd \
      $(SDK_ROOT)/components/drivers_nrf/saadc \
      $(SDK_ROOT)/components/libraries/atomic_fifo \
      $(SDK_ROOT)/components/ble/ble_services/ble_lbs_c \
      $(SDK_ROOT)/components/ble/ble_racp \
      $(SDK_ROOT)/components/toolchain/gcc \
      $(SDK_ROOT)/components/libraries/fds \
      $(SDK_ROOT)/components/libraries/twi \
      $(SDK_ROOT)/components/drivers_nrf/clock \
      $(SDK_ROOT)/components/ble/ble_services/ble_rscs \
      $(SDK_ROOT)/components/drivers_nrf/usbd \
      $(SDK_ROOT)/components/ble/ble_services/ble_hrs \
      $(SDK_ROOT)/examples/ble_peripheral/ble_app_uart\
      $(SDK_ROOT)/examples/ble_peripheral/ble_app_uart/board\
      $(SDK_ROOT)/components/libraries/simple_timer\
      $(SDK_ROOT)/components/drivers_nrf/power\
    
    # Libraries common to all targets
    LIB_FILES += \
    
    # Optimization flags
    OPT = -O1 -g3
    # Uncomment the line below to enable link time optimization
    #OPT += -flto
    
    # C flags common to all targets
    CFLAGS += $(OPT)
    CFLAGS += -DBOARD_MS50SF1AC
    CFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
    CFLAGS += -DBLE_STACK_SUPPORT_REQD
    CFLAGS += -DCONFIG_GPIO_AS_PINRESET
    CFLAGS += -DFLOAT_ABI_HARD
    CFLAGS += -DNRF52
    CFLAGS += -DDEBUG
    CFLAGS += -DBLE_UART_NRF52832_XXAA
    CFLAGS += -DNRF52_PAN_74
    CFLAGS += -DNRF_SD_BLE_API_VERSION=5
    CFLAGS += -DS132
    CFLAGS += -DSOFTDEVICE_PRESENT
    CFLAGS += -DSWI_DISABLE0
    CFLAGS += -mcpu=cortex-m4
    CFLAGS += -mthumb -mabi=aapcs
    CFLAGS += -Wall -w -O2 -g3
    CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
    # keep every function in a separate section, this allows linker to discard unused ones
    CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
    CFLAGS += -fno-builtin -fshort-enums 
    
    # C++ flags common to all targets
    CXXFLAGS += $(OPT)
    
    # Assembler flags common to all targets
    ASMFLAGS += -g3
    ASMFLAGS += -mcpu=cortex-m4
    ASMFLAGS += -mthumb -mabi=aapcs
    ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
    ASMFLAGS += -DBOARD_MS50SF1AC
    ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
    ASMFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
    ASMFLAGS += -DFLOAT_ABI_HARD
    ASMFLAGS += -DNRF52
    ASMFLAGS += -DBLE_UART_NRF52832_XXAA
    ASMFLAGS += -DNRF52_PAN_74
    ASMFLAGS += -DNRF_SD_BLE_API_VERSION=5
    ASMFLAGS += -DS132
    ASMFLAGS += -DSOFTDEVICE_PRESENT
    ASMFLAGS += -DSWI_DISABLE0
    
    # Linker flags
    LDFLAGS += $(OPT)
    LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT)
    LDFLAGS += -mcpu=cortex-m4
    LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
    # let linker dump unused sections
    LDFLAGS += -Wl,--gc-sections
    # use newlib in nano version
    LDFLAGS += --specs=nano.specs
    
    
    # Add standard libraries at the very end of the linker input, after all objects
    # that may need symbols provided by these libraries.
    LIB_FILES += -lc -lnosys -lm
    
    
    .PHONY: default help
    
    # Default target - first one defined
    default: BLE_UART_NRF52832_xxaa
    
    # Print all targets that can be built
    help:
    	@echo following targets are available:
    	@echo		BLE_UART_NRF52832_xxaa
    	@echo		flash_softdevice
    	@echo		sdk_config - starting external tool for editing sdk_config.h
    	@echo		flash      - flashing binary
    
    TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc
    
    
    include $(TEMPLATE_PATH)/Makefile.common
    
    $(foreach target, $(TARGETS), $(call define_target, $(target)))
    
    .PHONY: flash flash_softdevice erase
    
    # Flash the program
    flash: $(OUTPUT_DIRECTORY)/BLE_UART_NRF52832_xxaa.hex
    	@echo Flashing: $<
    	nrfjprog -f nrf52 --program $< --sectorerase
    	nrfjprog -f nrf52 --reset
    
    # Flash softdevice
    flash_softdevice:
    	@echo Flashing: s132_nrf52_5.0.0_softdevice.hex
    	nrfjprog -f nrf52 --program $(SDK_ROOT)/components/softdevice/s132/hex/s132_nrf52_5.0.0_softdevice.hex --sectorerase
    	nrfjprog -f nrf52 --reset
    
    erase:
    	nrfjprog -f nrf52 --eraseall
    
    SDK_CONFIG_FILE := ../config/sdk_config.h
    CMSIS_CONFIG_TOOL := $(SDK_ROOT)/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar
    sdk_config:
    	java -jar $(CMSIS_CONFIG_TOOL) $(SDK_CONFIG_FILE)
    

    I used the logic code of sdk13 52810, then modified the logic code on the ble_uart_peripheral routine of sdk14.2, and then I encountered this problem. I don't think this has anything to do with the makefile.

  • My original code is on NRF52810. This problem does not occur, but I have this problem when I ported to 52832. I try I don't change the routine ble_app_uart, just change the logic part, but this problem still occurs.

    When you ported from nRF52810 to nRF52832, did you turn off EasyDMA ?

    How much time are you spending in the uart_event_handle() ?

    I see that you have a function uart_rec_process(), what are you doing here?

    I also see that you are using the FIFO, maybe you could move the processing to main context ? Pop the FIFO in main with app_fifo_get(), and do the proccesing there?

  • /**
     * #brief Ble notify data function.
     * 
     * #called by  ref@uart_rec_process() - #Condition Complete Packet;
     *             ref@uart_rec_process() - #Condition Incomplete Packet;
     *             ref@on_ble_evt()       - #Case      BLE_EVT_TX_COMPLETE.
     */
    static void ble_data_notify_handler(void * p_context)
    {   
        if (is_device_connect() == false) {
            return;
        }
        uint32_t  err_code = ble_nus_string_send(&m_nus, m_temp_array.data, (uint16_t *)&m_temp_array.size);
        if (err_code == NRF_SUCCESS) {
            //! �ɹ�֪ͨһ�����ݣ�����һ�α�ʾ�Է��ɷ���
            nrf_gpio_pin_clear(FIFO_FULL_PIN);
            NRF_LOG_WARNING("noty ok [%d]###\r\n", m_temp_array.size);
    
            //! ��������Э��ջbuffer�ɹ�, �����̬��������.
            memset(&m_temp_array, 0, sizeof(m_temp_array));
            
            //! �ϴ���������Э��ջbufferʧ��, ���γɹ������ٴμ���uart fifo, �鿴ʱ���ж�������.
            if (m_uart_rec_states == UART_REC_DATA_PASS_WAIT /**#Condition.*/) {
                m_uart_rec_states /**#StatesChange.*/ = UART_REC_DATA_PASS;
                APP_ERROR_CHECK(app_sched_event_put((void *)0, 0, uart_rec_process));
            }
        }
    
        else 
        if (err_code == NRF_ERROR_RESOURCES) {
            NRF_LOG_WARNING("buf exce\r\n");
            m_uart_rec_states /**#StatesChange.*/ = UART_REC_DATA_PASS_WAIT;
            return;
        }
    
        else 
        if (err_code == BLE_ERROR_GATTS_SYS_ATTR_MISSING || 
                err_code == NRF_ERROR_INVALID_STATE) {
                NRF_LOG_WARNING("ignor error\r\n");
            //! ������Щ���������Ӵ����Ĵ���.
        } 
        
        else {
            NRF_LOG_WARNING("error check\r\n");
            APP_ERROR_CHECK(err_code);
        }
    }
    
    
    /**
     * #brief UART rec process function.
     *
     * #called by ref@uart_event_handle()       - #Case      - APP_UART_DATA_READY;
     * #called by ref@ble_data_notify_handler() - #Condition - NRF_SUCCESS, #Scheduled.
     */
    static void  uart_rec_process(void * p_context, uint16_t data_length) 
    {
        static uint8_t fifo_buffer[32];
        if (is_device_connect() == true /**< ������״̬�£��������ݶ�������Ϊ͸������ */) {
        // if ( 1 ) {
            m_uart_rec_states = (m_uart_rec_states == UART_REC_IDLE)? UART_REC_DATA_PASS : m_uart_rec_states;
    
            APP_ERROR_CHECK(app_simple_timer_stop());
            uint8_t tmp_mid_data = 0;
    
            while (app_fifo_get(&m_uart_rec_fifo, &tmp_mid_data) == NRF_SUCCESS) {
                m_temp_array.data[m_temp_array.size++] = tmp_mid_data;
    
                //! �����ݴﵽ��󳤶ȼ����Խ���������ȫ�����ͳ�ȥ.
                if (m_temp_array.size >= m_ble_nus_max_data_len) {
                    // NRF_LOG_WARNING("size : %d \r\n",m_temp_array.size);
                    ble_data_notify_handler(NULL);
                    if (m_uart_rec_states == UART_REC_DATA_PASS_WAIT /**#Condition.*/) {
                        NRF_LOG_WARNING("uart wait\r\n");
                        //! DPASS WAIT 0
                        return;
                    }
                }
            }
    
    
            if (m_temp_array.size > 0 && /**< ���ݴղ���һ�����ֽڵ����, ��ʱ�жϺ���. */
                m_temp_array.size < m_ble_nus_max_data_len) {
                APP_ERROR_CHECK(app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT, 
                                                       ble_data_notify_handler,
                                                       APP_TIMER_TICKS(600), 
                                                       NULL));
            }
        } else { /**< �ڷ�����״̬�£��������ݶ�������Ϊ��������. */
                
            while (app_fifo_get(&m_uart_rec_fifo, fifo_buffer + m_temp_array.size) == NRF_SUCCESS) {
                APP_ERROR_CHECK(app_timer_stop(uart_clear_id));
                APP_ERROR_CHECK(app_timer_start(uart_clear_id, APP_TIMER_TICKS(200), NULL));
                if (m_temp_array.size >= 9 && m_temp_array.size <= (COMMAND_MAX_LEN-1)) {
                    if (memcmp(fifo_buffer + (m_temp_array.size -1), (uint8_t *)COMMAND_END_STR, 2) == 0) {
                        APP_ERROR_CHECK(app_timer_stop(uart_clear_id));
                        APP_ERROR_CHECK(app_simple_timer_stop());
                        memcpy(m_temp_array.data, fifo_buffer, m_temp_array.size + 1);
                        APP_ERROR_CHECK(app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT, 
                                                   uart_cmd_process_handler,
                                                   APP_TIMER_TICKS(UART_REC_WAIT_INTERVAL), 
                                                   NULL));
                    } 
                } 
    
                m_temp_array.size ++;
            }
    
            /* ���ڷ��͵������������ָ������*/
            if (m_temp_array.size > COMMAND_MAX_LEN) {
                NRF_LOG_RAW_INFO(">COMMAND_MAX_LEN stop timer\r\n");
                APP_ERROR_CHECK(app_simple_timer_stop());
                m_temp_array.size = 0;
                uart_rec_process_clr();
            }
    
            /* ������Ͳ��������.*/
            APP_ERROR_CHECK(app_timer_stop(uart_clear_id));
            APP_ERROR_CHECK(app_timer_start(uart_clear_id, APP_TIMER_TICKS(200), NULL));
    
    
        }
    
        m_uart_rec_states /**#StatesChange.*/ = UART_REC_IDLE;
    }
    
    
    /**
     * #��� ��ѯ���ڽ��մ���ģ�鵱ǰ�Ƿ�æ.
     *
     * #���� true   ���ڽ��մ���ģ�鵱ǰ��æ.
     * #���� false  ���ڽ��մ���ģ�鵱ǰ����.
     */
    static inline bool is_uart_rec_in_process(void) {
        return (m_uart_rec_states == UART_REC_IDLE)? false : true;
    }
    
    
    /**
     * #brief  Function for handling app_uart events.
     */
    void uart_event_handle(app_uart_evt_t * p_event)
    {
        switch (p_event->evt_type)
        {
            /**< 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. */
            case APP_UART_DATA_READY:
            {
                uint8_t tmp_rec_data = 0;
    
                UNUSED_VARIABLE(app_uart_get(&tmp_rec_data));
    
                if (app_fifo_put(&m_uart_rec_fifo, tmp_rec_data) == NRF_SUCCESS) {
                    if (is_uart_rec_in_process() == false) {
                        uart_rec_process((void *)0, 0);
                    } else {
                        NRF_LOG_WARNING("uart buzy\r\n");
                        m_uart_rec_states == UART_REC_IDLE;
                        //! Busy
                        return;
                    }
                } else {
                    //! Rec fifo is full
                    NRF_LOG_WARNING("@#$@##@%$#@^@#$%#@$%@#$%fifo full@#!$!#$@!#%#$@%@$##$@%#@$^%$#&@$#%#$%@\r\n");
                    nrf_gpio_pin_set(FIFO_FULL_PIN);
                    return;
                }
                break;
            }
    
            /**< An communication error has occured during reception. */
            case APP_UART_COMMUNICATION_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_communication);
                break;
            
            /**< An error in the FIFO module used by the app_uart module has occured. */
            case APP_UART_FIFO_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_code);
                break;
            case APP_UART_TX_EMPTY:
                NRF_LOG_INFO("UART SEND COMPELETE\r\n");
                // APP_ERROR_CHECK(app_uart_flush());
                uart_rec_process_clr();
                break;
    
            /**< An event indicating that UART has completed transmission of all available data in the TX FIFO. */
            // case APP_UART_TX_EMPTY:
            //     //! TX_EMPTY
            //     break;
    
            default:
                break;
        }
    }
    
    
    /**
     * #brief  Function for initializing the UART module.
     */
    static void uart_init(void)
    {
        uint32_t err_code;
        uint32_t tmp_uart_baud_list[] = UART_BAUDRATE_LIST;
    
        const app_uart_comm_params_t 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,
            .baud_rate    = tmp_uart_baud_list[m_cmd_collection.uart_baudrate]
        };
    
        APP_UART_FIFO_INIT(&comm_params,
                           UART_RX_BUF_SIZE,
                           UART_TX_BUF_SIZE,
                           uart_event_handle,
                           APP_IRQ_PRIORITY_LOWEST,
                           err_code);
        APP_ERROR_CHECK(err_code);
    }
    
    
    /**
     * @brief Function for initializing the GATT library. 
     */
    void gatt_init(void)
    {
        APP_ERROR_CHECK(nrf_ble_gatt_init(&m_gatt, gatt_evt_handler));
        NRF_LOG_DEBUG("nrf_ble_gatt_init\r\n");
    
        APP_ERROR_CHECK(nrf_ble_gatt_att_mtu_periph_set(&m_gatt,43));
        NRF_LOG_DEBUG("nrf_ble_gatt_att_mtu_periph_set\r\n");
    }
    
    
    
    * #param[in] length   Length of the data.
     */
    static void nus_data_handler(ble_nus_evt_t * p_evt)
    {
        uint32_t err_code;
    
        switch (p_evt->type) {
            case BLE_NUS_EVT_RX_DATA:
    
                NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART.");
                NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);
    
                for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
                {
                    do
                    {
                        err_code = app_uart_put(p_evt->params.rx_data.p_data[i]);
                        if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY)) {
                            NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code);
                            APP_ERROR_CHECK(err_code);
                        }
                    } while (err_code == NRF_ERROR_BUSY);
                }
                if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length-1] == '\r')
                {
                    while (app_uart_put('\n') == NRF_ERROR_BUSY);
                }
                break;
    
            case BLE_NUS_EVT_TX_RDY:
                if (m_uart_rec_states == UART_REC_DATA_PASS_WAIT) {
                    NRF_LOG_WARNING("uart reboot\r\n");
                    ble_data_notify_handler(NULL);
                }
                break;
            default :   
                break;
        }
    }
    

  • I want to know why this is not the case with the NRF52810, and this is the case with the NRF52832.

    The nRF52810 only have UART with EasyDMA. You should ideally use both flow-control and turn on EasyDMA, but if you don't use flow-control you will need to turn on EasyDMA to mitigate the overrun issue. EasyDMA allows peripherals to transmit/receive data while CPU is busy handling other events/tasks. 

Reply Children
Related