TIM

stm32定时器TIM的RESET模式(复位模式)怎么使用?利用cube的Hal库怎么操作(已解决)

问题已解决,果然还是要屎劲的看文档啊!!
stm32F407的hal库中定时器tim的从模式:复位模式,

QQ图片20150521125209.jpg


以下问题的解决办法是加入下面一句话:


__HAL_TIM_URS_ENABLE(&htim3);

这句话的意思是将TIMx_CR1寄存器里的URS位置位,
作用是:
TIMx_CR1寄存器里的URS位可以选择update event的触发源。0就是所有相关源,1就是仅限于溢出。
相关函数的说明如下:


/**
* @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register
* @param __HANDLE__: TIM handle.
* @note When the USR bit of the TIMx_CR1 register is set, only counter
* overflow/underflow generates an update interrupt or DMA request (if
* enabled)
* @retval None
*/
#define __HAL_TIM_URS_ENABLE(__HANDLE__) \
((__HANDLE__)->Instance->CR1|= (TIM_CR1_URS))

当然有使能就有失能函数


/**
* @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register
* @param __HANDLE__: TIM handle.
* @note When the USR bit of the TIMx_CR1 register is reset, any of the
* following events generate an update interrupt or DMA request (if
* enabled):
* – Counter overflow/underflow
* – Setting the UG bit
* – Update generation through the slave mode controller
* @retval None
*/
#define __HAL_TIM_URS_DISABLE(__HANDLE__) \
((__HANDLE__)->Instance->CR1&=~(TIM_CR1_URS))


使用的时候这样用:


MX_TIM3_Init();
__HAL_TIM_URS_ENABLE(&htim3);
HAL_TIM_Base_Start_IT(&htim3);


如题:
RESET模式应该怎么配置,我配置了下,然后程序中
使用了一个IO口作为输出一个高低电平的脉冲,间隔时间为100ms
定时器我设置跟新时间是1s
我的想法是将这个IO电平连接到定时器的触发源端口,设置上升沿触发,导致RESET定时器
我在HAL_TIM_PeriodElapsedCallback函数中开启一个IO口指示led灯
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_6);
如果led以1s的状态闪烁了,则说明定时器UPdate了
当我接到IO脉冲口的时候,按道理上来应该是100ms产生了一个上升沿导致定时器一直复位,不会产生更新事件,即,不会导致led亮
但是,实际的情况是:
连接好电路后,led不停的以100ms闪烁,
我理解是定时器确实复位了,但是同时导致了UPdate事件的发生,HAL_TIM_PeriodElapsedCallback这个函数就被调用,哎
问题来了,我应该怎么判断这个事更新事件还是溢出事件导致的?
或者右其他更好的办法或者设置
已邀请:

admin

赞同来自:

究其原因还是自己对stm32不熟悉
等最终解决问题才发现正点在哪
以下列出TIM的Reset模式的配置和相关程序供以后参考!

QQ图片20150521130424.gif


QQ图片20150521130756.gif


QQ图片20150521131415.gif

至于其他两个IO口配置为上拉,M模式
生成程序.
在main.c文件中添加:


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* NOTE : This function Should not be modified, when the callback is needed,
the __HAL_TIM_PeriodElapsedCallback could be implemented in the user file
*/
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_6);
}

当系统定时器溢出的时候IO6的led灯会闪烁
同时在main()函数中TIM初始化结束后添加


__HAL_TIM_URS_ENABLE(&htim3);
//下面这句是我随后又一次修改的,为了不上电就产生一次中断
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim3);

上面的意思,是开启定时器中断,第一句是只开启溢出中断
紧接着在while()里添加


HAL_Delay(200);
HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_7);

意思是让IO7口产生一个200ms的脉冲波形....
ok,程序结束,可以测试了.
当不用连接线连接IO7口和定时器的触发端口PA6的时候,
定时器会计时到1s产生一次溢出,导致IO6口的led闪烁
此时如果连接PA6口和IO6口,使IO6口的200ms的脉冲触发定时器的reset功能
这样定时器在200ms就会复位,此时上面也失能了更新中断功能,所以不会导致中断发生,即led不会闪烁
测试结束.

admin

赞同来自:

定时器中又发现一个问题
当我们


MX_TIM3_Init();
HAL_TIM_Base_Start_IT(&htim3);


初始化之后
开启前的时候装载了一次预设值,这样开机就自动产生了一个UPdate中断
这是我的实验现象发现的,不知道是我实验的问题还是定时器这样写就是有类似的问题.

为了,开机不直接进入update中断,那么就需要在开启之前清理一次中断标志位
改为:


MX_TIM3_Init();
__HAL_TIM_CLEAR_FLAG(&htim3,TIM_FLAG_UPDATE);
HAL_TIM_Base_Start_IT(&htim3);


这样做之后,实验的结果才是我们想要的....

如果我理解有误,请指出
我遇到的问题是进了中断,出不来,求指教;

zhanxing@tooan.cn
匿名用户

匿名用户

赞同来自:

PA6 有什么作用?程序没有体现PA6的设置啊

回首过去

赞同来自:

请问在定时器的PWM模式下,在ETR引脚得到上升沿后一直保持高电平的时候,定时器确实复位了,但是PWM输出一直处于有效电平,这个时候高电平不应该有作用啊。我查看了计数器的CNT,ETR保持高电平的时候,CNT一直小于比较值CCR,导致PWM波一直有效,请问这个怎么解决?

要回复问题请先登录注册