本帖最后由 hacker 于 2018-3-26 17:15 编辑
前几天做了个编码器接口,读出的数据发现只能自己去找htim2.Instance->CNT寄存器来得到值,到这里功能是正常的,为了避免直接读寄存器,于是先到了DMA传输,直接把寄存器值送到内存里。官方驱动里也有对应的接口:
- /**
- * @brief Starts the TIM Encoder Interface in DMA mode.
- * @param htim : TIM Encoder Interface handle
- * @param Channel : 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
- * @param pData1 : The destination Buffer address for IC1.
- * @param pData2 : The destination Buffer address for IC2.
- * @param Length : 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);
复制代码 然后运行就硬件错误了,有大神遇到过么?该怎么解决?谢谢
附上配置文件
Encoder.rar
(1.88 KB, 下载次数: 9)
|
1、楼主的DMA Menory Increnent Address “原地踏步”,如何得到正确数据?这个选项要打勾。
2、Data Width 按理要选择HalfWord
评分
查看全部评分
评分
查看全部评分
谢谢元老的回复!
字宽我理解,设置好了,不过问题没有解决
我只是要这一个寄存器的值啊?不太懂打勾自增是什么道理
另外,我简单的打上了,问题还是一样
麻烦指明下好么?非常感谢
应该不是,这才初始化就出的错误
DMA操作时如果DMA内存地址不加1,所有操作都覆盖在同一地址。而如果只要1个变量值,就无需使用DMA了。
不知道这样是否会造成错误,不过我本意确实是这样:DMA把CNT寄存器值自动循环更新到变量
另外,HAL接口里没有找到获取编码器当前的值的函数,我也是很困惑,不会只能自己读寄存器吧?
DMA里的数据还是要去读取的。如果就1-2个数据,用DMA实在不合算。
合不合算我倒不是很在意,我很想知道官方到底想让用户用什么方式得到编码器的值,实在找不到其他方法了