专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
如何使用Stm32f103系列单片机中的普通定时器写准确延时函数
2019-07-20 23:45
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
19978
5
1628
如何使用Stm32f103系列单片机中的普通定时器写准确延时函数,延时最小步进1ms,能够给出详细程序和备注最好?能给出详细程序并注释最好
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
247470035
1楼-- · 2019-07-21 02:00
本帖最后由 247470035 于 2019-6-17 12:45 编辑
void TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* 定时器初始化配置 */
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* 设置更新请求源只在计数器上溢或下溢时产生中断 */
TIM_UpdateRequestConfig(TIM3,TIM_UpdateSource_Global);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
}
/**
* @brief ms延时程序,1ms为一个单位
* @param
* @arg nTime: Delay_ms( 10 ) 则实现的延时为 10 * 1ms = 10ms
* @retval 无
*/
void Delay_mss(vu32 nTime)
{
/* 清零计数器并使能定时器 */
TIM3->CNT = 0;
TIM_Cmd(TIM3, ENABLE);
for( ; nTime > 0 ; nTime--)
{
/* 等待一个延时单位的结束 */
while(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) != SET);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
}
TIM_Cmd(TIM3, DISABLE);
}
另需要设计定时器3的中断优先级
程序经本人亲自测试,没有问题,此处不再赘述此处可以进一步探讨定时器在循环过程中的误差会是多大?误差的原因有,while循环里面程序自减消耗时间,时钟信号的不稳定,以及其他的一些软、硬件原因。由此可以延伸到原子哥用滴答定时器写的延时函数误差最大是多少?滴答定时器与普通定时器的定时函数有哪些优缺点等。。。
欢迎大家进一步讨论
加载中...
warship
2楼-- · 2019-07-21 03:48
精彩回答 2 元偷偷看……
加载中...
warship
3楼-- · 2019-07-21 08:55
/**
* @brief TIM3 定时器3中断处理程序
*/
#define SYS_TIMER_IRQ_FUN TIM3_IRQHandler //定时器中断服务函数名称
volatile u16 DelayTime; //volatile是为了防止编译器进行优化
void SYS_TIMER_IRQ_FUN(void)
{
if(bTIM_SR_UIF(bSYS_TIMERx)) //如果发生溢出中断(每毫秒1次)
{
bTIM_SR_UIF(bSYS_TIMERx)=0;
if(DelayTime)DelayTime--;
}
}
加载中...
warship
4楼-- · 2019-07-21 09:55
精彩回答 2 元偷偷看……
加载中...
warship
5楼-- · 2019-07-21 12:06
请原谅我在上面的代码中使用了我自编的头文件,参见此帖
http://www.openedv.com/forum.php?mod=viewthread&tid=294788
加载中...
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
void TIM3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* 定时器初始化配置 */
TIM_TimeBaseStructure.TIM_Period = 999;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* 设置更新请求源只在计数器上溢或下溢时产生中断 */
TIM_UpdateRequestConfig(TIM3,TIM_UpdateSource_Global);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
}
/**
* @brief ms延时程序,1ms为一个单位
* @param
* @arg nTime: Delay_ms( 10 ) 则实现的延时为 10 * 1ms = 10ms
* @retval 无
*/
void Delay_mss(vu32 nTime)
{
/* 清零计数器并使能定时器 */
TIM3->CNT = 0;
TIM_Cmd(TIM3, ENABLE);
for( ; nTime > 0 ; nTime--)
{
/* 等待一个延时单位的结束 */
while(TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) != SET);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
}
TIM_Cmd(TIM3, DISABLE);
}
另需要设计定时器3的中断优先级
程序经本人亲自测试,没有问题,此处不再赘述此处可以进一步探讨定时器在循环过程中的误差会是多大?误差的原因有,while循环里面程序自减消耗时间,时钟信号的不稳定,以及其他的一些软、硬件原因。由此可以延伸到原子哥用滴答定时器写的延时函数误差最大是多少?滴答定时器与普通定时器的定时函数有哪些优缺点等。。。
欢迎大家进一步讨论
* @brief TIM3 定时器3中断处理程序
*/
#define SYS_TIMER_IRQ_FUN TIM3_IRQHandler //定时器中断服务函数名称
volatile u16 DelayTime; //volatile是为了防止编译器进行优化
void SYS_TIMER_IRQ_FUN(void)
{
if(bTIM_SR_UIF(bSYS_TIMERx)) //如果发生溢出中断(每毫秒1次)
{
bTIM_SR_UIF(bSYS_TIMERx)=0;
if(DelayTime)DelayTime--;
}
}
http://www.openedv.com/forum.php?mod=viewthread&tid=294788
一周热门 更多>