NRF52840 多个按键时提示内存不足的问题

在使用NRF52840开发项目时遇到内存不足错误,通过调整GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS的中断数目,解决了因配置问题导致的内存空间问题,确保编译后的代码正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用NRF52840开发新的项目时, 设备有多个按键。 编译运行时, 提示错误 4 [NRF_ERROR_NO_MEM]。 这个错误经常见,像往常一样, 修改了RAM设置的尺寸, 再编译还是提示内存空间不足。 检查了编译后的代码大小, 并没有超出范围。 后来发现是SDK 配置里对中断的数目有设置, 需要调整。 

将GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 的数目调整为超过按键和其他中断事件的总和。再编译,一切正常。 

#include <stdbool.h> #include <stdint.h> #include "nrf_delay.h" #include "boards.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #include "stdio.h" #include "string.h" #include "ctype.h" #include "app_simple_timer.h" #include <stdio.h> #include "app_error.h" // 定义LED引脚 #define LED1 NRF_GPIO_PIN_MAP(0, 13) #define LED2 NRF_GPIO_PIN_MAP(0, 14) #define LED3 NRF_GPIO_PIN_MAP(0, 15) #define LED4 NRF_GPIO_PIN_MAP(0, 16) // 初始化日志模块 static void log_init(void) {     ret_code_t err_code = NRF_LOG_INIT(NULL);     APP_ERROR_CHECK(err_code);     NRF_LOG_DEFAULT_BACKENDS_INIT(); } // 设置GPIO高电平的输出电压为3.3V static void gpio_output_voltage_setup_3v3(void) {     if ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) !=         (UICR_REGOUT0_VOUT_3V3 << UICR_REGOUT0_VOUT_Pos))     {         NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;         while (NRF_NVMC->READY == NVMC_READY_READY_Busy)         {         }         NRF_UICR->REGOUT0 = (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) |                             (UICR_REGOUT0_VOUT_3V3 << UICR_REGOUT0_VOUT_Pos);         NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;         while (NRF_NVMC->READY == NVMC_READY_READY_Busy)         {         }         NVIC_SystemReset();     } } // 计数器变量 volatile uint8_t count = 0; // 计数方向翻转标志 volatile bool flip_count = false; // 检查按钮状态并更新计数器 void check_buttons() {     static bool s1_pressed = false;     static bool s2_pressed = false;     static bool s3_pressed = false;     bool s1_state = nrf_gpio_pin_read(BUTTON_1) == 0;     bool s2_state = nrf_gpio_pin_read(BUTTON_2) == 0;     bool s3_state = nrf_gpio_pin_read(BUTTON_3) == 0;     if (s1_state && !s1_pressed)     {         if (s2_state)         {             count = 0; // 按钮1和2同按下,复位计数器         }         else if (s3_state)         {             flip_count = !flip_count; // 按钮1和3同按下,翻转计数方向         }         else         {             if (!flip_count)             {                 count = (count + 1) % 16; // 正向计数             }             else             {       count = (count - 1) & 0x0F; // 反向计数             }         }         s1_pressed = true;     }     else if (!s1_state)     {         s1_pressed = false;     }     if (s2_state && !s2_pressed)     {         if (s1_state)         {             count = 0; // 按钮1和2同按下,复位计数器         }         else         {             if (!flip_count)             {                 count = (count - 1) & 0x0F; // 反向计数             }             else             {                 count = (count + 1) % 16; // 正向计数             }         }         s2_pressed = true;     }     else if (!s2_state)     {         s2_pressed = false;     }     if (s3_state && !s3_pressed)     {         if (s1_state)         {             flip_count = !flip_count; // 按钮1和3同按下,翻转计数方向         }         s3_pressed = true;     }     else if (!s3_state)     {         s3_pressed = false;     } } // 更新LED状态 void update_leds() {     nrf_gpio_pin_write(LED1, !(count & 0x01));        // 显示最低位     nrf_gpio_pin_write(LED2, !((count >> 1) & 0x01)); // 显示第1位     nrf_gpio_pin_write(LED3, !((count >> 2) & 0x01)); // 显示第2位     nrf_gpio_pin_write(LED4, !((count >> 3) & 0x01)); // 显示最高位 } // 主函数 int main(void) {     gpio_output_voltage_setup_3v3(); // 设置GPIO输出电压为3.3V     log_init();                      // 初始化日志模块     bsp_board_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS); // 初始化LED和按钮     NRF_LOG_INFO("led blinky example started"); // 打印启动信息     NRF_LOG_FLUSH();     while (true)     {         check_buttons(); // 检查按钮状态         update_leds();   // 更新LED状态     } }这是我以前的代码,我需要你用这个代码的按键定义写一个在segger embedded studio5.68版本中运行按键长按与双击控制LED灯的程序,你可以在你上面写的程序里面修改
最新发布
03-23
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值