标签: stm32

CodeSourcery链接器错误到静态库

我创建了两个静态库,用于我正在使用Mentor Graphics CodeSourcery为ARM STM32F4xx处理器编写的C程序.我已将库及其目录添加到项目中的构建设置中,因为我认为它们应该是(在属性,C/C++构建 - >设置 - >工具设置 - >源代码CodeBench C链接器 - >库)但是当我编译并链接项目,我得到一个库中的函数未定义的引用错误.我试过改变库相对于彼此的顺序.我在编辑的日志中包含了一个片段,以清理长路径名.

我在这里完全失去了所以任何帮助表示赞赏.

'Building target: Firmware_Development'
'Invoking: Sourcery CodeBench C Linker'
arm-none-eabi-gcc -L"Libary1-Folder-Path" -L"Library2-Folder-Path" -Xlinker -Map="Firmware_Development.map" -T "firmware-rom-hosted.ld -mcpu=cortex-m4 -mthumb -o "Firmware_Development" "@objs.rsp" "@user_objs.rsp" "@libs.rsp"
src/main.o: In function `program_loop':
\\Debug/../src/main.c:99: undefined reference to `LwIP_Pkt_Handle'
\\Debug/../src/main.c:103: undefined reference to `LwIP_Periodic_Handle'
src/stm32f4xx_it.o: In function `__cs3_isr_exti15_10':
\\Debug/../src/stm32f4xx_it.c:187: undefined reference to `Eth_Link_ITHandler'
src/Config.o: In function `Communication_Init':
\\Debug/../Libraries_Firmware/src/Config.c:175: undefined reference to `ETH_BSP_Config'
\\Debug/../Libraries_Firmware/src/Config.c:178: undefined reference to `LwIP_Init'
collect2.exe: error: ld returned 1 exit status …
Run Code Online (Sandbox Code Playgroud)

c gcc arm stm32 codesourcery

5
推荐指数
1
解决办法
764
查看次数

在cortex-m3上读取一个64位的volatile变量

我有一个32位的Cortex-M3 ARM控制器(STM32L1),其可以通过异步中断处理程序来修改在64位整数的变量。

volatile uint64_t v;
void some_interrupt_handler() {
    v = v + something;
}
Run Code Online (Sandbox Code Playgroud)

显然,我需要一种访问方式,以防止获取不一致的中途更新值。

这是第一次尝试

static inline uint64_t read_volatile_uint64(volatile uint64_t *x) {
    uint64_t y;
    __disable_irq();
    y = *x;
    __enable_irq();
    return y;
}
Run Code Online (Sandbox Code Playgroud)

该CMSIS内联函数__disable_irq(),并__enable_irq()有一个不幸的副作用,迫使编译器内存屏障,所以我试图拿出一些更精致

static inline uint64_t read_volatile_uint64(volatile uint64_t *x) {
    uint64_t y;
    asm (   "cpsid i\n"
            "ldrd %[value], %[addr]\n"
            "cpsie i\n"
            : [value]"=r"(y) : [addr]"m"(*x));
    return y;
}
Run Code Online (Sandbox Code Playgroud)

它仍然禁用中断,这是不希望的,因此我想知道是否有一种方法可以不诉诸cpsid。该权威指南的ARM Cortex-M3和Cortex-M4处理器,第三版由约瑟夫·耀

如果在处理器执行多周期指令(例如整数除法)时中断请求到达,则该中断处理程序完成后,该指令可能会被放弃并重新启动。这种行为也适用于装载双字(LDRD)和存储双字(STRD)指令。

这是否意味着我只要写一下就可以了?

static inline uint64_t read_volatile_uint64(volatile uint64_t *x) {
    uint64_t y; …
Run Code Online (Sandbox Code Playgroud)

arm atomic interrupt cortex-m3 stm32

5
推荐指数
1
解决办法
764
查看次数

STM32:在DMA模式下实现UART

我试图在DMA模式下实现UART,以便在每次按下按钮时发送一个简单的字符串.

所以我使用CubeMX生成代码,我已经在正常(非圆形)模式下配置了UART2 TX DMA,也没有FIFO和没有突发.

每当我在调试模式下运行代码时,我看到我第一次尝试发送字符串,它工作正常并发送字符串,但在DMA IRQ处理程序中,它调用TxHalfCpltCallback而不是TxCpltCallback,并且UART gState将保留在BUSY中模式,所以我不能用它来传输更多的字符串.

我的问题是为什么它调用TxHalfCpltCallback而不是TxCpltCallback?我应该如何处理它(因为HAL引用表示它等待发送缓冲区的后半部分!什么?)

而且,发送下一半数据是否会重新关联UART的gState?

我想请某人给我们一个在项目中配置UART的示例.

hal stm32 dma uart

5
推荐指数
3
解决办法
3万
查看次数

为什么STM32 gcc链接程序脚本会自动丢弃以下标准库中的所有输入节:libc.a,libm.a,libgcc.a?

从任何自动生成的STM32CubeMx生成的链接器脚本的底部:

/* Remove information from the standard libraries */
/DISCARD/ :
{
  libc.a ( * )
  libm.a ( * )
  libgcc.a ( * )
}
Run Code Online (Sandbox Code Playgroud)

从GNU Binutils ld(链接程序脚本)手册中,3.6.7输出节丢弃

特殊输出节名称“ / DISCARD /”可用于丢弃输入节。分配给名为“ / DISCARD /”的输出节的任何输入节均不包含在输出文件中。

这3个输入目标文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?

其他感兴趣的STM32链接器脚本主题:

  1. 在C中访问链接描述文件变量的“值”是否存在未定义的行为?
  2. 如何从C获取ld链接程序脚本中定义的变量的值

c linker stm32 ld binutils

5
推荐指数
1
解决办法
266
查看次数

Arm:objcopy 如何知道 elf 中的哪些部分包含在二进制或 ihex 中?

我正在开发一个项目,其中涉及解析arm elf 文件并从中提取部分。

显然,elf 文件中有很多部分没有加载到闪存中,但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中?

以arm elf文件的以下readelf为例:

节标题: [Nr] 名称 类型 地址 关闭大小 ES Flg Lk Inf Al

[0] 空 00000000 000000 000000 00 0 0 0

[1] .isr_vector PROGBITS 08020000 010000 0001f8 00 WA 0 0 4

[2].firmware_header_PROGBITS 080201f8 0101f8 000004 00 WA 0 0 4

[3] .text PROGBITS 08020200 010200 01e11c 00 AX 0 0 64

[4] .ARM.extab PROGBITS 0803e31c 033a68 000000 00 W 0 0 1

[5] .exidx ARM_EXIDX 0803e31c 02e31c 000008 00 AL 3 …

c embedded linker elf stm32

5
推荐指数
1
解决办法
1380
查看次数

STM32:使用带有字符匹配ISR和DMA缓冲区的USART

我正在使用带有 FreeRTOS 和 STM32CubeMX 的STM32L432设备。

我尝试通过基于 ASCII 协议的 USART 实现 M2M 通信。协议序列的长度可以不同,但​​具有最大长度和定义的结束字符 (' \r ' / 0x0D )。

因此,我考虑使用 DMA(如FIFO)收集所有 RX-USART 数据,并使用基于USART_ICR_CMCF标志的地址匹配 isr 来确定结束字符。

初始化USART1并启用地址匹配ISR

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) {
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1) {
    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

    /* USER CODE BEGIN USART1_MspInit 1 …
Run Code Online (Sandbox Code Playgroud)

fifo stm32 dma usart stm32cubemx

5
推荐指数
1
解决办法
3020
查看次数

在stm32上使用调试器swo

正如标题所示,我想使用 swo 在 stm32F1 设备上进行调试,而不使用 st-link utils。我想我已经刷新了代码以通过我的芯片上的 swo 发送消息,但我无法与正确的设备建立连接一些教程建议我将 putty 与 telnet 端口 2332 一起使用。关于我的配置的具体信息:cubemx swo 配置 我的 main 上的相关代码

    int _write(int file, char *ptr, int len)
{
    int DataIdx;
    for (DataIdx = 0; DataIdx < len; DataIdx++)
    {
        __io_putchar(*ptr++);
    }
    return len;
}
Run Code Online (Sandbox Code Playgroud)

...

   int main(){
    while (1)
      {
        printf("Hi\n");
      }
}
Run Code Online (Sandbox Code Playgroud)

我看过一些使用 eclipse 配置或 st-link utils 的教程,但我有一个非常自定义的工具链(我使用 conan、obko cmake 配置https://github.com/ObKo/stm32-cmake、 ocb 和 linux )用于唯一目的使用 c++ 2017 和 boost 这样的库,所以我不能使用 st-link utils。

c c++ stm32 jtag

5
推荐指数
1
解决办法
1827
查看次数

如何修复 STM32CubeProgrammer 找不到 STM32 目标

大家好,
这里有人以前遇到过这个问题吗?
在我将代码运行到 stm32f446re 中后,我无法在最后一个代码之后上传任何代码,并给出此错误“未找到 STM32 目标”

在此输入图像描述


我尝试执行以下选项:-
1- 更新我的 ST-Link 驱动程序并将其作为“dpinst_amd64”运行。
2-更新我的 ST-Link 固件,它是从 STM32CubeProgrammer 运行并更新的,如图所示。


但这些解决方案都不起作用。

embedded microcontroller arm stm32 stm32cubemx

5
推荐指数
3
解决办法
4万
查看次数

为什么STM32CubeIDE生成了2个链接描述文件?

我正在学习 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)

linker gcc build stm32 stm32cubeide

5
推荐指数
1
解决办法
4427
查看次数

STM32 Cube IDE - 在最初成功启动和使用后,现在在启动屏幕启动阶段保持空闲状态 (Linux)

我使用的是 Ubuntu 22.04 以及 STM32 Cube IDE(最新版本)的官方 Debian 安装程序,直接从 STM 网站下载。

安装完所有内容(默认安装,位于/opt/st/)后,我启动了 IDE 并开始使用它。我设法快速找到了为我的 STM32L-Discovery 板创建、构建和启动一个简单的闪烁测试程序(闪烁两个 LED)的方法(尽管我对板和 ARM 的总体技能都很差)。

现在的问题是第二天我无法再启动 IDE。从那以后一直都是这样。一旦启动(无论是从菜单中安装创建的启动器(我有 XFCE)还是通过终端),IDE 在初始屏幕中的进度条填满后保持空闲状态:

STM32 Cube IDE - 在启动屏幕上冻结

奇怪的是,htop我没有看到任何活动:

[htop - STM32 Cube IDE 没有活动

永远都是这样。好吧,永远在这里意味着 20-30 分钟,直到我的耐心耗尽。:D

我看到启动器启动了Wayland版本。我尝试了另一个以防万一,尽管从安装开始后第一次开始这应该不是问题(即使使用我的旧笔记本电脑)。

有人知道解决办法吗?我可以尝试重新安装并删除我的工作区,尽管 IDE 目前似乎并不支持后者。

linux ubuntu stm32 stm32cubeide

5
推荐指数
1
解决办法
4527
查看次数