Arm 寄存器层中的STM32F4-PWM控制

Arm 寄存器层中的STM32F4-PWM控制,arm,stm32,stm32f4discovery,pwm,stm32f4,Arm,Stm32,Stm32f4discovery,Pwm,Stm32f4,我正在通过ADC值改变LED亮度。事实上,我使用了标准periph库,它工作得很好,但当ı想在寄存器层编写代码时。除了ST cookbook文档外,我找不到任何文档。所以我编写了cookbook引用的代码。它工作得很好,但不是ı想要的,我可以一次性更改LED的亮度。我可以做些什么来连续更改LED的值? 我的代码如下所示 while (1) { value=ADC_Read(); //PD12,PD13,PD14,PD15 selected for pwm contr

我正在通过ADC值改变LED亮度。事实上,我使用了标准periph库,它工作得很好,但当ı想在寄存器层编写代码时。除了ST cookbook文档外,我找不到任何文档。所以我编写了cookbook引用的代码。它工作得很好,但不是ı想要的,我可以一次性更改LED的亮度。我可以做些什么来连续更改LED的值? 我的代码如下所示

while (1)
  {     
    value=ADC_Read();
    //PD12,PD13,PD14,PD15 selected for pwm control
     pulse_value=map(value,0,4095,0,9999);
    
     TIM4->CCR1|=pulse_value;
     TIM4->CCR2|=pulse_value;
  
     TIM4->CCMR1|=0;
     TIM4->CCMR1|=0x60;
     TIM4->CCMR1|=0x6000;
     
      TIM4->CCER|= 1<<0 | 1<<4;
      
      
      delay(1680000);
  
     TIM4->CCR3|=pulse_value;
     TIM4->CCR4|=pulse_value;
  
     TIM4->CCMR2|=0;
     TIM4->CCMR2|=0x60;
     TIM4->CCMR2|=0x6000;
     
      TIM4->CCER|= 1<<8 | 1<<12;
      TIM4->CR1|=0x1;
      
      delay(1680000);
   TIM4->CCER|= 1<<0 | 0<<4| 0<<8 | 0<<12;

while(1)
{     
值=ADC_Read();
//选择用于pwm控制的PD12、PD13、PD14、PD15
脉冲值=map(值,04095,09999);
TIM4->CCR1 |=脉冲|U值;
TIM4->CCR2 |=脉冲|U值;
TIM4->CCMR1 |=0;
TIM4->CCMR1 |=0x60;
TIM4->CCMR1 |=0x6000;
TIM4->CCER |=1CCMR2 |=0x60;
TIM4->CCMR2 |=0x6000;

TIM4->CCER |=1因此,当我在三个LED上使用PWM时,我假设这是在STM32芯片上(STM32F4在未来太模糊,需要更多的零件号)(这是一个STM32F031F4P6),看起来计时器类似于跨产品重复使用IP

PUT32(TIM2_CR1,0x00000000);
PUT32(TIM2_CCR2,200-1);
PUT32(TIM2_CCR3,400-1);
PUT32(TIM2_CCR4,600-1);
PUT32(TIM2_ARR, 800-1);
PUT32(TIM2_CNT,0x00000000);
PUT32(TIM2_PSC,0x00000000);
PUT32(TIM2_CCMR1,(6<<12));
PUT32(TIM2_CCMR2,(6<<12)|(7<<4));
PUT32(TIM2_CCER,(1<<4)|(1<<8)|(1<<12));
PUT32(TIM2_CR1,0x00000001);

while(1)
{
    for(ra=0;ra<800;ra++)
    {
        PUT32(TIM2_CCR2,ra);
        PUT32(TIM2_CCR3,ra);
        PUT32(TIM2_CCR4,ra);
        for(rb=0;rb<2000;rb++) dummy(rb);
    }
    for(ra--;ra;ra--)
    {
        PUT32(TIM2_CCR2,ra);
        PUT32(TIM2_CCR3,ra);
        PUT32(TIM2_CCR4,ra);
        for(rb=0;rb<2000;rb++) dummy(rb);
    }
}
你想用曾经存在的东西来代替那些零碎的东西,而不是它们,最终它们都是一

TIM4->CCR1 = (TIM4->CCR1)&(~0xFFFF)|pulse_value;
但实际上,由于寄存器没有分区,所以它只有一个字段/值

TIM4->CCR1 = pulse_value;
这是正确的做法

这当然没有任何作用:

TIM4->CCMR1|=0;
你是说

TIM4->CCMR1=0;
?为什么字段是分开的(作为一种习惯,每次读-修改-写都要更改外围设备,只需一次性设置所需的寄存器位,无论是一次读-修改-写还是一次写).一般来说,对外围设备执行单独的操作(如此)时不安全。而且,如果不对字段进行And运算以清除字段,则不能仅对寄存器进行And运算或对寄存器进行And运算

Bits 6:4 OC1M: Output compare 1 mode
110: PWM mode 1
TIM4->CCMR1 |=0x60

相反,这一领域需要类似的东西


TIM4->CCMR1=(TIM4->CCMR1&(~(7因此,当我在三个LED上使用PWM时,我假设这是在STM32芯片上(STM32F4在未来太模糊,需要更多零件号)(这是一个STM32F031F4P6),看起来计时器类似于跨产品重复使用IP

PUT32(TIM2_CR1,0x00000000);
PUT32(TIM2_CCR2,200-1);
PUT32(TIM2_CCR3,400-1);
PUT32(TIM2_CCR4,600-1);
PUT32(TIM2_ARR, 800-1);
PUT32(TIM2_CNT,0x00000000);
PUT32(TIM2_PSC,0x00000000);
PUT32(TIM2_CCMR1,(6<<12));
PUT32(TIM2_CCMR2,(6<<12)|(7<<4));
PUT32(TIM2_CCER,(1<<4)|(1<<8)|(1<<12));
PUT32(TIM2_CR1,0x00000001);

while(1)
{
    for(ra=0;ra<800;ra++)
    {
        PUT32(TIM2_CCR2,ra);
        PUT32(TIM2_CCR3,ra);
        PUT32(TIM2_CCR4,ra);
        for(rb=0;rb<2000;rb++) dummy(rb);
    }
    for(ra--;ra;ra--)
    {
        PUT32(TIM2_CCR2,ra);
        PUT32(TIM2_CCR3,ra);
        PUT32(TIM2_CCR4,ra);
        for(rb=0;rb<2000;rb++) dummy(rb);
    }
}
你想用曾经存在的东西来代替那些零碎的东西,而不是它们,最终它们都是一

TIM4->CCR1 = (TIM4->CCR1)&(~0xFFFF)|pulse_value;
但实际上,由于寄存器没有分区,所以它只有一个字段/值

TIM4->CCR1 = pulse_value;
这是正确的做法

这当然没有任何作用:

TIM4->CCMR1|=0;
你是说

TIM4->CCMR1=0;
?为什么字段是分开的(作为一种习惯,每次读-修改-写都要更改外围设备,只需一次性设置所需的寄存器位,无论是一次读-修改-写还是一次写).一般来说,对外围设备执行单独的操作(如此)时不安全。而且,如果不对字段进行And运算以清除字段,则不能仅对寄存器进行And运算或对寄存器进行And运算

Bits 6:4 OC1M: Output compare 1 mode
110: PWM mode 1
TIM4->CCMR1 |=0x60

相反,这一领域需要类似的东西


TIM4->CCMR1=(TIM4->CCMR1&(~(7)你需要学习逐位运算。没有它,你将无法在uC编程中成功。整个代码充满了bug。顺便说一句,你不能在需要时更改CCRx值。最好的时间是溢出或CCRx事件。你需要学习逐位运算。没有它,你将无法在uC编程中成功。整个代码充满了bug。顺便说一句,你当你想更改CCRx值时,不能更改。最好的时间是溢出或CCRx事件。非常感谢你的评论,对我很有用。我还是电子工程专业的学生,所以实际上是这项工作的初学者。我现在意识到我的缺点,我将努力提高我的技能。非常感谢你的评论,对我很有用。我仍然是电子工程师我现在意识到我的缺点,我将努力提高我的技能。
while (1)
{     
  value=ADC_Read();
  //PD12,PD13,PD14,PD15 selected for pwm control
   pulse_value=map(value,0,4095,0,9999);

   TIM4->CCR1=pulse_value;
   TIM4->CCR2=pulse_value;
   TIM4->CCR3=pulse_value;
   TIM4->CCR4=pulse_value;
   delay(1680000);
}