- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Rust 语言为 STM32 bluepill 编写代码。我正在使用 STM32f1xx_hal
crate,它随后为外围设备调用 STM32f1
crate。我想做的是使用更自然的语言来指定 DMA 目标内存位置的外设地址,而不是对地址进行硬编码。
这是硬编码地址的样子:
dp.DMA1.ch3.par.write(|w| unsafe { w.bits(0x4001_3000 + 0x0c) } );
这是我想做的:
dp.DMA1.ch3.par.write(|w| &dp.SPI1.dr as *const _);
我当然会为此出错。
预期的可变引用,找到 *-ptr
我对此非常陌生(嵌入式编程和使用 Rust)并且很可能完全错了。这里有人可以指出我正确的方向吗?提前致谢。我也完全意识到这可能是错误的论坛。如果是这样,请告诉我,我会把我的问题转移到那里。
最佳答案
首先,您在这里使用的是 PAC(外设访问包)API,它功能强大,但级别较低且容易出错。 stm32f1xx-hal
有一个DMA API .存储库中有多个 examples that use it .
如果该 HAL API 适合您的需求,那么我会改用它。
至于您的实际问题,您在正确的轨道上,但还不完全正确。
首先,您用来写入寄存器的方法是错误的:
dp.DMA1.ch3.par.write(|w| &dp.SPI1.dr as *const _);
write
方法采用一个闭包,它为您提供了 w
参数并期望您返回相同的 w
。 w
参数的类型为 &mut dma1::ch::par::W
,闭包期望你返回同样的东西。您所写的内容返回了您的 const
指针,这就是错误消息所提示的。
您需要做的是使用W
提供的API。类型写入寄存器。我没有测试以下内容,但根据文档,它(或接近它的东西)应该可以工作:
dp.DMA1.ch3.par.write(|w| w.pa().bits(&dp.SPI1.dr as *const _ as u32));
I also totally realize that this may be the incorrect forum. If so, let me know and I will shift my question over there.
我认为这不是不正确 论坛,但可能有一些更好的论坛。很多人都在 Matrix 的 rust-embedded
channel 闲逛。在我的脑海中,我不知道有什么好的链接可以指导初学者,但这里是 a direct link to the channel .你可能会想出来:-)
另一个很好的可能性是 embedded category on the Rust Users forum .
关于rust - 如何以简单的英语引用 SPI1 数据寄存器以在 Rust 中设置 DMA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57231946/
在 PCIe 配置中,设备具有专用地址,并且它们以点对点模式相互发送数据 - 每个设备都可以随时写入,并且交换机会注意正确地转发数据。不需要“总线主控器”来决定何时以及如何传输数据。 DMA 如何在这
我正在尝试使用 Linux DMA 驱动程序。目前,当我发送交易并开始等待时,我的请求超时。我相信这与我在执行 DMA 映射时设置缓冲区的方式有关。 char *src_dma_buffer = km
如上所述,dma 引擎和 dma Controller (重点是 linux)有什么区别? linux dma 引擎什么时候到位?这是一个特殊的设备还是所有支持 dma 的外围设备的一部分? 在浏览l
DMA 缓冲区是由驱动程序映射的内存。例如,在使用 rtl8319 的 pci-skeleton.c 中,我们有: tp->tx_bufs = pci_alloc_consistent(tp->p
什么是 Linux 内核上下文中的 DMA 映射和 DMA 引擎?什么时候可以在 Linux 设备驱动程序中使用 DMA 映射 API 和 DMA 引擎 API?任何真正的 Linux 设备驱动程序示
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我正在更新一个旧的 linux 驱动程序,该驱动程序通过 DMA 将数据传输到用户空间页面,这些页面通过 get_user_pages() 从应用程序向下传递。 我的硬件是一个新的基于 x86 Xeo
我想将 8 位并行数据从 IO 传输到内存,数据以大约 5 Mhz 的速度非常快地传输,我正在通过使用 S3C2440(400Mhz)处理器的友好 arm 在基于 ARM9 的套件上使用嵌入式 lin
我正在尝试在基于 Zynq-7000 的平台上使用 DMA 引擎将 PCM 流传输到 Zynq PL 中的自定义 I2S Controller 。我的 I2S Controller 连接到外部放大器。
假设 CPU 修改了位置 x+50 的值并且没有将其刷新回主存(回写)。 与此同时,设备发起从 x 到 x+100 的 DMA 读取请求。 在那种情况下,如何通知 CPU 刷新脏缓存行? 最佳答案 D
假设CPU要从PCI Express设备进行DMA读取传输。与PCI Express设备的通信由事务层数据包(TLP)提供。从理论上讲,TLP的最大有效负载大小为1024个双字。那么,当CPU向PCI
这是引用this对类似 dma/pci 问题的回答。我从这个答案中得知,PC 没有能够将数据传输到 PCI 卡或从 PCI 卡传输数据的 DMA,并且 PCI 卡必须提供 DMA 功能。我从同事那里收
我一直在使用 Teensy 3.6 微 Controller 板(180 MHz ARM Cortex-M4 处理器)来尝试实现传感器驱动程序。传感器通过 SPI 进行控制,当命令它进行测量时,它会通
我给你讲个故事: 我有两个缓冲区设置,用于执行所谓的 ping ponging。我有一个指向每个缓冲区的 DMA 系统。 系统设置为 DMA 将数据写入一个缓冲区,而中断处理另一个缓冲区中的数据。 看
在 AMD APP 编程指南中写道(第 4-15 页): 对于传输 <=32 kB:对于从主机到设备的传输,数据由 CPU 复制 到运行时固定的主机内存缓冲区,然后 DMA 引擎传输 数据到设备内存。
我目前正在使用 STM32f407G-DISC1,并尝试使用 ADC 和 DMA 回调捕获缓冲区。 频率发生器连接到引脚 A0,并且电路板接地。我用示波器确认我的电线没有损坏。 现在的问题是,在设置我
memcpy via user space DMA: 是否有可能在 linux 中通过用户空间 DMA 实现 memcpy?我知道有一些方法可以通过 DMA 将内核缓冲区复制到用户空间缓冲区,但想通过
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我正在遵循这个框架 https://forums.xilinx.com/xlnx/attachments/xlnx/ELINUX/10693/1/Linux%20DMA%20from%20User%2
最近,我阅读了很多关于 10gb/s NIC 的网站和书籍,它们的 DMA 以及 linux 内核(10/100 mb/s NIC)处理数据的方式,我遇到了一些问题头脑。 将 10GB/s 的数据流从
我是一名优秀的程序员,十分优秀!