使用DMA接收遥控器信号

DMA接收DR16遥控器信号

声明:本篇文章作为学习代码的笔记,笔者是大一学生,基础较差,其中难免理解有误,思想不到位,请指出。

使用的芯片是STM32F427IIHx,RM提供的A型版

不太清楚这个代码能不能公开,若是涉嫌产权问题联系本人,会尽快删除。

  1. 打开CubeMX,进行一些基本操作,如设置Serial Wire等,这里省略。
    接下来就是配置时钟,设置外部高速时钟,频率为168MHz在这里插入图片描述

  2. 第二步配置串口,选择USART1,设置为异步传输Asynchronous(通常都是异步传输,若是同步则还需要配置很多其他的东西)
    配置NVIC,使能UASRT1 的全局中断(如下图👇)在这里插入图片描述
    在parameter setting里面配置波特率为100000,即十万,注意遥控器要求偶校验。(就不放图了)

为了不过多占用单片机的空间我们一般会选择使用DMA,所以需要开启DMA,操作如下图所示使用circular的原因是为了能够多次接收数据

我很好奇为什么我们需要自己写相对底层的代码而HAL库甚至没有提供给我们可以用的函数,经过相关询问后得知,HAL库给的函数实际上是有问题的,事实上IIC也是这样的(只是我们不经常用而已)

那么接下来我们就需要在keil里面进行编写了

在此之前我们先来理清一些思路,想想代码具体应该怎么写。

大致思路是这样的:

  1. 清除IDLE标志位(这样做是为了避免全局中断一直在进行),使能DMA。 感觉这部分就相当于一些类似初始化的操作
  2. 在处理中断的文件里面进行数据合法性的判断
  3. 将数据送入解码函数里面进行解码
  4. 以DMA模式接收

OK,那么接下来我们来实操一下。

(其实有学长有更详细的讲解,DBUS协议的解读也可以住里面找到)

  1. 在main.c文件下面声明一个带有54个元素的八位无符号数组,在main函数下面写如下代码:这里RX54个元素其实不是固定的,理论上来说只要是18的倍数都可以,但是不能是18(可以参考DBUS协议)

  2. 接下来我们跳到stm32f4xx_it.c(以下简称it.c)在进行合法性判断之前,先对传输过来的数据进行整理,即声明一个结构体来便于下面的操作。在这里插入图片描述

  3. 那么接下来我们要进行中断处理了。
    关于中断处理我们再来重新理一下思路。

    我们要干什么? 答:接收遥控器传过来的数据

    我们需要什么? 答:数据长度以及数据

    我们操作的具体步骤?
    答:①判断是否已经重置
    ②清除UART空闲中断的标志位,清除UART,DMA传输完成的标志位。
    ③传输完成后关闭DMA避免受到干扰
    ④判断数据长度(即收到的数据是否合法)
    ⑤解码并接受数据
    ⑥以DMA形式接收

OK,那么接下来就可以编写代码了
成品如下:在这里插入图片描述
这个函数不要忘记放到it.c下面的USART1_IRQHandler里面!

  1. 关于解码函数
    在这方面还没有进行时深入了解,先用的是祖传代码。在上文给的链接里面也有解码的更好的解读。
    至于解码原理可以参考DBUSA协议

结语
按照我在学校里面的调试,经过这样的编码之后就可以在DR7上接收到遥控器发送过来的信号了,但是自己根据示例重新写了一份,并没有经过实操,算是云编码。可能难免会有错误。

笔记就先到这里了,若有补充会补上

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用DMA接收数据时,需要先配置好UART的DMA接收模式,并开启DMA中断。接收到数据后,DMA会自动将数据存储到指定的缓冲区中,并触发DMA中断。在DMA中断中,可以对接收到的数据进行处理。 以下是基于STM32CubeIDE的示例代码: 1. 配置UART的DMA接收模式 ```c /* Configure UART for DMA reception */ HAL_UART_Receive_DMA(&huart1, rx_buffer, BUFFER_SIZE); ``` 其中,`huart1`是UART的句柄,`rx_buffer`是DMA接收数据的缓冲区,`BUFFER_SIZE`是缓冲区大小。 2. 开启DMA中断 ```c /* Enable DMA interrupts */ __HAL_DMA_ENABLE_IT(&hdma_usart1_rx, DMA_IT_TC); ``` 其中,`hdma_usart1_rx`是DMA的句柄,`DMA_IT_TC`表示DMA传输完成中断。 3. DMA中断处理 ```c void DMA1_Channel5_IRQHandler(void) { /* Check transfer complete flag */ if (__HAL_DMA_GET_FLAG(&hdma_usart1_rx, DMA_FLAG_TC5)) { /* Clear transfer complete flag */ __HAL_DMA_CLEAR_FLAG(&hdma_usart1_rx, DMA_FLAG_TC5); /* Process received data */ process_data(rx_buffer, BUFFER_SIZE); /* Restart DMA reception */ HAL_UART_Receive_DMA(&huart1, rx_buffer, BUFFER_SIZE); } } ``` 其中,`DMA1_Channel5_IRQHandler`是DMA中断处理函数,`hdma_usart1_rx`是DMA的句柄,`DMA_FLAG_TC5`表示DMA传输完成标志,`process_data`是处理数据的函数,`rx_buffer`是DMA接收数据的缓冲区,`BUFFER_SIZE`是缓冲区大小。 在DMA中断处理函数中,首先判断传输完成标志是否被置位,如果是,则清除标志,处理接收到的数据,最后重新启动DMA接收

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值