OpenEdv-开源电子网

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

啃求利用通过STM32定时器的外部脉冲计数功能的参考程序

[复制链接]

100

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2013-8-9
在线时间
3 小时
发表于 2013-8-14 00:13:08 | 显示全部楼层 |阅读模式
恳求利用通过STM32定时器的外部脉冲计数功能的参考程序
STM32初学者,望多指教
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

4

主题

116

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2013-7-24
在线时间
13 小时
发表于 2013-8-14 08:21:32 | 显示全部楼层
void Timer2_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
    
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  计数到5000为500ms arr
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率    
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设0置时钟分割:TDTS = Tck_tim    psc
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);   //使用外部计数
TIM_SetCounter(TIM2, 0);  //计数器清零
TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设
 
}
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-7-24
在线时间
0 小时
发表于 2013-8-14 08:44:14 | 显示全部楼层
u16 Colour_num=0;   // 用于颜色传感器脉冲计数
u8  Time3_flag=0;                                 // 定时器中断标志

/*==============================以下为定时器3程序部分=================================*/
/*定时器3中断服务函数*/
void TIM3_IRQHandler(void)
{  
if(TIM3->SR & 0X0001) { //溢出中断
    TIM3->SR &= 0xFFFE; //清除中断标志位   
  Time3_flag = 1;
  EXTI->IMR &= 0xFFFFBFFF; //关闭外部中断0
  TIM3->CR1 &= 0XFFFE; //关闭定时器3
    } 
}

/**********************************************
函数名称:Timer3_Init
函数功能:通用定时器3中断初始化
入口函数:arr(自动重装值)
          psc(时钟预分频数)
返回参数:无
备注:时钟为2倍APB1(36M)
溢出时间(MS)=(arr*(psc+1))/输入时钟频率(72MHZ) 

***********************************************/
void Timer3_Init(u16 arr,u16 psc)
{
     RCC->APB1ENR |= 1<<1; //使能TIM3时钟
     TIM3->ARR = arr; //设置计数器自动重装值(0.1ms)
     TIM3->SC = psc; //预分频器7200,刚好10khz
     TIM3->DIER |= 1<<0;  //允许更新中断
     TIM3->DIER |= 1<<6;  //允许触发中断
     TIM3->CR1 &= 0XFFFE; //失能定时器3
//  TIM3->CR1 |= 1<<0; //使能定时器3
}

/*=============================以下为外部中断14程序部分=================================*/
/*外部中断14服务程序*/
void EXTI15_10_IRQHandler(void)
{
u32 Temp;
Temp = EXTI->R;//取读是哪个引脚的中断
if((Temp>>14)&0x01) {     
    EXTI->R = 1<<14; //清除line14上的中断标志位
Colour_num++;
}
}

/******************************************************************************
* 函数名       TCS230_EXTI_Configuration(void)
* 描述         配置EXTI线 (使中断线和IO针脚线连接上)
* 输入         无 
* 输出         无
* 返回值       无
******************************************************************************/

void TCS230_EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;       
// 连接IO口到中断线 
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//外部中断EXTI14(Out)
   // 配置EXTI出现上升沿,则产生中断   
   EXTI_InitStructure.EXTI_Line = EXTI_Line14;
   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//“上升沿”中断
   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
   EXTI_Init(&EXTI_InitStructure);
}

/*
********************************************************************************
** 函数名称 : TCS230_NVIC_Configuration(void)
** 函数功能 : 中断初始化
** 输    入 : 无
** 输    出 : 无
** 返    回 : 无
********************************************************************************
*/
void TCS230_NVIC_Configuration(void)

NVIC_InitTypeDef NVIC_InitStructure;   
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  

   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;    //更新事件
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1 
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;    //响应优先级0
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
   NVIC_Init(&NVIC_InitStructure);    //写入设置

   NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;    //更新事件
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级1 
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    //响应优先级1
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //允许中断
   NVIC_Init(&NVIC_InitStructure);    //写入设置  
}

/**********************************************************
 函数名称:TCS230_Init
 函数功能:TCS230初始化
 入口参数:无
 返回参数:无
 备    注:初始化外部中断14及定时器中断3及相关I/O口设置
**********************************************************/ 
void TCS230_Init(void)
{
RCC->APB2ENR |= 1<<0; //使能AFIO时钟
RCC->APB2ENR |= 1<<3;  //使能GPIOB时钟      

/* Configure TCS230 pins: OUT-PB14, S0-PB12, S1-PB11, S2-PB13, S3-PB10 */
//OUT-浮空输入;0S0~S4-推挽输出,50HMz
GPIOB->CRH &= 0xF00000FF;
GPIOB->CRH |= 0x04333300;
GPIOB->BSRR |= 1<<10;
GPIOB->BSRR |= 1<<11;
GPIOB->BSRR |= 1<<12;
GPIOB->BSRR |= 1<<13;
 
Timer3_Init(40,7199); //4ms
TCS230_EXTI_Configuration();
TCS230_NVIC_Configuration();
}
/***********************************************
 函数名称:Colour_Init
 函数功能:TCS230内部颜色滤波器设置
 入口参数:Colour
 返回参数:无
 备    注:Colour 选择颜色(Red1/Blue1/Green1)
************************************************/ 
void Colour_Init(u8 Colour)
{
switch(Colour)
 {
  case Red1: TCS32_S2 = 0;TCS32_S3 = 0; break;
case Blue1: TCS32_S2 = 0;TCS32_S3 = 1; break;
case Green1: TCS32_S2 = 1;TCS32_S3 = 1; break;
default : break;
 }
}

/**********************************************************
 函数名称:TCS230_Start
 函数功能:初始化各变量及定时器3、外部中断14,用于脉冲计数
 入口参数:无
 返回参数:无
**********************************************************/ 
void TCS230_Start(void)
{
Colour_num = 0; //计数清零
Time3_flag = 0;  //定时器标志清零
TIM3->CR1 |= 0X01; //使能定时器3
EXTI->IMR |= 1<<14; //开启外部中断14
}
回复 支持 反对

使用道具 举报

100

主题

208

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2013-8-9
在线时间
3 小时
 楼主| 发表于 2013-8-15 19:39:33 | 显示全部楼层
哈哈,谢谢
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-4-9
在线时间
0 小时
发表于 2014-5-6 09:53:34 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
哪里有啊 没有找到啊原子哥
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-6 14:10:28 | 显示全部楼层
 回复【6楼】 我该去向何处 :
---------------------------------
论坛搜:脉冲计数.
就找到答案了,你找资料的能力亟待加强.
http://www.openedv.com/posts/list/16962.htm

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 21:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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