52840 NCS UART DFU

Hi

 I am currently working with my project with 52840 and i am using sdk v3.0.1 & toolchain v3.0.0 to develope.

 I am learning how to use DFU over UART from the application in Devacademy l9/e2 , it works fine using the example , after that i try it on my own project but because my project use one uart only , so UART DFU and my APP use the same uart(UART0) , and i added two config

CONFIG_SHELL=y
CONFIG_MCUMGR_TRANSPORT_SHELL=y

also init uart0 in my application 

void uart0_init(void)
{
    uint32_t err =  device_is_ready( dev_uart0 );

    if( err != true )
    {
        printk("\nUART_init_err = %d\n", err);
    }
    uart_irq_callback_user_data_set(dev_uart0,uart0_irq_callback, NULL )
   
    uart_irq_rx_enable( dev_uart0 );
}
i use Auterm(v0.35a) to Get image , Auterm data keep running into my uart0_irq_callback , not into MCUMGR shell
is there any way to let my application uart and uart dfu use the same uart and the same time without deinit the uart ? Thanks!
  • Hi, 

        here is  my prj.conf and 52840.overlay

    ==========================prj.conf=====================
    
    
    #================LOG================
    CONFIG_LOG=y
    CONFIG_LOG_MODE_DEFERRED=n
    CONFIG_LOG_MODE_IMMEDIATE=y
    CONFIG_LOG_MODE_MINIMAL=y
    
    CONFIG_USE_SEGGER_RTT=y 
    
    CONFIG_LOG_BACKEND_RTT=y
    CONFIG_LOG_BACKEND_UART=n
    
    CONFIG_RTT_CONSOLE=y
    CONFIG_UART_CONSOLE=n   
    
    
    #================FLOATING POINT================
    CONFIG_FPU=y
    
    #================GPIO================
    CONFIG_GPIO=y
    
    
    #================SPI================
    CONFIG_SPI=y
    CONFIG_NORDIC_QSPI_NOR=y 
    
    #================UART================
    CONFIG_SERIAL=y
    CONFIG_UART_USE_RUNTIME_CONFIGURE=y
    CONFIG_UART_INTERRUPT_DRIVEN=y      
    CONFIG_UART_ASYNC_API=n           
    
    #================I2C================
    CONFIG_I2C=y
    
    #================ADC================
    CONFIG_ADC=y
    
    #================PWM================
    # CONFIG_PWM=y
    
    #================MCU FLASH================
    CONFIG_FLASH=y
    CONFIG_FLASH_MAP=y
    CONFIG_NVS=y 
    CONFIG_SOC_FLASH_NRF_EMULATE_ONE_BYTE_WRITE_ACCESS=y 
    
    
    #================Partition Manager================
    CONFIG_PARTITION_MANAGER_ENABLED=y
    
    
    #================MCU WATCHDOG================
    CONFIG_WATCHDOG=y
    
    #================BLUETOOTH================
    CONFIG_BT=y
    CONFIG_BT_RX_STACK_SIZE=2700 
    
    CONFIG_BT_DEVICE_NAME_MAX=30
    CONFIG_BT_DEVICE_NAME="52840_NUS"
    CONFIG_BT_DEVICE_NAME_DYNAMIC=y
    
    CONFIG_BT_MAX_CONN=2
    
    CONFIG_BT_CTLR_CONN_RSSI=y
    
    CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
    CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y
    
    
    CONFIG_BT_BUF_ACL_TX_SIZE=251
    CONFIG_BT_BUF_ACL_RX_SIZE=251
    CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
    
    CONFIG_BT_L2CAP_TX_MTU=247
    
    # #================BLUETOOTH_peripheral================
    
    CONFIG_BT_PERIPHERAL=y
    
    CONFIG_BT_NUS=y # Enable the NUS service
    
    # CONNECTION PARAMETERS
    CONFIG_BT_PERIPHERAL_PREF_MIN_INT=30
    CONFIG_BT_PERIPHERAL_PREF_MAX_INT=50
    CONFIG_BT_PERIPHERAL_PREF_LATENCY=0
    CONFIG_BT_PERIPHERAL_PREF_TIMEOUT=40
    
    CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=y   
     
    
    CONFIG_BT_LIM_ADV_TIMEOUT=40
    
    #====================BT DFU====================
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
    
    
    #====================UART DFU (MCUMGR)====================
    # # STEP 5.2 - Enable mcumgr DFU in application
    # Enable MCUMGR 
    CONFIG_MCUMGR=y
    
    # Enable MCUMGR management for both OS and Images
    CONFIG_MCUMGR_GRP_OS=y
    CONFIG_MCUMGR_GRP_IMG=y
    
    # Configure MCUMGR transport to UART
    CONFIG_MCUMGR_TRANSPORT_UART=y
    
    # Dependencies
    # Configure dependencies for CONFIG_MCUMGR  
    CONFIG_NET_BUF=y
    CONFIG_ZCBOR=y
    CONFIG_CRC=y
    
    # Configure dependencies for CONFIG_MCUMGR_GRP_IMG  
    CONFIG_FLASH=y
    CONFIG_IMG_MANAGER=y
    
    # Configure dependencies for CONFIG_IMG_MANAGER  
    CONFIG_STREAM_FLASH=y
    CONFIG_FLASH_MAP=y
    
    # Configure dependencies for CONFIG_MCUMGR_TRANSPORT_UART 
    CONFIG_BASE64=y
    
    
    #================BLUETOOTH_central================
    # Enable the BLE stack with GATT Client configuration
    CONFIG_BT_CENTRAL=y
    
    CONFIG_BT_GATT_CLIENT=y
    
    # Enable the BLE modules from NCS
    CONFIG_BT_NUS_CLIENT=y
    CONFIG_BT_SCAN=y
    CONFIG_BT_SCAN_FILTER_ENABLE=y
    CONFIG_BT_SCAN_UUID_CNT=1
    CONFIG_BT_SCAN_NAME_CNT=1
    CONFIG_BT_GATT_DM=y
    
    CONFIG_BT_SCAN_WITH_IDENTITY=y
    
    #================LOW_FREQ_CLOCK================
    CONFIG_CLOCK_CONTROL=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=n
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y
    CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y
    
    
    #================POWER MANAGMENT================
    CONFIG_PM_DEVICE=y
    
    
    
    
    #====================PIPES====================
    CONFIG_PIPES=y
    
    
    
    
    ==========================OVERLAY=====================
    
    
    
    
    &reg0 {
        compatible = "nordic,nrf52x-regulator-hv";
    	status = "okay";
    };
    
    &reg1 {
        compatible = "nordic,nrf5x-regulator";
    	regulator-initial-mode = <NRF5X_REG_MODE_DCDC>;
    };
    
    &uicr {
    
        // NFC
        nfct-pins-as-gpios;
    
        // Reset pin
    	/delete-property/ gpio-as-nreset;
    };
    
    /{
        my_output{
    
            compatible = "gpio-leds";
    
            led_red: LED_RED {
                gpios = < &gpio0 9 0 >;
                label = "LED_RED";
            };
    
            led_green: LED_GREEN {
                gpios = < &gpio0 10 0 >;
                label = "LED_GREEN";
            };
    
        };
    };
    
    
    /{
    
        my_input {
    
            compatible = "gpio-keys";
    
            my_input_0: MY_INPUT_0 {
                gpios = < &gpio0 4 0 >;
                label = "MY INPUT 0";
            };
    
        };     
    };
    
    
    //==================UART==================//
    
    
    &pinctrl {
    
        uart0_default: uart0_default {
    
            group1 {
                psels = <NRF_PSEL(UART_TX, 0, 6)>,
                        <NRF_PSEL(UART_RX, 0, 8)>;
            };
        };
    
        uart0_sleep: uart0_sleep {
    
            group1 {
                psels = <NRF_PSEL(UART_TX, 0, 6)>,
                        <NRF_PSEL(UART_RX, 0, 8)>;
                low-power-enable;
            };
        };
    };
    
    &uart0 {
    
        compatible = "nordic,nrf-uarte";
        status = "okay";
        current-speed = < 115200 >;
        pinctrl-0 = < &uart0_default >;
        pinctrl-1 = < &uart0_sleep >;
        pinctrl-names = "default", "sleep";
    
    };
    
    
    &pinctrl {
    
    	i2c0_default: i2c0_default {
    		group1 {
    			psels = <NRF_PSEL(TWIM_SDA, 1, 14)>,
                        <NRF_PSEL(TWIM_SCL, 0, 12)>;
                nordic,drive-mode = <NRF_DRIVE_S0D1>; // standard 0, disconnect 1
                bias-pull-up; // internal pull-up is too weak, only for 100kHz or lower  
                
    		};
    	};
    
    	i2c0_sleep: i2c0_sleep {
    		group1 {
    			psels = <NRF_PSEL(TWIM_SDA, 1, 14)>,
                        <NRF_PSEL(TWIM_SCL, 0, 12)>;
    			low-power-enable;
    		};
    	};
    };
    
    &i2c0 {
    
        compatible = "nordic,nrf-twim";
        status = "okay";
        clock-frequency = <I2C_BITRATE_STANDARD>;
        pinctrl-0 = <&i2c0_default>;
        pinctrl-1 = <&i2c0_sleep>;
        pinctrl-names = "default", "sleep";
    
        lis3dh: lis3dh@19 
        {
            compatible = "vendor,i2cdevice";
            reg = <0x19>;
        };
    
    };
    
    &pinctrl {
    
        spi1_default: spi1_default {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK,  0, 22)>,
                        <NRF_PSEL(SPIM_MOSI, 0, 30)>,
                        <NRF_PSEL(SPIM_MISO, 0, 23)>;
            };
        };
        spi1_sleep: spi1_sleep {
            group1 {
                psels = <NRF_PSEL(SPIM_SCK,  0, 22)>,
                        <NRF_PSEL(SPIM_MOSI, 0, 30)>,
                        <NRF_PSEL(SPIM_MISO, 0, 23)>;
                low-power-enable;
            };
        }; 
    };
    
    &spi1 {
    
        compatible = "nordic,nrf-spim";
        status = "okay";
        pinctrl-0 = <&spi1_default>;
        pinctrl-1 = <&spi1_sleep>;
        pinctrl-names = "default", "sleep";
        cs-gpios = <&gpio0 24 GPIO_ACTIVE_LOW>,
                   <&gpio0 25 GPIO_ACTIVE_LOW>;
    
        m95p16: m95p16@0
        {
            compatible = "vendor,spidevice";
            reg = < 0 >;
            spi-max-frequency = < DT_FREQ_M(8) >;
            wp-gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
        };
    
        at45db041: at45db041@1
        {
            compatible = "vendor,spidevice"; 
            reg = < 1 >;
            spi-max-frequency = < DT_FREQ_M(8) >;
            wp-gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
        };
    };
    
    
    &adc {
    
        compatible = "nordic,nrf-saadc";
    	#address-cells = <1>;
    	#size-cells = <0>;
    	status = "okay";
        /* 52840 adc channel */
        /* P0.02、03、04、05、28、29、30、31 */
    	channel@0 
        {
    		reg = <0>;
    		zephyr,gain = "ADC_GAIN_1_6";
    		zephyr,reference = "ADC_REF_INTERNAL";
    		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
    		zephyr,input-positive = <NRF_SAADC_AIN0>;
            // zephyr,input-negative = <NRF_SAADC_AIN3>; // 负输入
    		zephyr,resolution = <12>;
    	};
    
        channel@1 
        {
    		reg = <1>;
    		zephyr,gain = "ADC_GAIN_1_6";
    		zephyr,reference = "ADC_REF_INTERNAL";
    		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
    		zephyr,input-positive = <NRF_SAADC_AIN1>; 
    		zephyr,resolution = <12>;
    	};
    
        channel@2
        {
    		reg = <2>;
    		zephyr,gain = "ADC_GAIN_1_6";
    		zephyr,reference = "ADC_REF_INTERNAL";
    		zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>;
    		zephyr,input-positive = <NRF_SAADC_VDD>;
    		zephyr,resolution = <12>;
    	};
    };
    
    /{
    	zephyr,user 
        {
    		io-channels = <&adc 0>, 
                          <&adc 1>,
                          <&adc 2>;
    	};
    };
    
    &wdt0 {
    
        compatible = "nordic,nrf-wdt";
        status = "okay";
        
    };
    
    /{
    
        aliases
        {
    
            io-led-red     = &led_red;
            io-led-green   = &led_green;
    
            io-but0        = &my_input_0;
    
            spi-m95p16     = &m95p16;
            
            i2c-lis3dh     = &lis3dh;
    
            uart-0         = &uart0;
    
    
            m-watchdog     = &wdt0;
    
        };
    
    };
    
    
    &mx25r64 {
    
    	status = "disabled";
    
    };

    Regards,

    Wu

  • Hello,

    While checking the shared prj.config, I see that you are enabling RTT instead of UART for logs and the console, which disables all console output and logging over UART. So even if DFU starts working, you won't see any feedback on the UART line (used by Auterm), as it's being sent to RTT instead. Only one backend should be active. If you're doing DFU over UART, then UART must be the active log backend. RTT should be disabled during DFU testing. Try using the configuration below:

    CONFIG_LOG_BACKEND_UART=y
    CONFIG_LOG_BACKEND_RTT=n
    CONFIG_UART_CONSOLE=y
    CONFIG_RTT_CONSOLE=n
    

    Kind Regards,

    Abhijith

  • Hi

        Still not working , actually i can see DFU feedback from jlink RTT viewer with my original prj.conf settings.

    The only difference between success and fail is whether UART0 irq callback was intiailized by 

    uart_irq_callback_user_data_set API in the beginning, Is there any way to disable my irq callback? i tried uart_irq_callback_user_data_set(dev_uart0, NULL, NULL) but its not working.

    Fail

    success

    Regards,

    Wu

Related