当前位置:网站首页>利用 nucleo stm32 f767zi 进行USART+DMA+PWM输入模式 CUBE配置
利用 nucleo stm32 f767zi 进行USART+DMA+PWM输入模式 CUBE配置
2022-08-02 03:21:00 【& Tom】
相信用过stm官方核心板的朋友们都知道 cube 这个神奇的东西,我也是刚接触这东西没两个月,就最基本的 usart+dma+exit+pwm输入模式跟大家分享一下,希望能跟大家一起学习。
1、USART_TX+DMA:
USART大家都不陌生,就不解释,解释一下DMA吧,官方定义为:直接存储器访问控制器。可在无CPU干预下进行数据传输,多方便啊,一边传数据一边干别的事,一举两得。
言归正传:直接上图,串口利用DMA进行数据传输。
第一步:串口配置照旧,没啥不一样
第二部:在串口 DMA Settings 添加 串口DMA通道,如图
在这里只用了串口发送DMA ,所以会看到是 USART_TX 优先级等参数根据自己的需要自己设定
好了,出口配置就差不多了,接下来配置 PWM的输入模式,用了定时器3 具体配置看图说话
PWM输入模式,不需要设置通道,只需要选择一下 PWM输入模式就行了。
再仔细看定时器的设置:
看好这两个设置,PWM输入模式是定时器输入捕获的一个特例,可以用来测量脉冲宽度。
在这里楼主也用到了DMA传输,在配置时同样要添加DMA通道,就不上图了,参照前边地添加方法
好了,可以生成答案吗了,注意,CUBE是强制生成DMA中断。
接下来就是程序设置了:
在主程序中,添加开启 串口发送DMA 和 定时器输入捕获DMA 开启函数
HAL_UART_Transmit_DMA(&huart1,Tx_Buff,1000);
HAL_TIM_IC_Start_DMA(&htim3,TIM_CHANNEL_1,TIM3_INPUT,1000);
这样就开启了串口发送DMA和输入捕获DMA 就都开启了,但是,这样是不是就能直接用了呢,当然不是!
这样不加处理的话就只能传输一遍,然后所有的中断中标志位都被置位,而且使能DMA的EN也会被清除,无法再次启动传输。
原因就是DMA配置成了单次模式,如上图所示,这样一来,DMA就会触发一次传输完成之后,一直处于忙状态,没有清除相应的流传输完成中断标志位,而且没有使能DMA, 就无法启动第二次传输。
经过一番仿真,终于搞定了这一步,下面贴上代码
在DMA中断函数里会把相应的流传输完成中断标志位给清零,我们要做的就是给清除相应的传输完成中断标志位和使能DMA
1.串口发送DMA 在中断里添加代码
/* USER CODE BEGIN DMA2_Stream7_IRQn 1 */
/* Disable the tx DMA peripheral */
__HAL_DMA_DISABLE(&hdma_usart1_tx);
/*Clear the DMA Stream pending flags.*/
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx,__HAL_DMA_GET_TC_FLAG_INDEX(&hdma_usart1_tx));
/* Process Unlocked */
__HAL_UNLOCK(&hdma_usart1_tx);
__HAL_DMA_ENABLE(&hdma_usart1_tx);
/* USER CODE END DMA2_Stream7_IRQn 1 */
2.定时器的DMA中断与串口DMA中断不尽相同,用同样的代码不管用
通过仿真来看是相应的流传输完成中断标志位没清除,导致无法使能DMA
所以在中断里直接清位,使能就OK啦
上图
到这里,两个DMA就可以啦。
以上有来自网友的参考,也有自己实践出来的,希望能帮助大家解决一点小困惑,共同学习。谢谢。
附上我的源代码发在论坛里了,自己去搜索下载
边栏推荐
- @Autowired详解[email protected]在static属性上的使用
- sh: 1: curl: not found
- redis进行持久化时,有新的写操作将如何解决——写时复制
- 第十一天&shell脚本
- DSPE-PEG-Silane,DSPE-PEG-SIL,磷脂-聚乙二醇-硅烷修饰活性基团
- 跨域问题解决
- np.unique()函数
- getattr() function analysis
- subprocess.CalledProcessError: Command ‘pip install ‘thop‘‘ returned non-zero exit status 1.
- SSM integration
猜你喜欢
@Accessors 注解详解
How to check whether a table is locked in mysql
Redis笔记进阶篇:万字长文-整理Redis,各种知识点,建议收藏
day11--shell脚本
subprocess.CalledProcessError: Command 'pip install 'thop'' returned non-zero exit status 1.
活体检测 Adaptive Normalized Representation Learning for GeneralizableFace Anti-Spoofing 阅读笔记
DSPE-PEG-DBCO Phospholipid-Polyethylene Glycol-Dibenzocyclooctyne A Linear Heterobifunctional Pegylation Reagent
parser = argparse.ArgumentParser()解析
Cloud server installation and deployment of Nacos 2.0.4 version
MySQL中字符串比较大小(日期字符串比较问题)
随机推荐
bgp机房的动态路由和静态路由的区别
DOM destruction and reproduction experiment
Redis笔记基础篇:6分钟看完Redis的八种数据类型
docker 安装 sqlserver中的坑点
@Autowired注解的使用
MySQL两阶段提交串讲
@ApiModel 和 @ApiModelProperty
我的两周年创作纪念日
SOCKS5
SSM整合
【装机】老毛桃的安装及使用
@Autowired详解[email protected]在static属性上的使用
DSPE-PEG-DBCO 磷脂-聚乙二醇-二苯并环辛炔 一种线性杂双官能聚乙二醇化试剂
parser = argparse.ArgumentParser() parsing
How to check whether a table is locked in mysql
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
MySQL删除表数据 MySQL清空表命令 3种方法
3分钟带你了解微信小程序开发
yolov5调用ip摄像头时出现的问题
亚马逊卖家怎么提升转化率