问题标签 [cubemx]
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 - FR_DISK_ERROR 总是由 f_open 返回
我的团队一直在研究一个包含基于标准库的 SD 卡的项目。最近我们决定迁移到 HAL 并开始了。
幸运的是,我们项目的所有部分都尽可能地更改为 HAL,它们运行良好,但我们不知道为什么 SD 卡不能正常运行。
我们没有更改外设的配置时钟,但我们必须将“SDMMC 控制器的时钟频率”在 HAL 中更改为 1.5MHz,而在 STDLibrary 中为 24MHz。因为,根本没用。
此外,我们的客户使用的 SD 卡类型范围很广,它们都还可以,但不是很好。我的意思FR_DISK_ERR
是,在工作期间返回很多,但我们的设备试图获取FR_OK
.
不幸的是,我们总是收到FR_DISK_ERR
一些 SD 卡,而它在我们的 STDLibrary 版本中一直有效。
此外,我们发现如果“f_mount”函数被调用一次,然后你取出 SD 卡并重新放入,它永远不会工作,直到你重置你的微控制器。
我的微控制器是STM32F427VI和SDIO配置如下:
它适用于 4 位宽的总线。
此外,我的设备时钟为 96MHz,“APB2 外设时钟”为 48MHz。
编辑:
至于重新插入卡 - 当 f_openFR_DISK_ERR
返回时,我通过调用 f_mount 再次进行了初始化。我一直这样做,直到给予,但在这种情况下FR_OK
它从未返回。FR_OK
正如亲爱的 Jacek Ślimok 所说,我意识到 f_mount 第二次没有初始化 SDIO。
因为有一个标志不允许再次调用“SD_initialize”(SD_initialize 函数包括 BSP_SD_Init)。
这是diskio.c的代码:
现在我在调用 f_mount 之前使用过,它现在可以正常工作了SD_PowerON
。SD_InitCard
这是一个错误,不是吗?
但其他问题仍然存在。它根本不适用于 24MHz 时钟,并且FR_DISK_ERR
仍然由一些 SD 卡返回。
编辑(2020/02/24):
最后,当我将我的 HAL 库更新到 STM32Cube_FW_F4_V1.24.2 时,它起作用了。但是 HAL 仍然不如标准外设好用。例如,我还不能将“ClockDiv”设置为“0”(24MHz)。它根本不起作用。现在我将“ClockDiv”设置为“1”(16MHz),这对我的项目来说还不够好,但我必须这样做。或者,如果您将 SDCard 拿走并在程序运行时再次插入,您将无法使用 f_mount 初始化 FATFS。它根本行不通。您必须自己重新初始化 SDIO Peripheral。不幸的是,现在我没有时间详细了解我的日程安排。也许在未来。
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 的内容被写入的位置......
embedded - STM32F302 PWM 输入 CubeMX 设置
我正在尝试在 STM32F302R8 上设置 PWM 输入来计算频率和占空比。在 STM32F302x8 参考手册中,它说我们需要映射IC1
到TI1
( CC1S
= 01) 并映射IC2
到TI1
.
为了匹配 STM32F302x8 参考手册的建议,我需要IC Selection
为Direct
通道 1 和Indirect
通道 2 设置。我对设置进行了硬编码,并且 PWM 输入正常工作。
我想在 CubeMX 中进行设置,但它只允许IC Selection
= Direct
。由于 IC 通道 1 的计数器始终返回 0,因此将两个通道都设置为Direct
无效。
我在这里做错了什么?我不确定如何在 STM32CubeMX 中正确设置 PWM 输入。
c - 无法弄清楚如何通过 USB 将数据发送到从 stm32f103c8 到 PC 的帽子开关
我最近重新开始玩微控制器,最后有点卡住了。所以我正在构建的是一个自定义游戏手柄。我可以正确模拟按钮的数据,但是当我带上帽子开关时没有任何效果。我假设我发送了错误的数据包,但无法找出正确的结构。在测试代码中,我只是试图发送一些“按钮按下”并试图按下帽子开关的一个键,但看起来那台电脑无法识别我的数据包。我确实浏览了隐藏文档(尤其是第 64、65 页),但仍然不知道为什么这不起作用。
我的 HID 描述符:
基本测试代码:
c - STM32:HAL_UART_Transmit_IT 函数不打印值
一开始,我对微控制器编程的世界还比较陌生
我在另一个回调函数 (HAL_UART_RxCpltCallback) 中调用 HAL_UART_Transmit_IT 时遇到问题。我想编写一个简单的程序,它将从 UART 读取信息,然后以未更改的形式(回显)将其写出。“轮询模式”下的功能 - HAL_UART_Transmit() - 效果很好,但我想在中断上完成所有功能。
还有,我想问一下,在回调函数中清理数组是一个好的解决方案还是应该以不同的方式解决?
stm32 - CubeMX 和 System Workbench 错误“选定的处理器在 Thumb 模式下不支持‘dsb 0xF’”
当我使用 STM32CubeMX 为 STM32F103RCT 创建一个新项目并使用 System Workbench 打开它时,我收到此错误:
在一个类似的问题中,他们说要添加“-mcpu=cortex-m3”但是在哪里???类似问题:STM32Cube - project does not build (Selected processor does not support Thumb mode)
任何想法如何解决这一问题?
编辑:我试图选择一个目标并得到了这个: Properties-Settings-Target
stm32 - SWV 异常跟踪在 Atollic Studio 中不起作用
我想使用 Atollic Studio 中的 STM32L4xx SWV Exception Trace Log
和SWV Trace Log
. 我使用 SEGGER J-Link 并在Debugger
我已正确将接口设置为 SWD 并将核心时钟设置为 80 MHz。同样在 Serial Wire Viewer 设置中,我设置了EXETRC
and Enable Prescaler
。按,我在控制台中Start Trace
收到以下验证错误:
你知道可能会出现什么问题吗?
c - Stm32F407 寄存器级时钟配置问题
我正在研究 Stm32F407 探索板。但我没有解决我的时钟配置问题。我想要 168Mhz 的工作频率,并从 CubeMx 时钟配置管理器获得帮助。这是我来自 CubeMx 的 PLLCFGR 寄存器值0x4405408
(我对这个寄存器有问题)。然后我将所有 RCC 寄存器复制粘贴到我的 CMSIS 代码中。这是我的时钟配置代码。
但我无法从 Atollic 的 SFR 菜单中读取相同的值。所有寄存器均正确,但 PLLCFGR 寄存器值为 0x04405419。这个问题会影响我的时钟速度、外围速度等。我想将 PLLM 位设置为 8,但我读到了 19。所以我得到的速度比我想要的要低。因为 PLLM 位决定 PLL 输入时钟分频。我该如何解决这个注册问题?谢谢。
timer - CubeMX 定时器配置问题(附截图)
我试图了解内部时钟上的计时器是如何工作的。我在下面附上了我的 CubeMX 配置。
目前,我已将主时钟设置为 480 MHz,这是该 STM32H743ZI 芯片的最大值。我正在使用 TIM 2,所以我正在查看 APB1。
从时钟树中,我看到定时器时钟当前为 240 MHz,外围时钟为 120 MHz。
- 我的第一个问题是,为什么它使用 120MHz,它清楚地表示“APB1 上的定时器时钟”为“240MHz”?我已经用示波器验证了频率。
这是一个很长的镜头,但根据我读到的,这个芯片的最大定时器时钟是 200 MHz。所以 240 大于 200,也许芯片会自动应用 /2 分频器?我认为时钟配置树会说些什么,而不是允许应用“240 MHz”?
我的第二个问题:为了论证,假设最大定时器时钟确实是 200 MHz,我如何将 200 MHz 设置为 APB1 的时钟频率?我确信在不影响最大 MCU 时钟并将其从 480 降至 400 MHz 的情况下,没有办法达到 200 MHz?
每当我更改某些内容时,我可以相信 CubeMX 正在执行的自动预分频器/乘数调整吗?
timer - STM32最大接口时钟和最大定时器时钟的区别
我在具有 3 个 PWM 通道的 H743ZI 上使用 TIM1。我正在尝试最大化 PWM 分辨率,所以我需要最大化 TIM1 上的时钟速度。
数据表(下面的屏幕截图)给出了最大接口时钟和最大定时器时钟的 120MHz 和 240MHz 值。
2有什么区别?我的时钟设置如下所示,APB2 的外围时钟为 120MHz,APB2 的定时器时钟为 240MHz。
我需要 PWM 通道上的 24KHz 频率,因此我将 ARR 设置为 4999,这确认 H743 使用的是 120MHz 值(而不是 240MHz 值)。
是因为我以与硬件相关的方式使用计时器 - 因此是“外围时钟”吗?
当然,我的后续问题是我是否可以使用 HRTIM 代替?