我创建了两个静态库,用于我正在使用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) 我有一个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) 我试图在DMA模式下实现UART,以便在每次按下按钮时发送一个简单的字符串.
所以我使用CubeMX生成代码,我已经在正常(非圆形)模式下配置了UART2 TX DMA,也没有FIFO和没有突发.
每当我在调试模式下运行代码时,我看到我第一次尝试发送字符串,它工作正常并发送字符串,但在DMA IRQ处理程序中,它调用TxHalfCpltCallback而不是TxCpltCallback,并且UART gState将保留在BUSY中模式,所以我不能用它来传输更多的字符串.
我的问题是为什么它调用TxHalfCpltCallback而不是TxCpltCallback?我应该如何处理它(因为HAL引用表示它等待发送缓冲区的后半部分!什么?)
而且,发送下一半数据是否会重新关联UART的gState?
我想请某人给我们一个在项目中配置UART的示例.
从任何自动生成的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个输入目标文件包含什么,为什么我们丢弃它们中的所有内容(所有输入部分)?
我正在开发一个项目,其中涉及解析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 …
我正在使用带有 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) 正如标题所示,我想使用 swo 在 stm32F1 设备上进行调试,而不使用 st-link utils。我想我已经刷新了代码以通过我的芯片上的 swo 发送消息,但我无法与正确的设备建立连接一些教程建议我将 putty 与 telnet 端口 2332 一起使用。关于我的配置的具体信息:
我的 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。
大家好,
这里有人以前遇到过这个问题吗?
在我将代码运行到 stm32f446re 中后,我无法在最后一个代码之后上传任何代码,并给出此错误“未找到 STM32 目标”
我尝试执行以下选项:-
1- 更新我的 ST-Link 驱动程序并将其作为“dpinst_amd64”运行。
2-更新我的 ST-Link 固件,它是从 STM32CubeProgrammer 运行并更新的,如图所示。
但这些解决方案都不起作用。
我正在学习 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) 我使用的是 Ubuntu 22.04 以及 STM32 Cube IDE(最新版本)的官方 Debian 安装程序,直接从 STM 网站下载。
安装完所有内容(默认安装,位于/opt/st/)后,我启动了 IDE 并开始使用它。我设法快速找到了为我的 STM32L-Discovery 板创建、构建和启动一个简单的闪烁测试程序(闪烁两个 LED)的方法(尽管我对板和 ARM 的总体技能都很差)。
现在的问题是第二天我无法再启动 IDE。从那以后一直都是这样。一旦启动(无论是从菜单中安装创建的启动器(我有 XFCE)还是通过终端),IDE 在初始屏幕中的进度条填满后保持空闲状态:
奇怪的是,htop我没有看到任何活动:
[
永远都是这样。好吧,永远在这里意味着 20-30 分钟,直到我的耐心耗尽。:D
我看到启动器启动了Wayland版本。我尝试了另一个以防万一,尽管从安装开始后第一次开始这应该不是问题(即使使用我的旧笔记本电脑)。
有人知道解决办法吗?我可以尝试重新安装并删除我的工作区,尽管 IDE 目前似乎并不支持后者。