问题标签 [stm32f3]
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.
c - 设置引脚后触发外部中断
我试图让外部中断在 Nucleo-F030R8上运行 并撞墙。
一切都已配置并在步进模式下运行良好,但是当我使用简单的跳线将我的板连接到另一个测试板并运行相同的代码时,即使该测试板(第二个 Nucleo-F302R8,它应该只产生一个我想用第一个测量的信号峰值)没有打开。
我正在混合使用来自 STM 的 HAL 库和我自己的一些代码。
有人最终遇到了类似的问题吗?我正在使用 STM32 的系统工作台。
ISR的一部分,中断处理程序被切掉
在将引脚设置为低电平和变化上升之间,中断触发。
更新:
会不会是通过重置引脚BSRR
或BRR
产生中断?我正在逐步检查我的代码,每次重置引脚时都会生成中断。
usb - 当端点和 PMA 地址都更改时,CubeMX 生成的 USB HID 设备发送错误数据
我正在调试我正在创建的复合设备的问题,并在新生成的仅 HID 代码中重新创建了该问题,以使其更容易解决。
我添加了少量代码,main()
以便在按下蓝色按钮时发送 USB HID 鼠标点击和 LED 闪烁。
我正在使用 Wireshark 和 usbmon(在 Ubuntu 16.04 上)查看我的 STM32F3DISCOVERY 板发送的数据包。
使用这个新生成的代码,我可以看到URB_INTERRUPT
从 3.23.1 发送的数据包。(只有该地址的最后一部分,即端点,是相关的。)
包内容为:
正如预期的那样。
(5 字节click_report
的 s 被分成 4 字节和 1 字节的消息,因为 HID 的最大数据包大小为 4 字节。)
然后我从更改为HID_EPIN_ADDR
,以使设备将端点 3 用于 HID 消息,而不是端点 1。usdb_hid.h
0x81
0x83
有了这个变化,一切都继续工作,预期的变化是从 xx3 发送数据包。数据包仍然包含:
据我所知,这应该不起作用,因为我还没有为0x83
PMA(数据包内存区域)中的端点 3 ( ) 分配地址。
我通过编辑 usb_conf.c 来做到这一点:
现在,当我发送相同内容时01 00 00 00 00
,00 00 00 00 00
click_reports
我看到以下数据包内容:
我已经将非 PMA 缓冲区的内容一直追踪到USB_WritePMA
in stm32f3xx_ll_usb
。
发送代码(in stm32f3xx_ll_usb
)是:
为什么在线上的数据不是我提供的数据USB_WritePMA
,一旦我添加HAL_PCDEx_PMAConfig(...
了端点地址0x83
?
更新:
如果我更改usb_conf.c
为让端点地址0x83
使用通常由以下人员使用的 PMA 地址0x81
:
线路上的数据包仍然损坏:
如果我返回usb_conf.c
到其初始的生成状态(其中0x83
没有 PMA 地址,并且0x81
使用0x100
):
输出按预期工作:
更新 2:
USB_ActivateEndpoint()
我在in 中添加了一个断点stm32f3xx_ll_usb.c
。
令人惊讶的是,这只在端点 0 上调用过。
因此,ep->pmaadress
(原文如此)永远不会“写入硬件”,而仅用于更高级别的代码。
这必须意味着pmaadress
端点的值设置为某个默认值,而我不知道端点的默认值0x83
,因此无法设置。
周五回来上班时,我会添加调试以读出默认值。如果它们不存在,我会很困惑。
更新 3:
我添加了以下调试:
这向我展示了以下值(在调试器中):
出乎意料的是,这些看起来是正确的。
0x100
是端点 3 的 txaddr,尽管USB_ActivateEndpoint()
它只是第一次被调用。
经过大量的grep,我发现PCD_SET_EP_TX_ADDRESS
(in stm32f3xx_hal_pcd.h
)不仅直接用于in USB_ActivateEndpoint()
,而且还用于PCD_SET_EP_DBUF0_ADDR
`stm32f3xx_hal_pcd.h的宏中。
PCD_SET_EP_DBUF0_ADDR
似乎没有使用,所以我不知道 usbd_conf.c 中的(更改的)值如何:
进入内存映射的 USB 寄存器。
0x00
我可以从in (端点 3)的存在推断rxaddr[3]
它们成对发生(因为没有调用HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x3 , PCD_SNG_BUF, 0x0);
)。
更新 4:
再次将设备更改为使用端点 1 后,0x100
txaddrs[3] 中的值保持不变。上次运行时它就在那里,消除了一些混乱。
更新 5:
这是一个BTABLE问题。BTABLE 寄存器的值为 0x00,将 btable 置于 PMA 的开头。
我发现:
这表明端点0x81
和0x82
工作,因为两者pma[4]
和pma[8]
都设置为0x100
。
端点0x83
不起作用,因为pma[12]
设置为0x0
。
这与具有该值的损坏数据一致58 00 2c 00
- USB 硬件正在读取pma[12]
并因此发送来自 的 uint16_t ,由于小端序pma[0]
,它们被0x0058 0x002c
反向发送。(注意:PMA 只有 16 位宽,所以这里每个地址只有两个字节。)
调用HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82, PCD_SNG_BUF, 0x100);
不会在处设置 btable 指针pma[12]
,它只是记录要复制到的 PMA 地址。
现在我只需要找到 btable 的内容被写入的位置......
usb - 在 CubeMX 生成的项目中,PCD_EP_TX_ADDRESS 是在哪里定义的?
我需要使用PCD_GET_EP_TX_ADDRESS
来自stm32f3xx_hal_pcd.h
.
它定义为:
但使用它会导致PCD_EP_TX_ADDRESS
未定义的编译错误。
我已经对整个项目和PCD_EP_TX_ADDRESS
结果字符串进行了grep:
许多目标文件中存在该字符串,表明它是在某个位置定义的。
在哪里PCD_EP_TX_ADDRESS
定义?
rust - 为什么我们在使用 STM32F30x 的嵌入式 RUST 中使用 FLASH.constrain() 和 RCC.constrain()?
我是 Rust 的新手。目前我正在使用 STM32F303 Discovery 板进行嵌入式 rust。我在访问寄存器时遇到了很多问题,不知道如何访问 RCC、FLASH、TIMER 等以完成任务。谁能帮帮我。您可以查看我卡住的代码。
microcontroller - stm32f303k8比较器寄存器地址?
我对 uC 编程相当陌生,并且试图为 stm32f303k8 找到比较器外设的基址寄存器地址时碰壁了。我在参考手册、数据表或编程手册以及各种搜索中的许多其他点击中都找不到信息。我已经看到,如果为比较器启用了时钟,它将在 AHB 时钟上运行,但单独的图表显示 AHB 馈入 APB1 和 APB2,并且比较器专门放置在 APB2 下方。我很困惑,并欢迎任何帮助(没有使用库!),甚至是一个搜索字符串指向正确的方向。
api - 如何将 stm32f3discovery API 传递给函数?
我正在尝试创建一个单独的文件/模块,该文件/模块具有可以处理 stm32f3discovery 的 LED 或陀螺仪的功能。我正在尝试将保存所有寄存器的 stm32f3 API 传递到一个函数中,然后在其中使用。
当我运行此代码时,我收到一条错误消息,提示“类型 '##' 上没有字段 '###'”。我怎样才能做到这一点?
main.rs
my_api.rs
错误
对于对任何寄存器的所有调用,它都有这个错误
embedded - l3gd20 陀螺仪在 stm32f3discovery 上发回重复字节
我正在研究 stm32f3discovery 并试图从板上的 l3gd20 陀螺仪读取数据。当我尝试从 OUT_X_L 到 OUT_Z_H 连续读取 6 个字节(这是用于从陀螺仪读取读数的所有数据)时,发送的前三个字节与发送的最后三个字节相同。
当我尝试单独读取每个寄存器时,所有字节都相同,我在示波器上检查过,寄存器在 MOSI 线上发生变化,但响应是 6 个重复字节。
WHO_AM_I 和 OUT_TEMP 寄存器都工作得很好,所以我知道实际的 SPI 不是问题。
这是任何适当的代码,任何帮助或正确方向的指示将不胜感激,谢谢。
Main.rs
my_api.rs
传感器
这是使用 sensor.rs -> read_data() -> spi.read_multiple_register(&spi1, OUT_X_L, &mut data); 时的结果。 从板返回数据,重复 3 个字节
然后这就是当我使用注释掉的位而不是 在所有字节都相同时返回数据时得到的
stm32 - 我可以使用具有 1 级闪存读出保护的 STM32F303RDTx 的 ROM 引导加载程序吗?
ST 在 STM32F303RDTx 中提供了一个 ROM 引导加载程序。我可以从我的应用程序跳转到引导加载程序,并在读取保护 (RDP) 被禁用(0 级)时更新闪存。当 RDP 设置为 1 级时,所有禁用 RDP(这会大量擦除闪存)的尝试都会失败。到目前为止,我所做的一切似乎都会触发设备重置,让我重新回到我的应用程序中。
ST 的文档(AN2606 和 AN3155)指出这应该是可能的,但我没有尝试过任何工作。我试过 ST 的 GUI demo flasher。我还尝试通过 ST 的命令行客户端批量擦除设备并禁用读出保护。
我能想到的唯一一件事是我正在跳入引导加载程序,而不是使用引导引脚来启动引导加载程序。然而,即使这似乎是 ST 考虑的问题,因为他们声明他们会定期刷新看门狗 (IWD),以防它已通过调用代码启用。
尝试禁用读出保护:
尝试批量擦除:
当未启用读出保护时,上述命令执行时不会出错。
尝试禁用读出保护(当它已经被禁用时):
正如评论中所建议的,我尝试了 STMCubeProgrammer,详细程度设置为 3(最大)。这是我得到的错误:
我也在 ST 的社区网站上发布了这个。
arm - STM32:简单的 SPI 传输
我正在使用 STM32F3DISCOVERY 板,并且试图更深入地研究 HAL 的抽象。我制作了一个通过 SPI 传输数据的函数的简单版本,遗憾的是它不起作用(至少我将其发送到的 DAC 不会改变状态)而且我不确定我在那里缺少什么。也许初始化代码中的某些内容不适用于我的简单版本。我很乐意提供任何可以查看的指导或参考资料。谢谢!
c - GDB 不会在断点处停止并继续
我是嵌入式编程的初学者,所以要学习我正在尝试使用极简程序。我尝试执行以下程序。
我的环境:
- arm-none-eabi-gcc (15:9-2019-q4-0ubuntu1) 9.2.1 20191025(发布)[ARM/arm-9-branch 修订版 277599]
- gdb-multiarch GNU gdb (Ubuntu 9.1-0ubuntu1) 9.1
- 打开片上调试器 0.10.0
- STM32F3Discovery - ARM Cortex-M4
main.c
stm32.ld
一切都是使用以下命令编译的:arm-none-eabi-gcc -mthumb -march=armv7e-m -mcpu=cortex-m4 -nostdlib -Tstm32.ld -g -o main.elf main.c
.
这个程序什么都不做,只是尝试让它运行并在内存中写入一些东西。
使用 OpenOCD 和 GDB,我将程序加载到板上,这就是我layout asm
在 GDB 中得到的。
我的程序好像是在FLASH内存的开头加载的,我在Reset_Handler上启动,但是不能一步步运行,我什至不确定程序是否在运行。如果我添加断点或使用step
我得到:
我已阅读以下问题/答案,但没有帮助。我猜我的程序的链接是无效的,或者我可能不做任何事情而不初始化一些东西。
注意:我可以在板上运行一个非常简单的汇编程序并对其进行调试,但是嵌入式 C 和链接部分是相当新的。