第一次配置PWM,LED根本没变化

2019-07-21 06:49发布

用#IF不编译其他初始化外设的函数,但是下载了还是变化。(板子STM32F103ZET6)
自己写了一边不行,复制粘贴过来还是不行。





void RCC_Config(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
  {
   RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB时钟(HCLK)为系统时钟
   RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(APB2)为HCLK时钟
   
   
   RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(APB1)为HCLK的2分频
   //(TIM2-TIM5输入TIMxCLK频率将为72MHZ/2x2=72MHZ输入)
   
   FLASH_SetLatency(FLASH_Latency_2);//设置FLASH代码延时
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz
   RCC_PLLCmd(ENABLE);//使能PLL
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL准备就绪
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL为系统时钟源
   while(RCC_GetSYSCLKSource()!=0x08);//判断PLL是否是系统时钟   
  }
}
/*-----------------------
Function name:TIM3_Init
Description:定时器3配置(PWM输出)
Input:None
Output:None
Return:None
-----------------------*/
void TIM3_PWM_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef     GPIO_InitStrue;
    TIM_OCInitTypeDef     TIM_OCInitStrue;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;
   
   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能TIM3和相关GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 使能GPIOB时钟(LED在BP5引脚),使能AFIO时钟(定时器3通道2需要重映射到BP5引脚)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
   
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_5;     // TIM_CH2
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置
   
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
   
    TIM_TimeBaseInitStrue.TIM_Period=arr;    //设置自动重装载值
    TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //预分频系数
    TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出
    TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);        //TIM3初始化设置(设置PWM的周期)
   
    TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2;        // PWM模式2:CNT>CCR时输出有效
    TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效为高电平
    TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
    TIM_OC2Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道2PWM 模式设置
    TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
   
    TIM_Cmd(TIM3,ENABLE);        //使能TIM3
}


这里是主函数的:
int main(void)
{
   u8 i=1;         // 设置方向 0:变暗 1:变亮
  u16 led0pwmval;        // 设置CCR值
  RCC_Config();//系统时钟:

   TIM3_PWM_Init(899,0);
  while(1)
  {
   if(i)led0pwmval++;        // 由暗变亮
     else led0pwmval--;        // 由亮变暗
     if(led0pwmval==0)i=1;        // 已达到最亮,开始变暗
     if(led0pwmval>100)i=0;    // 已达到最暗,开始变亮
     TIM_SetCompare2(TIM3,led0pwmval);        //改变比较值TIM3->CCR2达到调节占空比的效果
  }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
宫本无三四
1楼-- · 2019-07-21 07:39
1.循环里加延时,2。PWM值最高就到100,太低了,现象不明显
正点原子
2楼-- · 2019-07-21 09:29
参考我们例程,继续努力
正点原子
3楼-- · 2019-07-21 10:19
while里面加delay
正点原子
4楼-- · 2019-07-21 15:42
 精彩回答 2  元偷偷看……
jiajiabusy
5楼-- · 2019-07-21 19:56
多谢大佬
jiajiabusy
6楼-- · 2019-07-21 20:09
宫本无三四 发表于 2018-12-14 09:20
1.循环里加延时,2。PWM值最高就到100,太低了,现象不明显

请问这个延时的作用是什么呢?

一周热门 更多>