标签: stm32

在STM32闪存中运行多个应用程序

我想在我的STM32闪存中有两个应用程序,一个基本上是启动,另一个是'主'应用程序.我已经想出如何将它们中的每一个加载到闪存的不同区域,并且在获取内存转储后,所有内容看起来都在正确的位置.

因此,当我进行重置时,它会加载引导,此时所有引导都会跳转到应用程序.调试启动,这一切似乎都正常工作.但是,在我跳转到应用程序之后问题到了,它只执行一条指令(汇编),然后跳回到启动.它应该无限期地留在应用程序中.

我的问题是,我应该在应用程序中"跳转"到哪里?

似乎有一些潜在的点,例如中断向量,重置处理程序,应用程序的主要功能.其实我已经尝试了所有这些没有成功的人.

希望这是有道理的,如果没有,我会更新问题.

谢谢你的帮助!理查德

更新:

  • 我在调试器中玩了一个游戏并手动将程序计数器更改为应用程序的主要部分,这很有效,所以它让我觉得我的跳转有问题,为什么程序计数器不能继续运行跳后?
  • 实际上它似乎是PSR,'T'在跳转时被重置,如果我在跳转之后再次设置它继续使用app我想要的
  • 好的找到了一个解决方案,似乎你需要在执行分支时将PC LSB设置为1或者它处于'ARM'模式(32位指令而不是像'拇指'模式中的16位指令.相当一个模糊的小问题,谢谢你让我和你分享!

embedded stm32

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

当elf文件包含调试信息时,Eclipse会抱怨"没有加载符号表"

我正在研究STM32处理器.使用readelf -w,可以从我的elf文件中提取大量的调试信息.输出的一小部分如下所示:

 <1><3faf>: Abbrev Number: 30 (DW_TAG_variable)
    <3fb0>   DW_AT_name        : (indirect string, offset: 0x24e): ITM_RxBuffer 
    <3fb4>   DW_AT_decl_file   : 19 
    <3fb5>   DW_AT_decl_line   : 1742   
    <3fb7>   DW_AT_type        : <0x3f48>   
    <3fbb>   DW_AT_external    : 1  
    <3fbc>   DW_AT_declaration : 1
Run Code Online (Sandbox Code Playgroud)

dwarfdump还确认调试信息在elf文件中可用.

我使用以下软件包:Eclipse Juno arm-2011.03/bin/arm-none-eabi-gdb OpenOCD和JTAG密钥

生成elf文件后,将其刻录到STM32处理器中,然后在Eclipse中启动调试会话.JTAG可以启动和停止,所以我猜OpenOCD deamon很好.由于"未加载符号表"这一事实,无法设置断点.一两件事我注意到的是其中"可变/ breakponts /注册/模块"窗口,显示加载的elf文件的模块选项卡包含followiing细节:类型:可执行符号:未加载符号文件:BuildResult.elf

在调试配置 - >启动选项卡中,选中/取消选中"加载图像/加载符号"没有区别.我想知道eclipse如何将elf文件包含符号信息加载到调试过程中?

任何建议,提示,非常感谢.

eclipse gdb stm32 symbol-table

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

如何使用STM32 MCU生成REAL随机数?

我正在使用keil microvision IDE中的STM32F103E arm cortex-m3 MCU开展一个项目.
我需要为某些目的生成随机数,但我不想使用标准c ++库生成的伪随机数,所以我需要一种使用硬件功能生成REAL随机数的方法,但我不知道如何我能做到.
任何的想法?(我是一名软件工程师而非电子专业人员,所以请说明一下:P)

c++ random embedded microcontroller stm32

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

格式化打印到循环缓冲区

我正在为STM32F3 mc(STM32F3-Discovery)编写嵌入式代码.我需要输出一些数据,UART和我的使用DMA此,因为这可以让我专注于传感器读取和数据处理,而不是等待字节传输完成.然而问题是我必须结合:

  1. 格式化输出(即来自printf的一些)
  2. 连续多次打印(在上一次打印完成之前发生)

所以我在想循环缓冲区.但我不认为我知道如何使sprintf尊重缓冲区的结束并继续写入缓冲区的开头.我当然可以创建另一个临时缓冲区,在那里打印,并逐字节复制,但它对我来说并不优雅.

c printf stm32 circular-buffer

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

STM32 USB OTG:如何正确刷新Tx FIFO?

F4xx系列芯片的STM32手册表示应用程序将TXFFLSH寄存器中的位写入OTG_FS_GRSTCTL以刷新TxFIFO.作为注释,它提到......应用程序必须在检查核心既不写入TxFIFO也不读取TxFIFO之后写入该位.作为一种方法,它建议确保NAK有效中断被设置(我认为这意味着寄存器中的GINAKEFFOTG_FS_GINTSTS)以确保内核不读取FIFO,并检查AHBIDL(AHB空闲)位OTG_FS_GRSTCTL被设置为保证FIFO中没有任何内容.STM提供的(糟糕的)USB OTG库忽略了这两种检查,而免费libopencm3库只检查AHB空闲位.我的问题如下:

  1. 在执行上述检查和写入TXFFLSH位之前,本手册未建议禁用USB OTG内核.这是否可以让核心可能在执行检查和写入TXFFLSH?之间开始使用FIFO .

  2. "NAK有效"位仅保证不会从非周期性端点的TxFIFO读取数据.除非核心被禁用,否则核心是否仍然可以将FIFO用于等时端点?

我知道这些都是"挑剔"类型的问题,但我正在研究的项目应该会产生一个非常可靠的硬件,客户多年来无法检查设备,因此这些微妙之处很重要(是的,我们启用了看门狗)等等,但我们需要核心在大多数时间没有重置的情况下工作.

usb arm stm32 usb-otg libopencm3

5
推荐指数
0
解决办法
1886
查看次数

为I2C配置STM32输出端口

我目前正在尝试使用一对stm32l152(发现工具包)通过I2C进行通信.(我没有使用STM提供的标准外设库,因为我想尝试自己实现i2c ..)

我的配置如下:

  • 7位寻址模式(无双地址,仅OAR1)

  • 100khz的速度

  • 启用ACK(在从站上)

  • ACK被禁用(在主设备上,因为在任何时候主设备/从设备之间只传输1个字节)

  • 在主/从上,使用GPIOB(PB10)作为SCL,GPIOB(PB11)作为SDA

这是奇怪的部分:当我将2个GPIOB引脚配置为推挽式(无上拉/下拉)时,我能够看到我的主机在示波器上发送起始位,地址字节..

但我的奴隶并没有发回确认.我肯定知道这一点,因为主机没有在SR1中断言ADDR位,我看到示波器上没有确认,并且从机没有进入中断(我在从机上启用了I2C事件中断).

仔细观察示波器上的波形,我意识到信号(SCL,SDA)没有完全达到0Volts的逻辑低电平,而是处于1伏特.我猜这可能是为什么奴隶无法从主机读取地址字节,因此没有发回ack.

所以我将2个GPIO引脚配置为漏极开路(无上拉/下拉)..但现在我的主机无法发出起始位..我单步执行代码,看到SR1中主机的SB位置1时设置START位..但我没有看到示波器上的SDA和SCL信号有任何响应(两者都高达3V).

(我在每条线上使用10kohms将SCL和SDA拉到3v).

stm32 i2c stm32l152

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

STM32 STM32CubeF4 USB CDC操作

我为STM32CubeF4构建了用于USB CDC示例的代码.我在usbd_cdc_if.c中添加了缺少的CDC_Receive_FS()接收代码.我将它加载到我的STM32F4 Discovery中,它可以工作.在Tera Term上键入的字符将返回并显示在Tera Term上.

我希望有人能够给我一些关于USB CDC固件如何工作的知识,具体来说,这是由USB -D和+ D引脚电压电平转换时产生的中断驱动的,或者是否有一个在某处启动的无限while循环,它只是轮询等待一些数据出现?提示我的问题的是,我看到可以通过在main.c中的无限循环内切换GPIO引脚的状态来使该板上的LED闪烁.但是,在main.c中,这个while循环中没有任何东西用于USB.那么这个USB CDC固件如何从/向Tera Term获取和发送角色.

c embedded usb cdc stm32

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

即使没有使用STM32 gcc(arm-none-eabi-gcc)也链接printf

我似乎无法弄清楚为什么有些printf库函数会从libc_nano.a链接到我的代码中,即使我从不使用任何函数printf.它窃取了至少2K宝贵的闪存空间.我能看到的部分_printf_i,_vfprintf_r,_vfiprintf_r在我的链接器映射文件等.

我试过了

  • Wl, - exclude-libs选项
  • 链接描述文件中的EXCLUDE_FILE(..)

这些都不会使符号从地图文件中消失.

我的gcc选项:

CFLAGS = -Og -Wall -g3 -Wdouble-promotion -mcpu=cortex-m0 -mthumb -fmessage-length=0 -ffunction-sections -mfloat-abi=soft -DUSE_HAL_DRIVER

LFLAGS = -mcpu=cortex-m0 -mthumb -mfloat-abi=soft -specs=nosys.specs -specs=nano.specs -Wl,--gc-sections 
Run Code Online (Sandbox Code Playgroud)

arm-none-eabi-gcc.exe(适用于ARM嵌入式处理器的GNU工具)5.2.1 20151202(re lease)[ARM/embedded-5-branch revision 231848] Copyright(C)2015 Free Software Foundation,Inc.这是免费的软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.

首先,他们为什么要联系起来?有没有办法排除它们?

linker printf gcc arm stm32

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

STM32F3发现 - 实现GPIO中断

我想实现一个GPIO中断,但我不知道如何,我也没有找到真正的样本或解释.

我已经知道如何写Pins,但不多,请考虑我真的没有任何关于c或编程微控制器的知识.

一个简单的例子或解释将帮助我很多.以下代码是我已经拥有的,但我不确定这是否正确.

GPIO_InitTypeDef   GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_2;
GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;

HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)

c microcontroller arm interrupt stm32

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

为什么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
查看次数