stm32 cube ide 编译提示 undefined reference to

需求 编译的时候,提示 undefined reference to 解决 这种问题经常会碰到,一般就是相关源文件没有在编译列表里面,结果经过仔细查找,都添加进去了。后来经过仔细查找,发现原来是 c++ 和 c 混合编译的问题,在 c++ 中文件里面调用的函数,其所在的头文件没有使用 extern "C" 包含,导致的。想要修改也很简单,不需要改动头文件,只需要在 c++ 文件中这样: #include "gx_api.h" extern "C" { #include "gx_display.h" } 而且其实在 map 文件中是有相关线索的,下面分别是没有用 extern 包含,和用了 extern 包含的 map 文件中的函数信息。可以明显看到有 extern 包含的,有相关地址。 .text._gx_display_driver_565rgb_setup 0x0000000000000000 0x260 ./guix/common/src/gx_display_driver_565rgb_setup.o .text._gx_display_driver_565rgb_setup 0x000000000801e6e8 0x260 ./guix/common/src/gx_display_driver_565rgb_setup.o 0x000000000801e6e8 _gx_display_driver_565rgb_setup 参考 gcc “undefined reference to” 问题解决方法

<span title='2023-11-17 16:17:00 +0800 CST'>2023-11-17</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;53 words&nbsp;·&nbsp;RamLife

stm32cubeide threadx 开启 stack check

需求 如何使用 stm32cubeide 开启 threadx 中的 stack check ? 解决 使能 stack check 在项目属性中, C/C++ Build -> Settings -> MCU GCC Compiler -> Preprocessor 中添加 TX_ENABLE_STACK_CHECKING 在 MCU G++ Compiler 中添加同样的 TX_ENABLE_STACK_CHECKING printf 函数 #include "stdio.h" #include "usart.h" int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, 0xFFFF); return len; } *注意: 需要在头文件中增加 int _write(int file, char *ptr, int len); , 否则可能无法覆盖由 __attribute__((weak)) 修饰的原来 _write. * 处理函数 VOID StackErrorHandler(TX_THREAD * thread_ptr) { printf("=============================================================== \n"); printf("如下任务被检测出栈溢出 \n"); printf("=============================================================== \n"); printf(" 任务优先级 任务栈大小 当前使用栈 最大栈使用 任务名 \n"); printf(" Prio StackSize CurStack MaxStack Taskname \n"); TX_THREAD *p_tcb; /* 定义一个任务控制块指针 */ p_tcb = &ServiceVibration; /* 遍历任务控制列表TCB list),打印所有的任务的优先级和名称 */ do { if (p_tcb !...

<span title='2023-11-10 13:58:00 +0800 CST'>2023-11-10</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;252 words&nbsp;·&nbsp;RamLife

stm32cubeide 使用 threadx

需求 如何使用 stm32cubeide 运行 threadx? 解决 启用 threadx core 打开项目 ioc 文件, Middleware and software Packs -> THREADX -> Mode 勾选 core 下方的 configuration 中, TX_TIMER_TICKS_PER_SECOND 设置为 1000. Memory Configuration 中的 ThreadX memory pool size 也设置大一点,这个是默认生成的字节池的大小。 左侧 System Core 中的 SYS, 修改 Timebase Source 为 TIM7. 这个一定要修改,因为 HAL 的基准是 systick, threadx 的基准也是 systick, 如果不修改,会导致不自动生成 systick 的 handler 函数,导致进入 hard fault. 至于到底修改为哪个 tim, 这个就随便了。 保存自动生成代码。 使用 threadx 新建文件,创建 UINT ThreadInit(TX_BYTE_POOL * byte_pool) 这样的函数,然后在 app....

<span title='2023-11-09 18:51:00 +0800 CST'>2023-11-09</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;209 words&nbsp;·&nbsp;RamLife

stm32 cube ide 寄存器变量监控

需求 调试的时候,有时候会比较在意某个寄存器到底是什么时候被修改? 解决 这个其实可以参照 eclipse 正常的变量监控的方法去做。 找到寄存器对应的结构体变量,比如说我需要监视 uart1 的 TCIE 在 DMA 发送的时候,是什么时候被置位的。我就可以先找到 uart1 对应的结构体变量 huart1. 添加变量监控。 在 右侧的 expressions 中添加 huart1 添加断点。 在 huart1 -> instance -> CR1 上面右键,点击 add watch point 就可以新增一个监视这个寄存器的断点了。 参考 Eclipse开启变量监控

<span title='2023-10-25 18:19:00 +0800 CST'>2023-10-25</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;36 words&nbsp;·&nbsp;RamLife

STM32CubeIDE 使用 dap 通过 openocd 调试

需求 最近使用 stm32u575 芯片的时候,调试时发现很尴尬的问题, jlink 必须安装高版本,然后盗版的就不能用了。MDK 可以直接使用 DAPLink,但是 stm32cubeide 不能直接支持。所以需要想办法解决这个问题。 解决 参考了网上的资料,st 自带的 openocd 不能用,端口不对。 openocd 需要下载官方的 openocd,不要使用 stm32cubeide 自带的。下载地址: https://gnutoolchains.com/arm-eabi/openocd/ 。下载后自行安装。 配置 openocd stm32cubeide 菜单栏 -> Run -> External Tools -> External Tools Configrations -> Program 右键 -> New Configration. Name 自己输入。 Location: 选择刚才下载的 openocd 中的 openocd.exe 所在路径。 Arguments: -f interface\cmsis-dap.cfg -f target\stm32u5x.cfg apply 然后 Run. 配置 debug Run -> Debug Configurations -> GDB Hardware Debugging 右键 -> New Configuratin....

<span title='2023-10-10 15:38:00 +0800 CST'>2023-10-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;168 words&nbsp;·&nbsp;RamLife

stm32 cube ide 打印开启浮点数支持

需求 在使用 stm32 cube ide 开发的时候,调试时希望使用 sprintf, printf 等 通过 %f 打印浮点数,需要开启 ide 相关支持. 解决 开启 浮点数支持, =project –> properties –> c/c++ build –> setting –> tools setting –> mcu setting –> use float with printf from newlib-nano(-u_printf_float)= 参考 C语言用printf读取和输出double类型

<span title='2023-05-24 17:35:00 +0800 CST'>2023-05-24</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;40 words&nbsp;·&nbsp;RamLife

stm32 cube ide 使用 c 和 c++ 混合开发

需求 在使用 stm32 cube ide 开发的时候,希望通过 c++ 开发,但是自动生成的一些文件是 c 语言的,所以需要解决混合开发的问题。 解决 项目使用 cpp 在新建项目的时候,targeted language 选择 C++ 即可。 混合开发 所有 cpp 需要用到的 c 的头文件,都需要包含 extern "C" 这个标识,需要把相关代码如下包含起来: // may be main.h #ifdef __cplusplus extern "C" { #endif // something #ifdef __cplusplus } #endif 参考 STM32CubeIDE实现nRF24L01通信(C和C++混合编程) STM32CubeMX快速创建工程 点亮LED灯 设置C/C++混合编译 让你的 STM32Cube KEILV5 + HAL库工程支持C++开发 C 和 C++混合编译

<span title='2023-05-17 17:35:00 +0800 CST'>2023-05-17</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;56 words&nbsp;·&nbsp;RamLife