hy, i have a problem wit undefine simbol, how to define the simbol, i laready add related path folder that contain the undefine simbol target, but this error still appear.
.\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_drv_clock_init (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_drv_clock_lfclk_request (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_drv_rtc_disable (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_drv_rtc_enable (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_drv_rtc_init (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_drv_rtc_tick_enable (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_add_packet_to_tx_fifo (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_enable (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_fetch_packet_from_rx_fifo (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_init (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_base_address_0 (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_base_address_1 (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_channel_table (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_datarate (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_max_tx_attempts (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_timeslot_period (referred from main.o). .\_build\nrf51422_xxac.axf: Error: L6218E: Undefined symbol nrf_gzll_set_timeslots_per_channel (referred from main.o). Not enough information to list image symbols. Not enough information to list load addresses in the image map.
if you wanto check my code:
/* * Either COMPILE_RIGHT or COMPILE_LEFT has to be defined from the make call to allow proper functionality */ #include "redox-w.h" #include "nrf_drv_config.h" #include "nrf_gzll.h" #include "nrf_gpio.h" #include "nrf_delay.h" #include "nrf_drv_clock.h" #include "nrf_drv_rtc.h" #include "nrf51_bitfields.h" #include "nrf51.h" /*****************************************************************************/ /** Configuration */ /*****************************************************************************/ const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(1); /**< Declaring an instance of nrf_drv_rtc for RTC1. */ // Data and acknowledgement payloads static uint8_t ack_payload[NRF_GZLL_CONST_MAX_PAYLOAD_LENGTH]; ///< Placeholder for received ACK payloads from Host. // Debounce time (dependent on tick frequency) #define DEBOUNCE 5 // Mark as inactive after a number of ticks: #define INACTIVITY_THRESHOLD 500 // 0.5sec #ifdef COMPILE_LEFT static uint8_t channel_table[3]={4, 42, 77}; #endif #ifdef COMPILE_RIGHT static uint8_t channel_table[3]={25, 63, 33}; #endif // Setup switch pins with pullups static void gpio_config(void) { nrf_gpio_cfg_sense_input(R01, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH); nrf_gpio_cfg_sense_input(R02, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH); nrf_gpio_cfg_sense_input(R03, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH); nrf_gpio_cfg_sense_input(R04, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH); nrf_gpio_cfg_sense_input(R05, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH); nrf_gpio_cfg_output(C01); nrf_gpio_cfg_output(C02); nrf_gpio_cfg_output(C03); nrf_gpio_cfg_output(C04); nrf_gpio_cfg_output(C05); nrf_gpio_cfg_output(C06); nrf_gpio_cfg_output(C07); nrf_gpio_pin_clear(C01); nrf_gpio_pin_clear(C02); nrf_gpio_pin_clear(C03); nrf_gpio_pin_clear(C04); nrf_gpio_pin_clear(C05); nrf_gpio_pin_clear(C06); nrf_gpio_pin_clear(C07); } // Return the key states static void read_keys(uint8_t *row_stat) { unsigned short c; uint32_t input = 0; static const uint32_t COL_PINS[] = { C01, C02, C03, C04, C05, C06, C07 }; // scan matrix by columns for (c = 0; c < COLUMNS; ++c) { // Force the compiler to add one cycle gap between activating // the column pin and reading the input to allow some time for // it to be come stable. Note that compile optimizations are // not allowed for next three statements. Setting the pin // write a location which is marked as volatile // (NRF_GPIO->OUTSET) and reading the input is also a memory // access to a location which is marked as volatile too // (NRF_GPIO->IN). nrf_gpio_pin_set(COL_PINS[c]); //asm volatile("nop"); input = NRF_GPIO->IN; row_stat[0] = (row_stat[0] << 1) | ((input >> R01) & 1); row_stat[1] = (row_stat[1] << 1) | ((input >> R02) & 1); row_stat[2] = (row_stat[2] << 1) | ((input >> R03) & 1); row_stat[3] = (row_stat[3] << 1) | ((input >> R04) & 1); row_stat[4] = (row_stat[4] << 1) | ((input >> R05) & 1); nrf_gpio_pin_clear(COL_PINS[c]); } } static bool compare_keys(const uint8_t* first, const uint8_t* second, uint32_t size) { for(int i=0; i < size; i++) { if (first[i] != second[i]) { return false; } } return true; } static bool empty_keys(const uint8_t* keys_buffer) { for(int i=0; i < ROWS; i++) { if (keys_buffer[i]) { return false; } } return true; } static void handle_inactivity(const uint8_t *keys_buffer) { static uint32_t inactivity_ticks = 0; // looking for 500 ticks of no keys pressed, to go back to deep sleep if (empty_keys(keys_buffer)) { inactivity_ticks++; if (inactivity_ticks > INACTIVITY_THRESHOLD) { nrf_drv_rtc_disable(&rtc); nrf_gpio_pin_set(C01); nrf_gpio_pin_set(C02); nrf_gpio_pin_set(C03); nrf_gpio_pin_set(C04); nrf_gpio_pin_set(C05); nrf_gpio_pin_set(C06); nrf_gpio_pin_set(C07); inactivity_ticks = 0; NRF_POWER->SYSTEMOFF = 1; } } else { inactivity_ticks = 0; } } static void handle_send(const uint8_t* keys_buffer) { static uint8_t keys_snapshot[ROWS] = {0}; static uint32_t debounce_ticks = 0; const bool no_change = compare_keys(keys_buffer, keys_snapshot, ROWS); if (no_change) { debounce_ticks++; // debouncing - send only if the keys state has been stable // for DEBOUNCE ticks if (debounce_ticks == DEBOUNCE) { // Assemble packet and send to receiver nrf_gzll_add_packet_to_tx_fifo(PIPE_NUMBER, keys_snapshot, ROWS); debounce_ticks = 0; } } else { // change detected, start over debounce_ticks = 0; for (int k = 0; k < ROWS; k++) { keys_snapshot[k] = keys_buffer[k]; } } } // 1000Hz debounce sampling static void tick(nrf_drv_rtc_int_type_t int_type) { uint8_t keys_buffer[ROWS] = {0, 0, 0, 0, 0}; read_keys(keys_buffer); handle_inactivity(keys_buffer); handle_send(keys_buffer); } // Low frequency clock configuration static void lfclk_config(void) { nrf_drv_clock_init(); nrf_drv_clock_lfclk_request(NULL); } // RTC peripheral configuration static void rtc_config(void) { //Initialize RTC instance nrf_drv_rtc_init(&rtc, NULL, tick); //Enable tick event & interrupt nrf_drv_rtc_tick_enable(&rtc, true); //Power on RTC instance nrf_drv_rtc_enable(&rtc); } int main() { // Initialize Gazell nrf_gzll_init(NRF_GZLL_MODE_DEVICE); // Attempt sending every packet up to 100 times nrf_gzll_set_max_tx_attempts(100); nrf_gzll_set_timeslots_per_channel(4); nrf_gzll_set_channel_table(channel_table,3); nrf_gzll_set_datarate(NRF_GZLL_DATARATE_1MBIT); nrf_gzll_set_timeslot_period(900); // Addressing nrf_gzll_set_base_address_0(0x01020304); nrf_gzll_set_base_address_1(0x05060708); // Enable Gazell to start sending over the air nrf_gzll_enable(); // Configure 32kHz xtal oscillator lfclk_config(); // Configure RTC peripherals with ticks rtc_config(); // Configure all keys as inputs with pullups gpio_config(); // Main loop, constantly sleep, waiting for RTC and gpio IRQs while(1) { __SEV(); __WFE(); __WFE(); } } /*****************************************************************************/ /** Gazell callback function definitions */ /*****************************************************************************/ void nrf_gzll_device_tx_success(uint32_t pipe, nrf_gzll_device_tx_info_t tx_info) { uint32_t ack_payload_length = NRF_GZLL_CONST_MAX_PAYLOAD_LENGTH; if (tx_info.payload_received_in_ack) { // Pop packet and write first byte of the payload to the GPIO port. nrf_gzll_fetch_packet_from_rx_fifo(pipe, ack_payload, &ack_payload_length); } } // no action is taken when a packet fails to send, this might need to change void nrf_gzll_device_tx_failed(uint32_t pipe, nrf_gzll_device_tx_info_t tx_info) { } // Callbacks not needed void nrf_gzll_host_rx_data_ready(uint32_t pipe, nrf_gzll_host_rx_info_t rx_info) {} void nrf_gzll_disabled() {}