OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4527|回复: 5

STM32 HAL库的高级定时器 重复寄存器RCR设定,无法做到实时更新RCR的设定值

[复制链接]

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
发表于 2021-11-18 14:18:54 | 显示全部楼层 |阅读模式
10金钱
程序:基于STM32精确控制步进电机步数
芯片 STM32f103zet6
使用 HAL库
软件 STM32CubeIDE
通过高级定时器PWM输出脉冲,在高级定时器up回调函数内使用重复寄存器来计算步数
串口控制动作指令


重复寄存器RCR赋值是在中断回调函数赋值的
TIM8->RCR = RCR_VAL;   //*********RCR_VAL是我设定值
rcr_finish只是个标志位;rcr_integer rcr_remainder 是设定值的部分组成 motor_dir 是方向的参数 CW 等等无关紧要
关键是:我RCR赋值在回调函数里面怎么就没用,开机设定走200步,就只走一步,之后走两百步正常,随后走第一次三百步,只走了200步,第之后走三百步正常。随后走500只走300步,随后正常,就好像就晚一拍。
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {//定时器中断回调函数
  3.         if(htim->Instance == htim8.Instance)
  4.         {
  5.                 if(rcr_finish == 0)
  6.                 {
  7.                         if(rcr_integer != 0)
  8.                         {
  9.                                 TIM8->RCR = RCR_VAL;
  10.                                 rcr_integer--;
  11.                         }
  12.                         else if(rcr_remainder != 0)
  13.                         {
  14.                                 TIM8->RCR = rcr_remainder - 1;
  15.                                 rcr_remainder = 0;
  16.                                 rcr_finish = 1;
  17.                         }
  18.                         else
  19.                                 goto out;

  20. //                        __HAL_TIM_MOE_ENABLE(&htim8);
  21.                         HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);
  22. //                        HAL_TIM_Base_Start_IT(&htim8);

  23.                         if(motor_dir == CW)
  24.                                 current_pos += (TIM8->RCR + 1);
  25.                         else
  26.                                 current_pos -= (TIM8->RCR + 1);
  27.                 }
  28.                 else
  29.                 {
  30. out:                rcr_finish = 1;
  31.                         HAL_TIM_PWM_Stop(&htim8, TIM_CHANNEL_3);
  32.                 }
  33.         }
  34. }
复制代码


stm32中文参考手册有这一段描述:
重复寄存器RCR.png

Snipaste_2021-11-18_14-17-29.png

但是hal库,我搞不清楚,故不知道该怎么做,




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2020-6-12
在线时间
303 小时
发表于 2021-11-18 14:45:02 | 显示全部楼层
HAL_TIM_GenerateEvent(&htim8, TIM_EVENTSOURCE_UPDATE: )
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-11-18 15:55:12 | 显示全部楼层
rektito 发表于 2021-11-18 14:45
HAL_TIM_GenerateEvent(&htim8, TIM_EVENTSOURCE_UPDATE: )

这个是??意义呢
回复

使用道具 举报

3

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2021-9-14
在线时间
18 小时
 楼主| 发表于 2021-11-18 16:00:33 | 显示全部楼层
rektito 发表于 2021-11-18 14:45
HAL_TIM_GenerateEvent(&htim8, TIM_EVENTSOURCE_UPDATE: )

没用,还是只动一步,
回复

使用道具 举报

1

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2020-6-12
在线时间
303 小时
发表于 2021-11-18 16:51:08 | 显示全部楼层
rektito 发表于 2021-11-18 14:45
HAL_TIM_GenerateEvent(&htim8, TIM_EVENTSOURCE_UPDATE: )

这是手动产生更新事件  使得写入的RCR立即生效。  但是好像有一个问题  产生更新事件后会导致又进入中断  我没看到清除中断标志位在哪儿  我对HAL库不熟。
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2021-11-23 17:16:53 | 显示全部楼层
不是很熟悉HAL
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-12 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表