你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于Cube的STM32 编码器 DMA传输问题

[复制链接]
Hackerpro 提问时间:2018-3-26 16:58 /
本帖最后由 hacker 于 2018-3-26 17:15 编辑

前几天做了个编码器接口,读出的数据发现只能自己去找htim2.Instance->CNT寄存器来得到值,到这里功能是正常的,为了避免直接读寄存器,于是先到了DMA传输,直接把寄存器值送到内存里。官方驱动里也有对应的接口:
  1. /**
  2.   * @brief  Starts the TIM Encoder Interface in DMA mode.
  3.   * @param  htim : TIM Encoder Interface handle
  4.   * @param  Channel : TIM Channels to be enabled
  5.   *          This parameter can be one of the following values:
  6.   *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  7.   *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  8.   *            @arg TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected
  9.   * @param  pData1 : The destination Buffer address for IC1.
  10.   * @param  pData2 : The destination Buffer address for IC2.
  11.   * @param  Length : The length of data to be transferred from TIM peripheral to memory.
  12.   * @retval HAL status
  13. */
  14. HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length)
复制代码
DMA配置是这样的:
dma.png

调用是这样的:

  1. uint32_t IC1_value = 0;
  2. uint32_t IC2_value = 0;

  3. HAL_TIM_Encoder_Start_DMA(&htim2, TIM_CHANNEL_1, &IC1_value, &IC2_value, 1);
复制代码
然后运行就硬件错误了,有大神遇到过么?该怎么解决?谢谢
附上配置文件
Encoder.rar (1.88 KB, 下载次数: 9)
收藏 评论8 发布时间:2018-3-26 16:58

举报

8个回答
wenyangzeng 回答时间:2018-3-26 19:10:27
本帖最后由 wenyangzeng 于 2018-3-26 19:40 编辑

1、楼主的DMA Menory Increnent Address “原地踏步”,如何得到正确数据?这个选项要打勾。

2、Data Width 按理要选择HalfWord

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

feixiang20 回答时间:2018-3-26 20:41:29
参考了关于STM32的I2C硬件DMA实现这个文章,是超时机制引起硬件异常么

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

Hackerpro 回答时间:2018-3-27 09:10:11
wenyangzeng 发表于 2018-3-26 19:10
1、楼主的DMA Menory Increnent Address “原地踏步”,如何得到正确数据?这个选项要打勾。

2、Data Widt ...

谢谢元老的回复!

字宽我理解,设置好了,不过问题没有解决

我只是要这一个寄存器的值啊?不太懂打勾自增是什么道理

另外,我简单的打上了,问题还是一样

麻烦指明下好么?非常感谢
Hackerpro 回答时间:2018-3-27 09:10:45
feixiang20 发表于 2018-3-26 20:41
参考了关于STM32的I2C硬件DMA实现这个文章,是超时机制引起硬件异常么

应该不是,这才初始化就出的错误
wenyangzeng 回答时间:2018-3-27 10:18:08
本帖最后由 wenyangzeng 于 2018-3-27 10:20 编辑
hacker 发表于 2018-3-27 09:10
谢谢元老的回复!

字宽我理解,设置好了,不过问题没有解决

DMA操作时如果DMA内存地址不加1,所有操作都覆盖在同一地址。而如果只要1个变量值,就无需使用DMA了。
Hackerpro 回答时间:2018-3-27 11:52:43
wenyangzeng 发表于 2018-3-27 10:18
DMA操作时如果DMA内存地址不加1,所有操作都覆盖在同一地址。而如果只要1个变量值,就无需使用DMA了。
...

不知道这样是否会造成错误,不过我本意确实是这样:DMA把CNT寄存器值自动循环更新到变量

另外,HAL接口里没有找到获取编码器当前的值的函数,我也是很困惑,不会只能自己读寄存器吧?
wenyangzeng 回答时间:2018-3-27 11:55:49
hacker 发表于 2018-3-27 11:52
不知道这样是否会造成错误,不过我本意确实是这样:DMA把CNT寄存器值自动循环更新到变量

另外,HAL接口 ...

DMA里的数据还是要去读取的。如果就1-2个数据,用DMA实在不合算。
Hackerpro 回答时间:2018-3-27 15:50:46
wenyangzeng 发表于 2018-3-27 11:55
DMA里的数据还是要去读取的。如果就1-2个数据,用DMA实在不合算。

合不合算我倒不是很在意,我很想知道官方到底想让用户用什么方式得到编码器的值,实在找不到其他方法了

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版