专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
如何在满足一定条件下启动定时器中断
2019-07-20 23:05
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
4089
5
1265
由于想在延时程序(以下程序)执行的时候同时执行其他程序,想把以下程序改成定时器中断,在满足AutoStartCollect==1如何让定时器开始以及停止,请大家指点以下,谢谢
if(AutoStartCollect==1)
{
for(j=0;j<=20;j++)//间隔采集
{
delay_ms(1000);
}
StartCollect=1;
AutoStartCollect=0;
}
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
warship
1楼-- · 2019-07-21 00:13
本帖最后由 warship 于 2019-5-19 20:01 编辑
//配置TIM2为1s产生一次中断,用于定时器使用
void Timer2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;
NVIC_InitTypeDef NVIC_InitTypeStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//72000000/7200=10000=10K
//10Khz的计数频率,每次为1/10K=0.1ms=100us, 计数到10000为1s
TIM_TimeBaseInitTypeStruct.TIM_Prescaler = 7199;//tim2预分频值72000000,即时钟为100us
TIM_TimeBaseInitTypeStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitTypeStruct.TIM_Period = 9999+1; //10000*100us=1s溢出一次
TIM_TimeBaseInitTypeStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct);
NVIC_InitTypeStruct.NVIC_IRQChannel = TIM2_IRQn; //配置定时器中断优先级
NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitTypeStruct);
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); //允许溢出中断
TIM_Cmd(TIM2,DISABLE);
}
void StopMyTimer2(void)
{
TIM_Cmd(TIM2,DISABLE ); //失能定时器2
TIM_ITConfig( TIM2,TIM_IT_Update, DISABLE); //关闭TIM2超时溢出中断
}
void StartMyTimer2(void)
{
TIM_Cmd(TIM2,ENABLE ); //使能定时器2
TIM_ITConfig( TIM2,TIM_IT_Update, ENABLE); //允许TIM2超时溢出中断
}
/****************** 以下为TIM2 的中断服务程序 ******************/
volatile u16 My_Delay_s;
//定时器2中断服务: 每1s中断一次
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update)) //1秒超时溢出
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清超时标志
if(My_Delay_s) My_Delay_s--; else
AutoStartCollect=1;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清超时标志
TIM_Cmd(TIM2,ENABLE);
}
}
加载中...
warship
2楼-- · 2019-07-21 04:55
定时器本来就是你想开就开,
想停就停的。
通过控制你所用定时器TIMx的CR寄存器的CEN位就可以了。
加载中...
七彩旋风
3楼-- · 2019-07-21 06:08
精彩回答 2 元偷偷看……
加载中...
warship
4楼-- · 2019-07-21 10:48
本帖最后由 warship 于 2019-5-19 20:07 编辑
main(void)
{
Timer2_Init();
while(1)
{
My_Delay_s=20;
StartMyTimer2();;;//干其它的工作
if(AutoStartCollect==1)
{
StopMyTimer2();
AutoStartCollect=0;
StartCollect=1;
;//采集一次
}
}
//大致如此,只是给你演示一下如何控制定时器的开关,其实不用开关也可以的。
加载中...
yzm168
5楼-- · 2019-07-21 12:22
精彩回答 2 元偷偷看……
加载中...
一周热门
更多
>
相关问题
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
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
//配置TIM2为1s产生一次中断,用于定时器使用
void Timer2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct;
NVIC_InitTypeDef NVIC_InitTypeStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//72000000/7200=10000=10K
//10Khz的计数频率,每次为1/10K=0.1ms=100us, 计数到10000为1s
TIM_TimeBaseInitTypeStruct.TIM_Prescaler = 7199;//tim2预分频值72000000,即时钟为100us
TIM_TimeBaseInitTypeStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitTypeStruct.TIM_Period = 9999+1; //10000*100us=1s溢出一次
TIM_TimeBaseInitTypeStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct);
NVIC_InitTypeStruct.NVIC_IRQChannel = TIM2_IRQn; //配置定时器中断优先级
NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitTypeStruct);
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); //允许溢出中断
TIM_Cmd(TIM2,DISABLE);
}
void StopMyTimer2(void)
{
TIM_Cmd(TIM2,DISABLE ); //失能定时器2
TIM_ITConfig( TIM2,TIM_IT_Update, DISABLE); //关闭TIM2超时溢出中断
}
void StartMyTimer2(void)
{
TIM_Cmd(TIM2,ENABLE ); //使能定时器2
TIM_ITConfig( TIM2,TIM_IT_Update, ENABLE); //允许TIM2超时溢出中断
}
/****************** 以下为TIM2 的中断服务程序 ******************/
volatile u16 My_Delay_s;
//定时器2中断服务: 每1s中断一次
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update)) //1秒超时溢出
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清超时标志
if(My_Delay_s) My_Delay_s--; else AutoStartCollect=1;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清超时标志
TIM_Cmd(TIM2,ENABLE);
}
}
想停就停的。
通过控制你所用定时器TIMx的CR寄存器的CEN位就可以了。
main(void)
{
Timer2_Init();
while(1)
{
My_Delay_s=20;
StartMyTimer2();;;//干其它的工作
if(AutoStartCollect==1)
{
StopMyTimer2();
AutoStartCollect=0;
StartCollect=1;
;//采集一次
}
}
//大致如此,只是给你演示一下如何控制定时器的开关,其实不用开关也可以的。
一周热门 更多>