问题标签 [stm32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
embedded - 在 STM32 闪存中运行多个应用程序
我想在我的 STM32 闪存中有两个应用程序,一个基本上是引导,另一个是“主”应用程序。我已经想出了如何将它们中的每一个加载到闪存的不同区域,并且在进行内存转储之后,一切看起来都在正确的位置。
因此,当我进行重置时,它会加载引导,此时引导所做的只是跳转到应用程序。调试启动,这一切似乎工作正常。但是,在我跳转到应用程序之后问题就来了,它只执行一条指令(汇编),然后跳回引导。它应该无限期地留在应用程序中。
那么我的问题是,我应该在应用程序中“跳转”到哪里?
似乎有一些潜在的地方,例如中断向量、重置处理程序、应用程序的主要功能。实际上,我已经尝试了所有这些都没有成功。
希望这是有道理的,如果没有,我会更新问题。
感谢您的帮助!理查德
更新:
- 我在调试器中玩了一下,并手动将程序计数器更改为应用程序的主程序,这很有魅力,所以它让我觉得我的跳转有问题,为什么程序计数器没有继续运行跳跃后?
- 实际上它似乎是 PSR,“T”在跳转时被重置,如果我在跳转后再次设置它,它会按照我的意愿继续使用应用程序
- 好的找到了一个解决方案,似乎您需要在执行分支时将 PC LSB 设置为 1,否则它会进入“ARM”模式(32 位指令而不是像“拇指”模式中的 16 位指令。相当晦涩的小问题,谢谢分享给大家!
gcc - Ubuntu:交叉编译 STM32 (Cortex-M3) 时使用什么 gcc?
我正在尝试开始使用 STM32 (Cortex-M3),我的计划是从 Ubuntu (9.04 / AMD64) 开始工作。
首先,我得到了Olimex stm32-h103头板和Olimex ARM-USB-OCD jtag,然后我可能会使用 OpenOCD、gcc 和 Eclipse。
但现在我正在研究使用什么版本的 gcc 以及如何设置它以便能够交叉编译代码。
那里似乎有一些手臂项目,但我不知道从什么开始,有人可以把我推向正确的方向吗?
谢谢约翰
更新: codesourcery似乎几乎是我想要的,但他们似乎专注于 IA32 而不是 AMD64。
但是在支持的设备中,我找到了 Cortex-M3
- ARM EABI、ARM M-profile 模拟器 -mcpu=cortex-m3 -mthumb
更新:有可能在 AMD64 上安装 IA32,所以标记的答案可能已经过时了。
更新:找到这个关于 Cortex-M3 交叉编译的链接。
c - STM32 I2C1 SR1 寄存器上未设置起始位
我正在尝试对 stm32 进行编程以与我的 i2c EEprom 对话,但似乎每次我说:
我使用了调试器,发现没有设置 SR1 位 0 标志(这是生成的起始位标志),这就是代码挂起的原因。我可以在示波器中看到生成了起始位,这有时会起作用。当我尝试连续进行多次写入时,它通常会中断。我检查了硬件一切看起来都很好我检查了我在 i2c 总线上运行的频率,它在 24lc1025 eeprom 内是 100Khz。
有任何想法吗,
谢谢
c - 如何在 Cortex-M3 (STM32) 上从 RAM 执行功能?
我正在尝试从 Cortex-M3 处理器(STM32)上的 RAM 执行功能。该功能擦除并重写内部闪存,所以我肯定需要在 RAM 中,但我该怎么做呢?
我尝试过的是:使用 memcpy 将函数复制到 RAM 中的字节数组(检查它是否正确对齐),将函数指针设置为指向字节数组,然后调用函数(指针)。
这可能适用于 10 条指令(我可以使用调试器跟踪执行),但随后出现总线错误并且处理器重置。总线错误发生在第二次通过循环时,因此代码应该没问题(因为它在第一次通过时工作)。我认为更快的 RAM 访问会以某种方式破坏总线时序......
无论如何,有没有正确的方法来做到这一点?分散文件看起来如何自动将函数放置在 RAM 中(我正在使用 Keil uVision for Cortex-M3)?
编辑:更多信息:工具链:RealView MDK-ARM V 4.10 编译器:Armcc v4.0.0.728 汇编器:Armasm v4.0.0.728 链接器:ArmLink v4.0.0.728 处理器:STM32F103ZE
当复位发生时,总线故障寄存器中的 IMPRECISERR 位被设置。
embedded - Cortex-M3 STM32F103 内核在闪存页擦除期间是否会因为 FPEC 繁忙且无法从闪存中获取更多指令而停止?
在 STM32F103 上,闪存页面的擦除需要 20 毫秒,在此期间内核停止。从 ST PM00042 Flash 编程手册中并不清楚内核在擦除闪存页时是否总是会停止,或者它是否只是因为指令流本身在闪存中(在我的项目中)而停止,而 FPEC(闪存接口)是忙,无法获取更多指令。
问这个问题的另一种方法是“从 RAM 运行我的闪存编程代码会避免闪存页面擦除停滞吗?”。
谢谢,
c - STM32 printf 和 RTC
* 更新 *
这是我发现的。每当我在那里拥有该功能时,它实际上不会使代码锁定。它实际上会使读取 RTC I²C 函数的执行速度非常慢,但代码仍然可以正常运行,但是每次读取 RTC 时我都必须等待很长时间才能通过。
因此,RTC 有一个警报中断,这触发了 ISR 内的其他 I²C 交互,因此看起来它试图同时进行两个 I²C 通信,因此减慢了进程。我删除了 ISR 中的功能,它现在可以工作了。我会继续调查。
我在使用 IAR 5.40 对 STM32F103 微控制器进行编程时遇到了这个问题。我有这个函数,如果我尝试 printf 一个局部变量,它会导致代码在另一个点冻结,甚至在它到达有问题的函数之前。
这可能是什么原因造成的?
这是功能:
我也试过这个,这不会导致我遇到锁:
没有启用任何优化,当尝试从我的 I²C RTC 中读取一个字节时,代码会卡住,但只要我删除它printf("index = %s\n", bTmpSms);
或使用它printf("index = 2\n");
,一切都会很开心。有任何想法吗?
bSmsIndex 实际上永远不会超过 30,即使这样,在调用此函数之前也会发生锁定。
arm - 基于 ARM Cortex M3 的 MCU 的示例代码?
更具体地说是STM32F107。
我在 ST 的网站上几乎找不到任何代码,甚至找不到可下载的库(尽管我发现提到了一些表明它们应该存在的内容?)。这让我有点害怕,因为当有其他替代品时,我不想选择难以使用的处理器。(不过,此特定处理器满足所有其他要求,因此请不要将此解释为替代问题)
所以基本上我希望这里有人能指出我正确的方向。
我计划使用 Raisonance 工具集,它是免费的,但似乎仅限于 C。不过,C 和 C++(甚至纯汇编)示例都很棒。USB 示例特别令人感兴趣。
c - IAR 上的 C 编程
我正在 IAR 平台上进行编码,并希望执行以下操作。我有一个typedef
如下
在这些之后,我声明了以下变量:
但它出现了一个错误:
我该如何解决这个问题?
gdb - 如何使用 openOCD 和 gdb 对 STM32 闪存进行编程
我正在使用带有 openOCD 和 GDB 的 Olimex ARM-USB-OCD 加密狗来编程和调试 stm32f103 micro。我使用的 IDE 来自 Olimex dev-kit CD,并使用了 eclipse ganymede。
我可以将一个小程序加载到 RAM 中并单步执行代码而不会出现任何问题。
我现在有一个更大的程序,它不适合 RAM(只有 20K),所以我想从闪存(128K)运行它。
我修改了链接描述文件,指示程序代码应该进入闪存部分(地址 0x8000000),但 gdb 无法加载程序。
我应该怎么做才能让 gdb 将程序加载到闪存中?
embedded - 从 USB Virtual Com Port 设备检测打开的 PC COM 端口
我正在使用带有 STM32_USB-FS-Device_Lib_V3.2.1 USB 库的 STM32F105 微控制器,并为我们的目的调整了 VCP 示例(与 RTOS 和串行 API 集成)。
问题是,如果连接了 USB 电缆,但 Windows 主机上的端口未打开,几分钟后设备最终会永久重新进入 USB ISR,直到端口打开,然后一切都开始正常工作。
我已经检测了中断处理程序,可以看到当故障发生时,ISR 处理程序退出,然后立即重新进入。这是因为从中断退出时,OTG_FS_GINTSTS 中的 IEPINT 标志不明确。此时的 OTG_FS_DAINT 包含 0x00000002(IEPINT1 设置),而 DIEPINT1 包含 0x00000080(TXFE)。调用 OTGD_FS_Handle_InEP_ISR() 中清除 TXFE 的行,但该位要么不清除,要么立即重新置位。当主机上的 COM 口重新打开时,中断结束时 OTG_FS_GINTSTS 和 OTG_FS_DAINT 的状态始终为零,进一步的中断以正常速率发生。请注意,仅当正在输出数据但主机没有打开端口时才会出现此问题。如果端口打开或没有数据输出,系统将无限期运行。
VCP 代码有一个状态变量,它采用以下枚举值:
我们使用 CONFIGURED 状态来决定是否将数据放入驱动缓冲区进行发送。然而,当连接电缆时设置 CONFIGURED 状态,而不是在主机打开端口并连接应用程序时设置。我看到当 Windows 确实打开端口时,会出现一连串中断,因此似乎在此事件上发生了一些通信;我想知道是否有可能因此检测主机是否打开了端口。
我可能需要两件事之一:
- 防止 USB 代码一开始就卡在 ISR 中
- 从设备端判断主机是否打开了端口,打开时才推送数据发送。