OpenEdv-开源电子网

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

定时3中断函数问题,总是出现5次左右的类似复位状况。

[复制链接]

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
发表于 2011-10-15 16:58:55 | 显示全部楼层 |阅读模式
实现目的:在定时中断函数中翻转电平引脚,并对翻转次数减1,减数变量在main初始化时设置,因此当中断函数中的变量减为0时 停止翻转。
问题:翻转次数正确,将每次正确的翻转次数 重复5遍 左右(我称这种现象为类似复位),除定时中断代码改过,没有任何代码更改过,帖出,求解。!!!!!!!

void TIM3_IRQHandler(void)

   
  k=1;//第一次进入中断的标志          
 if((k==1)&&(TIM3->SR&0X0001))//溢出中断
 {
  
  if(c>=1)
  {
   puls_pcs++;
     if(puls_pcs==1)
    { 
    GPIOA->BSRR |=0X00000010;//置位
    }
   else if(puls_pcs==2)
   {
   
    GPIOA->BRR |=0X0010;//复位
    puls_pcs=0; 
    c=c-1; //计数-1;
   }
  }
                              
 }      
   TIM3->SR &=0x0000;//清除中断标志位
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-16 00:16:31 | 显示全部楼层
回复【楼主位】xiangzi28:
---------------------------------
软件仿真一下即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
 楼主| 发表于 2011-10-17 08:34:25 | 显示全部楼层
老板,关键问题就在这,用keil u3仿真没有任何问题,但下载到板子上就会出现类似问题,如果可以的话,联系一下我把程序全部发给你,你自己测试看看。绝对真实,QQ562229812
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-17 08:40:12 | 显示全部楼层
回复【3楼】xiangzi28:
---------------------------------
你把代码发论坛(注意去掉那些垃圾文件,否则会比较大。),我帮你看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
 楼主| 发表于 2011-10-17 17:21:24 | 显示全部楼层
主函数程序
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
//#include "key.h"
//#include "exti.h"
//#include "wdg.h"
#include "timer.h"    
//Mini STM32开发板范例代码7
//定时器中断 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
u8 c=100;//计数脉冲个数  
u8 k=0;//初始化装载标志位 
u8 puls_pcs=0;//发送每个脉冲的标志
int main(void)
{
  Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
uart_init(72,9600);  //串口初始化 
LED_Init();     //初始化与LED连接的硬件接口
Timerx_Init(500,1439);//   
while(1)
{
//LED0=!LED0;
// delay_ms(200);    
}  
}

定时器3中断函数
#include "timer.h"
#include "led.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////  
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//Mini STM32开发板
//通用定时器 驱动代码    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2010/12/03
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 正点原子 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////    

extern u8 c;//计数脉冲个数  
extern u8 k; 
extern u8 puls_pcs;//
//定时器3中断服务程序  
void TIM3_IRQHandler(void)
{  
   
 k=1;//第一次进入中断的标志        
if((k==1)&&(TIM3->SR&0X0001))//溢出中断
{

if(c>=1)
{
puls_pcs++;
   if(puls_pcs==1)
 {
 GPIOD->BSRR |=0X00000004;//置位PD.2;
 }
else if(puls_pcs==2)
{

 GPIOD->BRR |=0X0004;//复位PD.2;
 puls_pcs=0; 
 c=c-1; 
}
}
                   
}    
   TIM3->SR &=0x0000;//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//TIM3时钟使能    
  TIM3->ARR=arr;  //设定计数器自动重装值//刚好1ms    
TIM3->SC=psc;  //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0;   //允许更新中断
TIM3->DIER|=1<<6;   //允许触发中断
TIM3->CR1 =0X0090;//向下计数

TIM3->EGR |=0X0001;//产生更新时间 初始化计数器,硬件自动复位;
TIM3->CNT =500;//写500至TIM3的计数器中
// delay_ms(1);
// TIM3->EGR &=0Xfffe;//产生更新时间 初始化计数器;
   
TIM3->CR1|=0x0001;    //使能定时器3

   MY_NVIC_Init(1,1,TIM3_IRQChannel,2);//抢占1,子优先级3,组2  
}














回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
 楼主| 发表于 2011-10-17 17:23:26 | 显示全部楼层
其他代码都没动,
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-10-17 17:36:54 | 显示全部楼层
回复【楼主位】xiangzi28:
---------------------------------
没看懂问题,请详细描述下:
问题:翻转次数正确,将每次正确的翻转次数 重复5遍 左右(我称这种现象为类似复位),除定时中断代码改过,没有任何代码更改过,帖出,求解。!!!!!!!

void TIM3_IRQHandler(void)
{  
    
  k=1;//第一次进入中断的标志 -----------------------------------------------------------这个有什么用?          
 if((k==1)&&(TIM3->SR&0X0001))//溢出中断-------------------------------------------------每次赋值,然后判断,没意义。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-10-17 17:48:54 | 显示全部楼层
看到你的程序是发送一个占空比一半的100个脉冲,没有找到哪有“5”,5次是什么意思。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
 楼主| 发表于 2011-10-17 23:05:42 | 显示全部楼层
呵呵,楼上你没理解我的意思,程序是没有任何问题,但是板子做出来的现象就是好像复位5次了,肯定是进行了5次初始化,也就意味5次复位咯。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-18 10:15:05 | 显示全部楼层
回复【9楼】xiangzi28:
---------------------------------
那你用软件仿真,跟踪过没有?
就是完全软仿真,不用硬件.跟踪中断进入的次数是否正确???
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-10-18 17:11:10 | 显示全部楼层
以下是我的猜测!!
你进入中断的判断是这样写的:“if((k==1)&&(TIM3->SR&0X0001))”
但是运行的时候它其实没有时时查看(TIM3->SR&0X0001)的值,只是第一次查看了一下,之后就记住了,然后判断完(k==1),就决定进入中断。。
可以这样验证一下:在前边合适的地方加一个
volatile bool temp;
temp=(bool)(TIM3->SR&0X0001);
if((k==1)&&temp)
……

呵呵呵
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
 楼主| 发表于 2011-10-18 19:00:06 | 显示全部楼层
呵呵,上电启动时会发生这种情况,复位就没有这种情况,而且仿真没有这种现象,所以才会怀疑板子的问题。,并非是人为的。注意:上电启动时会发生这种情况,复位就没有这种情况!!!!!!!!!
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-10-18 20:21:16 | 显示全部楼层
那就不是个问题了,之前的5次反转是由于配置之前的IO口不稳造成的。。。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-10-18 23:36:28 | 显示全部楼层
回复【12楼】xiangzi28:
---------------------------------
属于正常情况。
每次上电,PL2303和电脑建立连接,此过程中DTR和RTS不稳定,导致STM32复位4次左右。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2011-10-15
在线时间
31 小时
 楼主| 发表于 2011-10-19 07:38:04 | 显示全部楼层
好那我清楚了,哎 这问题开始以为自己的问题,结贴!!!!!!大家在测试的时候尽量以复位为准。
回复 支持 反对

使用道具 举报

27

主题

259

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
387
金钱
387
注册时间
2014-8-19
在线时间
0 小时
发表于 2014-10-10 22:31:59 | 显示全部楼层
回复【7楼】sixear:
---------------------------------
确实啊,我看不懂此处K之意义
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 10:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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