问题标签 [stm32f4]
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.
interrupt - STM32 USART Rx 中断无法正常工作
我正在使用 STM32F407,并且正在从事一个尝试使用 USART3 接收数据的项目。
项目概况:
我必须通过电线发送一个特殊的 PWM 序列。发送 PWM 后,我在同一根线上立即收到串行数据的响应(USART 标准,8N1)。我使用 timer1 更新中断生成 PWM。在最后一个脉冲之后,我停用了 timer1 中断并激活了 USART Rx 中断。然后 - 通常 - 我应该收到串行数据。接收数据并将它们存储在环形缓冲区中的代码在其他项目中工作得很好。
我的问题:
有时会正确接收传入的串行数据(它是96 个单字节的流)。使用可以解码 USART 信号的示波器,我可以看到正确的数据到达 USART Rx 引脚。但是 USART Rx 中断不能正常工作。大多数情况下,我只收到一个字节(只有一个中断)。为了调试 ISR,我将 SR、DR 和 CR1 寄存器保存到一个数组中,以记录发生了哪些错误标志。寄存器值向我显示,每次帧接收失败,我设置了一个或多个不同的错误标志。噪声错误、溢出错误和帧错误。但是,如果有时接收有效,我会看到没有设置错误标志。
我认为每次一个字节到达 USART 时都会产生一个 Rx 中断,而与错误标志的状态无关......
我真的不知道为什么如果有错误标志,ISR 只能工作一次。
有人可以帮助我吗?
更新 1
这是一个简短的更新。我和某人交谈过,有人告诉我,USART 接收 PWM 信号也可能是个问题。当 USART 仍在运行时,我将尝试将引脚的状态更改为输出。在最后一个 PWM 脉冲之后,我会将引脚的状态更改为 UASRT Rx 输入。如果 USART 只能接收串行信号,也许这可以解决问题。我将在这里发布我的过程。
解决方案
上周我解决了我的问题。
首先,我遇到的问题是一个函数将 Rx 引脚配置为另一个外设的输入......(._.)
第二个问题是信号质量差。STM32 的 USART 可以工作在 ONEBIT 模式。这种模式(据我了解)仅对每个位进行一次采样,而不是对每个位进行三次采样。所以我将我的 USART 的容差提高到 3.88%。
最后,为了安全起见,我在激活 USART Rx 中断之前清除了所有挂起的 USART 中断位。
现在我可以可靠地接收传入的帧。
感谢您的评论和帮助。
timer - STM32 blocking delays not consistent with interrupts disabled
I am running on an STM32F0xx micro, and I have the following code that simply toggles a pin using blocking delays (yes I know blocking delays are bad, not point here).
I disable interrupts to make sure nothing else is going on at this point. When I scope these waveforms, I see 10 clock periods; however, the periods of these waveforms do not all match. All even waveforms (0,2,4,6,8) have the same period, and all odd waveforms (1,3,5,7,9) have the same period, but the even and odd waveforms differ by a significant amount (%12). The even waveforms correlate to the first delay toggling, and odd to the second in the for loop. I do not have any idea why these would differ in period. Anyone have any insight here?
spi - stm32f4xx spi miso 和 mosi 重映射
我正在尝试让stm32f401ce的spi1功能正常工作。从stm32f401ce 的数据表39 页中可以看出,PA6 用于 SPI1_MISO,PA7 用于 SPI1_MOSI。由于我们的硬件设计存在一些问题,我想将 PA6 重新映射为 SPI1_MOSI,并将 PA7 重新映射为 SPI1_MISO。有可能这样做吗?
stm32f4 - STM32F4 从待机模式唤醒的原因
我需要知道 STM32F4 从待机模式唤醒的原因是什么。我同时使用了 WKUP 引脚 (PA0) 和 RTC 唤醒中断,因为我需要在唤醒时知道是什么原因。
谢谢。
networking - 一个值不能分配给一个实体(在 LwIP 上)
我想使用我的 STM32F4 开发板使用 freeRTOS 实现一个网络项目。一开始。我使用 tcp/udp 回显服务器。这是我的代码
但是我在 buf = netconn_recv(conn,&buf) 和 buf->addr = NULL 上得到一个错误。它显示:
“err_t”类型的值不能分配给“struct netbuf *”类型的实体
在 buf->addr 上:
“int”类型的值不能分配给“ip_addr_t”类型的实体
我该如何解决?
interrupt - STM32F4 - CAN总线发送每次都成功,但CAN接收仅在第一次调用时成功
我正在使用 STM32F469 探索板,并且正在尝试使用 CAN 功能。
我知道在这个板上 CAN1 不能与触摸屏同时使用。因此我需要使用 CAN2,但为了启用 CAN2,需要启用 CAN1。
我的配置/回调代码如下:
然后我在主函数中运行以下命令来配置 CAN1、CAN2 和中断:
然后我运行CAN_Transmit_Message()
.
执行此操作时,我已验证消息成功传输(橙色 LED未亮起),然后执行接收中断处理程序(黄色 LED 亮起)并成功接收消息(红色 LED未亮起)。
但是,在第二次传输消息时(再次调用CAN_Transmit_Message()
),传输再次成功,但接收失败(红色 LED 亮起)。
我按照 CAN_Networking 示例代码中的结构创建了此代码,但我无法弄清楚为什么它在HAL_CAN_Receive_IT
第二条消息的函数上失败(在成功接收到第一条消息之后)。
注意:阅读stm32f4xx_HAL_CAN库文件后,我注意到有两种类型的接收/发送:
- HAL_CAN_Transmit_IT/HAL_CAN_Receive_IT
- HAL_CAN_Transmit/HAL_CAN_Receive
它说 1. 是非阻塞的 - 我认为这意味着可以在此发送/接收仍在运行时触发另一个中断?
在我的情况下,我想确保在发送传输请求后收到响应数据,所以我应该使用函数 2。?即我会用合适的超时时间调用 HAL_CAN_Transmit,然后在它完成调用 HAL_CAN_Receive 后,再次使用合适的超时时间。
c - STM32 HID USB驱动真的那么慢吗?
我有一个项目需要通过 USB HID 传输数据。我进行了一些速度测试,发现 USB 驱动程序的速度非常慢,低于 1kB/s(远不及 64kB/s)。这真的是驱动程序问题还是其他问题。有没有人在 STM32 HID 上达到接近 64kB/s 的速度?
linker - 错误:L6218E:从 main.o Keil STM32F4 引用的未定义符号
我面临一个链接器错误:
我已经添加了文件stm32f4xx_hal_uart.c
及其路径,option -> C/C++ -> include path
但它仍然显示错误。
我已经通过 RTE 管理器添加了文件,但仍然是同样的错误。
如果我添加文件两次,它会显示:
请告诉我是什么导致了这个问题以及可能的解决方案。
gpio - STM32F4 GPIO IDR
我正在学习 STM32F407 MCU,但对其输入数据寄存器感到困惑。该寄存器为 32 位,其中 0-15 位为只读位,其余位为保留位。我的问题是该寄存器在数据表中定义为默认值 0x0000XXXX。XXXX 在数据表中是“未定义的”。“未定义”术语的真正含义是什么?下面是一个例子:
if (GPIOA->IDR & 0x0001) GPIOD-ODR |= 0xF000;
所以未定义的寄存器位会导致在我不按下按钮时打开 LED?
谢谢....