OpenEdv-开源电子网

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

想用TIM4当计数器使用,结果得不到正确的数据,请帮忙看看,谢谢

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-11-22
在线时间
0 小时
发表于 2011-11-22 13:44:52 | 显示全部楼层 |阅读模式

想用TIM4当计数器使用,结果得不到正确的数据,请帮忙看看,谢谢。

#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
   
int main(void)
{
u16 b1;   
  Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 uart_init(72,9600);  //串口初始化

 //初始化PE0
 RCC->APB2ENR|=1<<6;      //使能PORTE时钟
 GPIOE->CRL&=0XFFFFFFF0;//PE0  TIM4使用PE0输入
 GPIOE->CRL|=0X00000008;//8为上下拉输入(PXODR=0下拉,PXODR=1上拉)   
 GPIOE->ODR|=1<<0;//PE0上拉

 //初始化TIM4为外部时钟输入
 RCC->APB1ENR|=1<<2;//TIM4时钟使能   bit0-5对应TIM2-7的时钟使能     
 TIM4->ARR=0XFFFF; 
 TIM4->SMCR=(3<<14);  //BIT14=1启动外部输入 下降沿记数 不分频                  
 TIM4->CR1|=1<<1;//禁止UEV更新事件
 TIM4->CR1|=0x01;    //使能定时器4

 ////初始化PD0   PD0做TIM4记数输入
 RCC->APB2ENR|=1<<5;      //使能PORTD时钟
 GPIOD->CRL&=0XFFFFFFF0; //PD.0
 GPIOD->CRL|=0X00000003;//PD0推挽输出时钟50MHZ
 GPIOD->ODR|=1;      //PD0输出高   pd0做TIM4记数输入

    while(1)
 {
  delay_us(100);
  Dout(0)=!PDout(0);//翻转PD0   pd0做TIM4记数输入
  b1++;
    
  //当翻转0X3FF次后发送 TIM4的记数值  应该为0X3FF/2=1FF
  if(b1==0x3ff)
  { 
   putchar(TIM4->CNT>>8); //通过串口1输出高8位数据
   putchar(TIM4->CNT); //通过串口1输出低8位数据
   //结果接收到的数据是错误的
   TIM4->CNT=0;  //清除记数
   b1=0;
  }           
 } 
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-22 13:58:37 | 显示全部楼层
回复【楼主位】chw:
---------------------------------
//初始化PE0
 RCC->APB2ENR|=1<<6;      //使能PORTE时钟
 GPIOE->CRL&=0XFFFFFFF0;//PE0  TIM4使用PE0输入
 GPIOE->CRL|=0X00000008;//8为上下拉输入(PXODR=0下拉,PXODR=1上拉)    
 GPIOE->ODR|=1<<0;//PE0上拉
这里应该设置为复用输入吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-11-22
在线时间
0 小时
 楼主| 发表于 2011-11-22 14:17:47 | 显示全部楼层
复用不都是输出吗?  
如何变成输入呢?
8应该改成几呢?
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-11-22 14:28:24 | 显示全部楼层
就应该是0x8吧,对的,0x4也可以。
你的PE0和PD0是连在一起的?用TIM来捕捉PD0的变化,你看看是不是变化太快了,而定时器的时钟很慢。可以设定程序运行1000次反转一次。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-11-22
在线时间
0 小时
 楼主| 发表于 2011-11-22 14:31:36 | 显示全部楼层
0x8与0X00000008是一样的
当然连到一起了
延时了delay_us(100);应该不快吧

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-22 18:14:30 | 显示全部楼层
应该是要设置复用功能的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2011-11-22
在线时间
0 小时
 楼主| 发表于 2011-11-23 13:26:24 | 显示全部楼层
昨天又仔细的研究了一下,
发现当PE0=1时,TIM4->CNT 不计数。
当PE0=0时,TIM4->CNT不停的加1(0到0XFFFF循环)。
事与愿违了,改天再研究他了。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 13:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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