OpenEdv-开源电子网

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

新手帖,定时器3里操作流水灯,程序已经调成功,但是还有疑问,请教原子大哥。

[复制链接]

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
发表于 2012-10-26 17:02:19 | 显示全部楼层 |阅读模式

#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"    
#include "delay.h"  
#include "led.h"  
#include "key.h"
#include "timer.h"
#include "smg.h"         
//Mini STM32 开发板范例代码 3
// 串口实验
// 正点原子@ALIENTEK
//2010.5.28
//u16 shu;   
int main(void)
{   
 Stm32_Clock_Init(9); // 系统时钟设置
 delay_init(72);      //延时初始化
// uart_init(72,9600);  //串口初始化,此时没有用到 
// LED_Init();          //初始化与 LED 连接的硬件接口
// Timerx_Init(5000,7199);//10Khz 的计数频率,计数到 5000 为500ms 500毫秒进一次中断 亮灭一次为1毫秒
 display_Init(); //PA初始化
 while(1)
 {
  LED07=1;
  LED00=0;
  delay_ms(1000);
  LED00=1;
  LED01=0;
  delay_ms(1000);
  LED01=1;
  LED02=0;
  delay_ms(1000);
  LED02=1;
  LED03=0;
  delay_ms(1000);
  LED03=1;
  LED04=0;
  delay_ms(1000);
  LED04=1;
  LED05=0;
  delay_ms(1000);
  LED05=1;
  LED06=0;
  delay_ms(1000);
  LED06=1;
  LED07=0;
  delay_ms(1000);         
 }
}

为什么上面这个程序就能实现八个led灯循环点亮,
而下面这个程序就不可以呢? 在定时器3中断里面操作GPIOA->ODR|=0<<temp;

求原子大哥指导!!!
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"    
#include "delay.h"  
#include "led.h"  
#include "key.h"
#include "timer.h"
#include "smg.h"         
//Mini STM32 开发板范例代码 3
// 串口实验
// 正点原子@ALIENTEK
//2010.5.28
u16 shu;   
int main(void)
{   
 Stm32_Clock_Init(9); // 系统时钟设置
 delay_init(72);      //延时初始化
// uart_init(72,9600);  //串口初始化,此时没有用到 
// LED_Init();          //初始化与 LED 连接的硬件接口
 Timerx_Init(5000,7199);//10Khz 的计数频率,计数到 5000 为500ms 500毫秒进一次中断 亮灭一次为1毫秒
 display_Init(); //PA初始化
 while(1)
 {          
 }
}

void TIM3_IRQHandler(void)
{  
 u8 shu,temp;                      
 if(TIM3->SR&0X0001)//溢出中断,数据手册305页
 {
  shu++;//LED1=!LED1;
  if(shu==2)
  {
   shu=0;
   emp++;  
   GPIOA->ODR|=0<<temp;
  }   
 }       
 TIM3->SR&=~(1<<0);//清除中断标志位      
}

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

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
 楼主| 发表于 2012-10-26 17:05:59 | 显示全部楼层
在定时器3里这样操作不行么?还是我哪里错了? 
void TIM3_IRQHandler(void) 
{   
 u8 shu,temp;                       
 if(TIM3->SR&0X0001)//溢出中断,数据手册305页 
 { 
  shu++;//LED1=!LED1;
  if(shu==2)
  {
   shu=0;
   temp++;
   GPIOA->ODR|=0<<temp;
  }    
 }        
 TIM3->SR&=~(1<<0);//清除中断标志位       

回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2011-9-4
在线时间
0 小时
发表于 2012-10-26 17:07:13 | 显示全部楼层
GPIOA->ODR|=0<<1;
改为
GPIOA->ODR=1<<shu;
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
 楼主| 发表于 2012-10-26 17:09:39 | 显示全部楼层
回复【3楼】DGZL:
---------------------------------
刚才 复制错了,我又设了个变量temp  
GPIOA->ODR|=0<<temp; 
因为我自己搭了八个led灯,IO口给低电平灯才亮

这样写led灯没有反应,按照最上面那个写法led就正常一个一个的点亮
回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2011-9-4
在线时间
0 小时
发表于 2012-10-26 17:13:35 | 显示全部楼层
GPIOA->ODR=~(1<<shu);
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
 楼主| 发表于 2012-10-26 17:18:19 | 显示全部楼层
回复【5楼】DGZL:
---------------------------------
不灵!还是没反应,再请教下GPIOA->ODR=~(1<<shu);和GPIOA->ODR=0<<shu; 在程序里得到的结果不一样么?>
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-26 18:04:57 | 显示全部楼层
4楼是正解,还是没反应的话,就不应该了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
 楼主| 发表于 2012-10-27 08:02:57 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
哦,之前改错了,不过改成GPIOA->ODR=~(1<<shu); 改成这个以后只有第一个灯一直亮着(shu一直等于0),貌似没有实现循环>
我试着把shu改成1、2、3、4、5、6、7也能实现对应的灯亮起GPIOA->ODR=~(1<<1)、GPIOA->ODR=~(1<<2)。。。。。。
,为什么把shu当做变量在定时器中++就不行呢?!
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2012-8-28
在线时间
4 小时
 楼主| 发表于 2012-10-27 09:29:39 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,这个程序调出来了,可是为什么呢?shu++不能这么操作么???
我改成下面这个程序,流水灯就动起来了!我不太明白是怎么回事,能帮我解答下不?
void TIM3_IRQHandler(void)
{  
 static u8 shu;                     
 if(TIM3->SR&0X0001)//溢出中断,数据手册305页
 {
  LED1=!LED1;
  GPIOA->ODR=~(1<<shu);
  shu=shu+1;
  if(shu==8)
  {
   shu=0;
  }
 }
       
 TIM3->SR&=~(1<<0);//清除中断标志位      
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-27 10:52:08 | 显示全部楼层
回复【9楼】whomcfly:
---------------------------------
你软件仿真,看看shu的值就知道了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-10-29
在线时间
0 小时
发表于 2013-10-29 16:10:24 | 显示全部楼层
请把源码贴上吧,谢谢了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 15:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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