打印
[STM32F1]

同个GPIO端口不能用两个函数输出不同的脉冲?

[复制链接]
1781|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiashijiang|  楼主 | 2014-11-23 17:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   想用同一个GPIO端口的不同引脚输出不同频率的脉冲,用两个函数配置输出,结果只有一个输出,还是默认的Pin_0脚,怎么回事?

   具体的来说,我本打算用函数GPIO_Pulse_1()让PB0输出1KHz的脉冲,用GPIO_Pulse_2()让PB1、PB2输出5KHz的脉冲,结果只有GPIO_Pulse()让PB0输出1KHz的脉冲,PB1、PB2没输出脉冲。当不用两个函数输出,把PB0、PB1、PB2同时放在一个函数GPIO_Pulse_3(),则3路都有脉冲输出。为什么用两个函数就不能输出3路脉冲?觉得莫名其妙,不应该是这个样子呀,而且也不合理,请教!

  下面是具体的代码,帮忙分析分析


int main(void)
{
   Pulse_GPIO_Config();
       
       

   Enc_PulseOut(1000);
         GPIO_PulseOut(1000);
         
        while(1);
}


/****************配置GPIO_PB0/1/2,输出脉冲******************/
void Pulse_GPIO_Config(void)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;                     
       
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);   
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);

}



void GPIO_PulseOut(uint16_t n)   //本来想模拟编码器正交脉冲信号
{
        for(;n>0;n--)
         {

                 GPIO_SetBits(GPIOB,GPIO_Pin_1);
                 delay(0x7FF);
                 GPIO_SetBits(GPIOB,GPIO_Pin_2);
                 delay(0x7FF);
     GPIO_ResetBits(GPIOB,GPIO_Pin_1);       
     delay(0x7FF);         
     GPIO_ResetBits(GPIOB,GPIO_Pin_2);
     delay(0x7FF);       
         }                 
}

void Enc_PulseOut(uint16_t m)
{
        for(;m>0;m--)
         {

                 GPIO_SetBits(GPIOB,GPIO_Pin_0);
                 delay(0xFFF);
     GPIO_ResetBits(GPIOB,GPIO_Pin_0);
     delay(0xFFF);       
                }       
}


void delay(uint32_t n)
{
  for(;n>0;n--);
          
}
沙发
jiashijiang|  楼主 | 2014-11-23 18:34 | 只看该作者
我自己顶一个,用Keil仿真只能得到一个1路的脉冲,而且是PB0的那1路

使用特权

评论回复
板凳
icecut| | 2014-11-23 19:02 | 只看该作者
本来你程序就写的不是同时输出.
c 语言是串行的

使用特权

评论回复
地板
mmuuss586| | 2014-11-23 20:28 | 只看该作者

程序跟踪下,看有没有执行到,是不是被优化了;

使用特权

评论回复
5
jiashijiang|  楼主 | 2014-11-23 21:42 | 只看该作者
谢谢mmuuss586的指点,现在又对了,3路都能输出脉冲了,搞不清楚啥情况!

使用特权

评论回复
6
小班儿| | 2014-11-23 22:17 | 只看该作者
你这程序就是PB0先输出1000个脉冲,然后PB1和PB2在输出1000个脉冲,然后就进入while循环了!

使用特权

评论回复
7
小班儿| | 2014-11-23 22:19 | 只看该作者
用延时来做不能保证频率的精度

使用特权

评论回复
8
sedatefire| | 2014-11-23 22:29 | 只看该作者
小班儿 发表于 2014-11-23 22:17
你这程序就是PB0先输出1000个脉冲,然后PB1和PB2在输出1000个脉冲,然后就进入while循环了! ...

没错,就是上电能够量到一次波形而已
然后就没了

使用特权

评论回复
9
sedatefire| | 2014-11-23 22:33 | 只看该作者
5KHz,200us,差不多是100us翻转一次?
你最好配置成PWM的好了

至于PB0, 1KHZ,放在500us定时中断吧

使用特权

评论回复
10
請放心遠行!| | 2014-11-24 07:27 | 只看该作者
小班儿 发表于 2014-11-23 22:17
你这程序就是PB0先输出1000个脉冲,然后PB1和PB2在输出1000个脉冲,然后就进入while循环了! ...

正解

使用特权

评论回复
11
lyn3210| | 2014-11-24 17:21 | 只看该作者
用位域区操作.

使用特权

评论回复
12
jiashijiang|  楼主 | 2014-11-25 21:43 | 只看该作者
我用软件方正能看见脉冲输出。找打原因了,配置什么的都没有问题,是前一个函数脉冲数发得太多,后一个函数的脉冲还没来得急发出,我就停止仿真了。是我的耐性不够啊!
谢谢以上给位的解答!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

44

帖子

0

粉丝