当我调试时,STM32CubeIDEstartup_stm32f722xx.s在微控制器重置时打开文件(当我开始调试或重置微控制器时)。
看起来调试器有一些“隐藏”断点,它击中了它们,然后继续,但文件保持打开状态。
现在对我来说没有用。对此我能做什么?
我正在使用 STM32CubeIDE 1.6.1 和 STM Nucleo-F722ZE(板载 STLink 3v)。
我正在学习 STM32 裸机编程,在此过程中我使用 STM32F429ZI mcu。我在互联网上阅读了很多示例,它们都只使用一个链接描述文件。我在想,如果这些示例非常适合我的 MCU,那么链接器脚本在功能方面将与 STM32CubeIDE 生成的链接器脚本相同(?)。
现在我的问题是,当我使用 STM32CubeIDE 生成项目时,我得到了 2 个链接器脚本,但是STM32F429ZITX_FLASH.ld当我检查构建日志时,仅使用了一个链接器脚本,即. STM32CubeIDE 使用一两个链接器脚本来构建项目吗?如果它只使用一个,那么为什么它生成两个链接描述文件?STM32F429ZITX_RAM.ldSTM32F429ZITX_FLASH.ld
下面,我发布了构建日志。这是我在构建日志中找到的命令:
arm-none-eabi-gcc -o "STM32F429ZI-Test.elf" @"objects.list" -mcpu=cortex-m4 -T"/home/biomed/STM32CubeIDE/workspace_1.4.0/STM32F429ZI-Test/STM32F429ZITX_FLASH.ld"
Run Code Online (Sandbox Code Playgroud)
arm-none-eabi-gcc -o "STM32F429ZI-Test.elf" @"objects.list" -mcpu=cortex-m4 -T"/home/biomed/STM32CubeIDE/workspace_1.4.0/STM32F429ZI-Test/STM32F429ZITX_FLASH.ld"
14:10:36 **** Build of configuration Debug for project STM32F429ZI-Test ****
make -j8 all
arm-none-eabi-gcc "../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c" -mcpu=cortex-m4 -std=gnu11 -g3 -DUSE_HAL_DRIVER -DDEBUG -DSTM32F429xx -c -I../Core/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc -I../Drivers/STM32F4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F4xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.d" -MT"Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.o"
arm-none-eabi-gcc "../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c" -mcpu=cortex-m4 -std=gnu11 …Run Code Online (Sandbox Code Playgroud) 我使用 STM32CubeIDE 通过“文件”>“新建”>“STM32 项目”为我的 nucleo-f411re 板创建了一个新的 (C++) 项目。该项目像往常一样创建。因为我选择 C++ 作为目标语言,所以我将“main.c”重命名为“main.cpp”。一个简单的“blinky”编译并在板上正确运行。所以现在我想开始向项目添加一些 C++ 代码。
“main.cpp”位于项目树中的 myproject > Core > Src > main.cpp 下。如果我想创建一些新的源/头文件,例如“foo.h”和“foo.cpp”,我想我可以右键单击项目树中的某些内容,然后“新建”>“头文件”或“新建”>“源文件”。但问题是——我右键单击什么来创建源文件/头文件?我假设该文件将在我右键单击的位置(=文件夹)中创建。我想把它们放在哪里?它们都在“Core”文件夹中吗?分别在“Core > Inc”和“Core > Src”文件夹中?我不知道。
编辑:我分别将头文件/源文件添加到 Core > Inc 和 Core > Src,这似乎有效。是推荐的吗?我想知道如果我更改配置,它们是否仍然存在,导致代码重新生成。
我使用的是 Ubuntu 22.04 以及 STM32 Cube IDE(最新版本)的官方 Debian 安装程序,直接从 STM 网站下载。
安装完所有内容(默认安装,位于/opt/st/)后,我启动了 IDE 并开始使用它。我设法快速找到了为我的 STM32L-Discovery 板创建、构建和启动一个简单的闪烁测试程序(闪烁两个 LED)的方法(尽管我对板和 ARM 的总体技能都很差)。
现在的问题是第二天我无法再启动 IDE。从那以后一直都是这样。一旦启动(无论是从菜单中安装创建的启动器(我有 XFCE)还是通过终端),IDE 在初始屏幕中的进度条填满后保持空闲状态:
奇怪的是,htop我没有看到任何活动:
[
永远都是这样。好吧,永远在这里意味着 20-30 分钟,直到我的耐心耗尽。:D
我看到启动器启动了Wayland版本。我尝试了另一个以防万一,尽管从安装开始后第一次开始这应该不是问题(即使使用我的旧笔记本电脑)。
有人知道解决办法吗?我可以尝试重新安装并删除我的工作区,尽管 IDE 目前似乎并不支持后者。
我正忙着用 STM32F030C8 单片机开发一些新硬件。我正在使用带有 gcc 的 STM32CubeIDE。我对微控制器开发非常陌生,这是我使用 ST 及其工具的第一个项目。
这是一个非常基本的程序,它只触发一个 GPIO。其余的都是生成的代码。由于我在这方面的经验很少,我希望有人可以指出我可以查看的位置。我怀疑这可能是配置问题。
这是代码(我删除了所有生成的注释以使其更紧凑):
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2); //my code 1
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2); //my code 2
while (1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);
HAL_Delay(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
当我单步执行代码时,一旦我进入“我的代码 2”,它将触发“我的代码 1”上的 GPIO,这将导致问题。我什至尝试过只运行一个完全生成的程序而不做任何修改,但问题仍然存在。这是一个快速测试,看看程序是否确实在 mcu 上运行。它确实会触发 GPIO。
调试器控制台输出:
Temporary breakpoint 1, main () at ../Core/Src/main.c:74
74 HAL_Init();
Program received signal SIGTRAP, Trace/breakpoint trap.
0x1fffecec in ?? ()
Run Code Online (Sandbox Code Playgroud)
临时断点是程序开始的地方,然后我可以从那里运行。或者单步执行,结果都是一样的。
控制台输出:
Waiting for debugger connection...
Debugger connected
-------------------------------------------------------------------
STM32CubeProgrammer v2.4.0
-------------------------------------------------------------------
ST-LINK SN : 34FF6E065250343816210143
ST-LINK …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 MacOS BigSur 上安装 STM32CubeProgrammer,我已按照网站上的以下步骤进行操作: https: //community.st.com/s/question/0D50X0000BmnqrB/how-to-run-stm32cubeprogrammer-on-macos-catalina- 10151-19b88?t=1620993010340。虽然当我使用终端运行程序时,它给我一个错误,说我找不到 jre 文件夹。但从网站下载时,附带了jre文件夹、SetupSTM32CubeProgrammer-2.7.0.exe和SetupSTM32CubeProgrammer-2.7.0.app。
这是错误行:
JRE Folder not found!
Run Code Online (Sandbox Code Playgroud)
我正在尝试从 NUCLEO F446RE stm32 板上的电脑接收 8 个字节。传输至电脑即可。问题是,我无法使用 DMA 接收数据。我看到了一个具有几乎相同代码的示例,并且它对这个人有用。如果我使用中断模式(只需将 HAL_UART_Receive_DMA 更改为 HAL_UART_Receive_IT,它确实可以工作并且正在调用 RX Complete 回调。
这是完整的 main.c。DMA 处于循环模式。
main.c
Run Code Online (Sandbox Code Playgroud)
面临着我们无法摆脱的警告。我使用 stm32 MCU 和 STM32CubeIDE 以及标准 C11 编译器。我想我可以理解为什么编译器会抛出警告,但问题是我无法解决。任何帮助表示赞赏。谢谢。
指针数组是这样定义的
static const GPIO_TypeDef *gpioOutPortss[GPIO_OUT_CH_NR] =
{
DOUT_OD_OUT4_GPIO_Port,
DOUT_OD_OUT6_GPIO_Port,
DOUT_OD_OUT5_GPIO_Port,
DOUT_OD_OUT7_GPIO_Port,
DOUT_LED_DISABLE_GPIO_Port,
DOUT_BUZZ_GPIO_Port,
DOUT_OD_OUT8_GPIO_Port,
DOUT_OD_OUT3_GPIO_Port,
DOUT_OD_OUT2_GPIO_Port,
DOUT_OD_OUT1_GPIO_Port,
DOUT_ALARM_GPIO_Port,
DOUT_12V_PWR_GPIO_Port,
DOUT_12V_PWR_GPIO_Port
};
Run Code Online (Sandbox Code Playgroud)
要调用的函数是这样定义的:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if(PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
}
}
Run Code Online (Sandbox Code Playgroud)
实际的函数调用如下所示:
if (gpioOutPolarity[channel])
{
HAL_GPIO_WritePin(gpioOutPortss[channel], gpioOutPins[channel],
GPIO_PIN_SET);
}
Run Code Online (Sandbox Code Playgroud)
编译器产生的警告是这样的:
warning: passing argument 1 of 'HAL_GPIO_WritePin' discards 'const' qualifier …Run Code Online (Sandbox Code Playgroud) Prolog:我正在使用 STM32 CubeIDE 为 STM32 微控制器开发嵌入式应用程序,例如 F1 系列、F4 系列、G0 系列和其他一些使用 C 语言的控制器。
发生了什么:今天早上,自动更新功能建议我更新到 STM CubeID 版本 1.9.0,我接受了。更新程序完成后,我打开当前项目并更改 typedef 结构中的一个变量,然后单击“构建”按钮。突然,链接器报告了很多“多重定义”和“首先在此处定义”错误。该项目昨天使用 CubeIDE 1.8 版本完美编译,没有任何问题
经过一两个小时的搜索后,我可能错过了一个分号或其他方向的东西,这可能会弄乱整个代码,我得出的结论是,从 CubeIDE 1.8.0 升级到 1.9.0 可能是根源导致此错误的原因。
所以我决定卸载 CubeIDE 1.9.0 并重新安装版本 1.8.0,将项目回滚到昨天晚上的最后一个工作版本(使用 1.8.0 编译),进行相同的更改,瞧!- 一切又恢复正常了。
对我来说,STM 似乎把链接器弄乱了。任何人都可以证实这种行为,还是只有我受到影响?
我已经对 STM32 (F103RB) 进行了几周的修修补补,但我不明白的一件事是
HAL_ADC_PollForConversion
Run Code Online (Sandbox Code Playgroud)
功能目的。我的意思是,我没有看到此功能对 ADC 读数有任何影响。这是我的代码示例:
Version 1 (with PollForConversion on)
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t value = HAL_ADC_GetValue(&hadc1);
float voltage = 3.3f * value / 4096.0f;
printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART
HAL_Delay(250);
}
Version 2 (with PollForConvertion off)
while (1)
{
HAL_ADC_Start(&hadc1);
//HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
uint32_t value = HAL_ADC_GetValue(&hadc1);
float voltage = 3.3f * value / 4096.0f;
printf("ADC = %lu (%.3f V)\n", value, voltage); //send the value via UART …Run Code Online (Sandbox Code Playgroud)