微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32GPIO输出高电平,为什么有两个引脚输出不了?

STM32GPIO输出高电平,为什么有两个引脚输出不了?

时间:10-02 整理:3721RD 点击:

  1. #include "pwm.h"
  2. #include "led.h"
  3. //////////////////////////////////////////////////////////////////////////////////         



  4. //PWM输出初始化
  5. //arr:自动重装值
  6. //psc:时钟预分频数
  7. void TIM1_PWM_Init(u16 arr,u16 psc)
  8. {  
  9.         GPIO_InitTypeDef GPIO_InitStructure;
  10.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  11.         TIM_OCInitTypeDef  TIM_OCInitStructure;

  12.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//
  13.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC , ENABLE);  //使能GPIO外设时钟使能
  14.                                                                                     
  15.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  19.         GPIO_SetBits(GPIOC,  GPIO_Pin_6 | GPIO_Pin_7);
  20.        
  21.        
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  26.         GPIO_SetBits(GPIOB,  GPIO_Pin_3 | GPIO_Pin_4);
  27.        
  28.        
  29.    //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH4
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  32.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  33.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  34.        
  35.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K
  36.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
  37.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  38.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  39.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


  40.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  41.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  42.         TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  43.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  44.         TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  45.     TIM_CtrlPWMOutputs(TIM2,ENABLE);        //MOE 主输出使能       

  46.         TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  //CH1预装载使能         
  47.        
  48.         TIM_ARRPreloadConfig(TIM2, ENABLE); //使能TIMx在ARR上的预装载寄存器
  49.        
  50.         TIM_Cmd(TIM2, ENABLE);  //使能TIM1

  51.    
  52. }

  53. #include "led.h"
  54. #include "delay.h"
  55. #include "sys.h"
  56. #include "pwm.h"
  57. //ALIENTEK Mini STM32开发板范例代码8
  58. //PWM输出实验   
  59. //技术支持:www.openedv.com
  60. //广州市星翼电子科技有限公司

  61. int main(void)
  62. {       
  63.         u16 led0pwmval=0;   
  64. //        u8 dir=1;       
  65.         delay_init();                     //延时函数初始化          
  66.         LED_Init();                          //初始化与LED连接的硬件接口
  67.        
  68.         TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
  69.            while(1)
  70.         {
  71.         GPIO_SetBits(GPIOB,  GPIO_Pin_3 | GPIO_Pin_4);
  72.                
  73.                 GPIO_SetBits(GPIOC,  GPIO_Pin_6 | GPIO_Pin_7);
  74.         delay_ms(500);
  75.                 LED0=!LED0;
  76.         led0pwmval=300;
  77.                 TIM_SetCompare2(TIM2,led0pwmval);          
  78.         }
  79. }

复制代码

要使PB3 PB4 PC6 PC7输出高电平,但是只有PB3和PB4可以输出,不知道哪里出问题了,希望大家指点错误,谢谢!

你试试我这个
#include "stm32f10x.h"  
  
GPIO_InitTypeDef GPIO_InitStructure;         //定义GPIO宏操作结构体  
  
void Delay(__IO uint32_t nCount)//__IO的宏定义volatile  
{  
  for(; nCount != 0; nCount--);  
}  
  
/*初始化嵌入式Flash接口,初始化PLL使其达到系统可用频率*/  
void RCC_Configuration(void)  
{     
  /* Setup the microcontroller system. Initialize the Embedded Flash Interface,   
     initialize the PLL and update the SystemFrequency variable. */  
  SystemInit();  
}  
int main()  
{  
        
     int i;  
     RCC_Configuration();   //初始化FLASH及其PLL,系统时钟配置  
      
   
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO,ENABLE);    //外设时钟配置,开启GPIOC的时钟   
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;                          
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将<span style="font-size:14px;">PC6\7\9</span>口配置为通用推挽输出  
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //口线翻转速度为50MHz  
     GPIO_Init(GPIOC, &GPIO_InitStructure);         //配置GPIOC口  
      
      
   
     while(1)  
     {  
         
         GPIO_SetBits(GPIOC, GPIO_Pin_6);           //PC6口输出高电平  
         GPIO_SetBits(GPIOC, GPIO_Pin_7);               //<span style="font-size:14px;">PC7</span>口输出<span style="font-size:14px;">高电平</span>                GPIO_SetBits(GPIOC, GPIO_Pin_9);        //<span style="font-size:14px;">PC9</span>口输出<span style="font-size:14px;">高电平</span>  </span><span style="font-size:14px;">  
              for(i=0;i<1000000;i++);  
     }  
}

谢谢,这个问题已经解决了,把复用推挽输出改成推挽输出就可以了,但是具体原因就不知道了,我猜是因为PC6和PC7上面挂载了定时器的原因吧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top