hacker 发表于 2018-3-26 16:58:47

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

本帖最后由 hacker 于 2018-3-26 17:15 编辑

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


调用是这样的:

uint32_t IC1_value = 0;
uint32_t IC2_value = 0;

HAL_TIM_Encoder_Start_DMA(&htim2, TIM_CHANNEL_1, &IC1_value, &IC2_value, 1);然后运行就硬件错误了,有大神遇到过么?该怎么解决?谢谢
附上配置文件

wenyangzeng 发表于 2018-3-26 19:10:27

本帖最后由 wenyangzeng 于 2018-3-26 19:40 编辑

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

2、Data Width 按理要选择HalfWord

feixiang20 发表于 2018-3-26 20:41:29

参考了关于STM32的I2C硬件DMA实现这个文章,是超时机制引起硬件异常么

hacker 发表于 2018-3-27 09:10:11

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

2、Data Widt ...

谢谢元老的回复!

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

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

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

麻烦指明下好么?非常感谢

hacker 发表于 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了。

hacker 发表于 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实在不合算。

hacker 发表于 2018-3-27 15:50:46

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

合不合算我倒不是很在意,我很想知道官方到底想让用户用什么方式得到编码器的值,实在找不到其他方法了
页: [1]
查看完整版本: 基于Cube的STM32 编码器 DMA传输问题