OpenEdv-开源电子网

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

我想实现对外部脉冲技术,开发板是stm32f103zet6,可是怎么都实现不了,大神求助,后天都要交了,呜呜呜!

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-3
在线时间
2 小时
发表于 2016-1-3 11:22:31 | 显示全部楼层 |阅读模式
2金钱
我按照网上找的一个程序,自己有修改,利用TIM4-CH2输出pwm脉冲,用TIM2-ETR对这个脉冲计数,在LCD屏上显示计数的值,但是显示一直为0,我都自己一边学习,一边修改,弄了一周了,实在做不出来,只能来请教各位大神了,求帮助!
代码如下:
#include "stm32f10x.h"

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"

//EXTI_InitTypeDef EXTI_InitStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
void RCC_Configuration(void);
void GPIO_Configuration(void);
//void NVIC_Configuration(void);
void Delay(__IO uint32_t nCount);
void tim2_confi(void);
void tim4_confi(void);

u16 counter=0;

int main(void)
{
        vu8 key=0;
//        u8 i=0;
  /* System Clocks Configuration */
  RCC_Configuration();

  /* NVIC configuration */
  //NVIC_Configuration();

  /* Configure the GPIO ports */
  GPIO_Configuration();
  /*Configure tim1*/
  tim2_confi();
  tim4_confi();
       
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
        uart_init(115200);                 //′®¿ú3õê¼»ˉÎa115200
        LED_Init();       
        LCD_Init();
        KEY_Init();   
        POINT_COLOR=RED;
        LCD_Clear(BLACK);
        LED0=0;       

  while (1)
  {       
                Delay(10000);  //1ms
                TIM_Cmd(TIM2, ENABLE);
                //TIM_Cmd(TIM4, ENABLE);
                Delay(10000);  //1ms
                TIM_Cmd(TIM4, DISABLE);
                TIM_Cmd(TIM2, DISABLE);
        counter=TIM_GetCounter(TIM2);
               
                key=KEY_Scan(0);        //μÃμ½¼üÖμ
                   if(key==KEY0_PRES)       
                        {LED0=!LED0;}
                       
        LCD_ShowString(30,40,100,24,24,"count:");
        LCD_ShowNum(100,40,counter,10,24);
       
        }

}

void Delay(__IO uint32_t nCount)   //0.1us
{
  for(; nCount != 0; nCount--);
}


void RCC_Configuration(void)
{
  SystemInit();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);          //TIM2
}

/*
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //ÏèÕ¼óÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óóÅÏè¼¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //3õê¼»ˉNVIC¼Ä′æÆ÷

}
*/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);          //TIM2

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //  PA.0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO=50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //

       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);          //TIM4
  //GPIO_PinRemapConfig (GPIO_Remap_TIM4  ,ENABLE );          //
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7 ;            //PB.7
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
}

void tim2_confi(void)          //TIM2
{       
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_DeInit( TIM2 ) ;
  /* Time Base configuration */
        TIM_TimeBaseStructure.TIM_Period = 0XFFFF;         //
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
          TIM_TimeBaseStructure.TIM_ClockDivision = 0;
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
          TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        /* TIM2-ETR Configuration */
         //TIM_ITRxExternalClockConfig(TIM2,TIM_TS_ETRF); //?????????????????????
   //TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);//??TIMx???????
          TIM_ETRClockMode2Config (TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);
//         TIM_ExtTRGPolarity_NonInverted;//TIMía2¿¼«DÔéÏéyÑØ¡¢¸ßμçÆ½óDD§
                TIM_SetCounter( TIM2,0)        ; //
                TIM_Cmd(TIM2, DISABLE);        //
}

void tim4_confi(void)          //TIM4
  {
// TIM4-CH2(PWM)
// ??=TIM1_CLK/(ARR+1)
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;
    TIM_DeInit( TIM4 ) ;
    TIM_BaseInitStructure.TIM_Period = 100;                                  // ??T=0.1ms
    TIM_BaseInitStructure.TIM_Prescaler = 72-1;  
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM4, &TIM_BaseInitStructure);
//??ARR??????(?????????????)
        TIM_ARRPreloadConfig(TIM4, ENABLE);
               
        TIM_ITConfig( TIM4,TIM_IT_Update  |  TIM_IT_Trigger,  ENABLE  ); //ê1ÄüÖ¸¶¨μÄTIM3ÖD¶Ï,ÔêDí¸üDÂÖD¶Ï
        //ÖD¶ÏóÅÏè¼¶NVICéèÖÃ
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3ÖD¶Ï
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //ÏèÕ¼óÅÏè¼¶0¼¶
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //′óóÅÏè¼¶3¼¶
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
        NVIC_Init(&NVIC_InitStructure);  //3õê¼»ˉNVIC¼Ä′æÆ÷
//TIM4_OC2????
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_Pulse = 50;
        TIM_OC2Init(TIM4, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
        //TIM4??
        TIM_Cmd(TIM4, DISABLE);
        //TIM4_OC????PWM(????)
        TIM_CtrlPWMOutputs(TIM4, ENABLE);

  }
void TIM4_IRQHandler(void)   //TIM3??
{
     TIM_Cmd(TIM2, DISABLE);
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //?????TIM??????:TIM ???
{
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //??TIMx???????:TIM ???
}

}

       
#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{

  while (1)
  {
  }
}
#endif


芯片引脚图

芯片引脚图
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-3
在线时间
2 小时
 楼主| 发表于 2016-1-3 11:23:40 | 显示全部楼层
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-3
在线时间
2 小时
 楼主| 发表于 2016-1-3 11:39:44 | 显示全部楼层
主函数里面 这句 没有注释掉:TIM_Cmd(TIM4, ENABLE);
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-3
在线时间
2 小时
 楼主| 发表于 2016-1-3 11:40:55 | 显示全部楼层
我主要是想在一定时间内 实现对外部脉冲计数功能,但是后来用IO口直接输出高低电平也没有计数,到底是哪儿不对?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-3
在线时间
2 小时
 楼主| 发表于 2016-1-3 11:59:46 | 显示全部楼层
代码如下:
#include "stm32f10x.h"

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"


TIM_OCInitTypeDef  TIM_OCInitStructure;
void RCC_Configuration(void);
void GPIO_Configuration(void);

void Delay(__IO uint32_t nCount);
void tim2_confi(void);
void tim4_confi(void);

u16 counter=0;

int main(void)
{
        vu8 key=0;

  /* System Clocks Configuration */
  RCC_Configuration();
      
      
  /* Configure the GPIO ports */
  GPIO_Configuration();
  /*Configure tim1*/
  tim2_confi();
  tim4_confi();
       
        delay_init();                     //延时函数初始化          
        uart_init(115200);                 //串口初始化为115200
        LED_Init();       
        LCD_Init();
        KEY_Init();   
        POINT_COLOR=RED;
        LCD_Clear(BLACK);
        LED0=0;       

  while (1)
  {       
                Delay(10000);  //1ms
                TIM_Cmd(TIM2, ENABLE);
                TIM_Cmd(TIM4, ENABLE);
                Delay(10000);  //1ms
                TIM_Cmd(TIM4, DISABLE);
                TIM_Cmd(TIM2, DISABLE);
        counter=TIM_GetCounter(TIM2);
               
                key=KEY_Scan(0);        //得到键值
                   if(key==KEY0_PRES)       
                        {LED0=!LED0;}
                       
        LCD_ShowString(30,40,100,24,24,"count:");
        LCD_ShowNum(100,40,counter,10,24);
       
        }

}

void Delay(__IO uint32_t nCount)   //0.1us
{
  for(; nCount != 0; nCount--);
}


void RCC_Configuration(void)
{
  SystemInit();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);          //TIM2
}


void GPIO_Configuration(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);         //
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);          //TIM2

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                 //  PA.0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;          //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO=50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //

       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);          //TIM4

  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7 ;            //PB.7
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
}

void tim2_confi(void)          //TIM2
{       
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_DeInit( TIM2 ) ;
  /* Time Base configuration */
        TIM_TimeBaseStructure.TIM_Period = 0XFFFF;         //
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
          TIM_TimeBaseStructure.TIM_ClockDivision = 0;
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
          TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        /* TIM2-ETR Configuration */
         
          TIM_ETRClockMode2Config (TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);
//         TIM_ExtTRGPolarity_NonInverted;//TIM外部极性上升沿、高电平有效
                TIM_SetCounter( TIM2,0)        ; //
                TIM_Cmd(TIM2, DISABLE);        //
}

void tim4_confi(void)          //TIM4
  {
// TIM4-CH2(PWM)

    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
                NVIC_InitTypeDef NVIC_InitStructure;
    TIM_DeInit( TIM4 ) ;
    TIM_BaseInitStructure.TIM_Period = 100;                                  // ??T=0.1ms
    TIM_BaseInitStructure.TIM_Prescaler = 72-1;  
    TIM_BaseInitStructure.TIM_ClockDivision = 0;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_BaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM4, &TIM_BaseInitStructure);
//??ARR??????(?????????????)
        TIM_ARRPreloadConfig(TIM4, ENABLE);
               
        TIM_ITConfig( TIM4,TIM_IT_Update  |  TIM_IT_Trigger,  ENABLE  ); //使能指定的TIM3中断,允许更新中断
        //中断优先级NVIC设置
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
//TIM4_OC2????
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OCInitStructure.TIM_Pulse = 50;
        TIM_OC2Init(TIM4, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
        //TIM4??
        TIM_Cmd(TIM4, DISABLE);
        //TIM4_OC????PWM(????)
        TIM_CtrlPWMOutputs(TIM4, ENABLE);
  
  }
void TIM4_IRQHandler(void)   //TIM3??
{
     TIM_Cmd(TIM2, DISABLE);
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
}

}

       
#ifdef  USE_FULL_ASSERT

void assert_failed(uint8_t* file, uint32_t line)
{

  while (1)
  {
  }
}
#endif
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-1-3 12:30:49 | 显示全部楼层
先分开实现功能,确定功能都独立实现后再结合到一起.....
检查大量代码是需要自己去反复测试、调试的.....
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-3
在线时间
2 小时
 楼主| 发表于 2016-1-3 13:49:15 | 显示全部楼层
但是我,这里没有信号发生器,准确说是没有线把信号发生器输出的信号连到开发板,
回复

使用道具 举报

30

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-8-24
在线时间
241 小时
发表于 2016-1-3 14:21:47 | 显示全部楼层
我觉得你还是用例程来移植最好了。原子哥写的好操作多了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 23:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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