DMA接收DR16遥控器信号
声明:本篇文章作为学习代码的笔记,笔者是大一学生,基础较差,其中难免理解有误,思想不到位,请指出。
使用的芯片是STM32F427IIHx,RM提供的A型版
不太清楚这个代码能不能公开,若是涉嫌产权问题联系本人,会尽快删除。
-
打开CubeMX,进行一些基本操作,如设置Serial Wire等,这里省略。
接下来就是配置时钟,设置外部高速时钟,频率为168MHz -
第二步配置串口,选择USART1,设置为异步传输Asynchronous(通常都是异步传输,若是同步则还需要配置很多其他的东西)
配置NVIC,使能UASRT1 的全局中断(如下图👇)
在parameter setting里面配置波特率为100000,即十万,注意遥控器要求偶校验。(就不放图了)
为了不过多占用单片机的空间我们一般会选择使用DMA,所以需要开启DMA,操作如下图所示
我很好奇为什么我们需要自己写相对底层的代码而HAL库甚至没有提供给我们可以用的函数,经过相关询问后得知,HAL库给的函数实际上是有问题的,事实上IIC也是这样的(只是我们不经常用而已)
那么接下来我们就需要在keil里面进行编写了
在此之前我们先来理清一些思路,想想代码具体应该怎么写。
大致思路是这样的:
- 清除IDLE标志位(这样做是为了避免全局中断一直在进行),使能DMA。 感觉这部分就相当于一些类似初始化的操作
- 在处理中断的文件里面进行数据合法性的判断
- 将数据送入解码函数里面进行解码
- 以DMA模式接收
OK,那么接下来我们来实操一下。
(其实有学长有更详细的讲解,DBUS协议的解读也可以住里面找到)
-
在main.c文件下面声明一个带有54个元素的八位无符号数组,在main函数下面写如下代码:
-
接下来我们跳到stm32f4xx_it.c(以下简称it.c)在进行合法性判断之前,先对传输过来的数据进行整理,即声明一个结构体来便于下面的操作。
-
那么接下来我们要进行中断处理了。
关于中断处理我们再来重新理一下思路。我们要干什么? 答:接收遥控器传过来的数据
我们需要什么? 答:数据长度以及数据
我们操作的具体步骤?
答:①判断是否已经重置
②清除UART空闲中断的标志位,清除UART,DMA传输完成的标志位。
③传输完成后关闭DMA避免受到干扰
④判断数据长度(即收到的数据是否合法)
⑤解码并接受数据
⑥以DMA形式接收
OK,那么接下来就可以编写代码了
成品如下:
这个函数不要忘记放到it.c下面的USART1_IRQHandler里面!
- 关于解码函数
在这方面还没有进行时深入了解,先用的是祖传代码。在上文给的链接里面也有解码的更好的解读。
至于解码原理可以参考DBUSA协议
结语
按照我在学校里面的调试,经过这样的编码之后就可以在DR7上接收到遥控器发送过来的信号了,但是自己根据示例重新写了一份,并没有经过实操,算是云编码。可能难免会有错误。
笔记就先到这里了,若有补充会补上