STM32
直播中

贾虎世

8年用户 1802经验值
私信 关注
[问答]

为什么STM8S channel 4没有PWM输出?

求助各路大虾,我在STM8S的评估板上准备实现PWM控制LED的亮暗,LED是接在PD7管脚上,采用tiM1 channel 4 输出PWM,可是怎么也出不来效果。请教是哪里出了问题,下面是我的设置。还有一个,在STVD编译环境下跟踪寄存器,发现TIM1_CCR寄存器竟然是“intrusive read”, 单步执行写CCR,根本就写不进去,青椒大虾们为什么CCR寄存器会标注"intrusive read"?多谢大虾们。

//use TIM1 PWM to control LED
//set system clock
CLK->PCKENR1 = 0x80;
CLK->CMSR = 0xE1;          //choose CLK HSI = 16Mhz as fMASTER.
CLK->CKDIVR = 0x00;         //set fHSI= fHSI RC output/8 = 16Mhz/1 = 16MHz
                   //Becasue CPUDIV no any devide, so fMASTER = fHSI = 16Mhz
//----------------------------


//init TIM1 base unit
//----------------------------
TIM1->PSCRH = 0x00;
TIM1->PSCRL = 0x00;         //fCONT = fHSI = 16Mhz
//set PWM freq
TIM1->ARRH = 0x00;
TIM1->ARRL = 0x7f;          //PWM freq= 16Mhz/(0x7f+1)=16Mhz/128=15625Hz
TIM1->CR1 = 0x00;
TIM1->RCR = 0x00;          //no repeat count;

//set TIM1_CH4     
//----------------------------
TIM1->CCER2 = 0x10;        //CC4E(bit4)=1: OC4 output enable
                                         //CC4P(bit5)=0: high level is active;
TIM1->CCMR4 = 0x60;          //set channel 4 as PWM mode1, preload is disable
TIM1->OISR = TIM1->OISR | 0xbf;    //bit6(OIS4)=0, Output idle state is 0;
//initialize PWM duty circle
TIM1->CCR4H = 0x00;
TIM1->CCR4L = 0x00;         //PWM duty circle = CCR4/(ARR+1)*100%
TIM1->IER = 0x00;          //disable interrupt;

TIM1->CR2 = 0x00;

TIM1->CR1 = TIM1->CR1 |0x01;     //start count.
TIM1->BKR = 0x80;          //enable;


回帖(1)

李鸿洋

2024-4-30 17:23:24
首先,我们来分析一下您的问题。您正在尝试使用STM8S评估板上的TIM1通道4来实现PWM控制LED的亮度,但是没有得到预期的效果。您提供的代码片段中有一些设置,但是我们需要更完整的代码来更好地理解问题所在。

1. 确保您的硬件连接正确:LED连接到PD7管脚,并且确保LED的正极连接到PD7,负极连接到地(GND)。

2. 检查您的时钟设置:您提到了设置系统时钟,但是没有提供完整的时钟设置代码。确保您的时钟设置正确,以便为TIM1提供正确的时钟源。

3. 检查TIM1的配置:确保您正确配置了TIM1的预分频器、自动重载寄存器和模式。例如:

```c
TIM1_DeInit();
TIM1_TimeBaseInit(TIM1_PRESCALER_16, 999); // 预分频器和自动重载寄存器的值可能需要根据您的需求进行调整
TIM1_PWMIConfig(TIM1_CHANNEL_4, TIM1_ICPolarity_Falling, 0, TIM1_ICPSC_OnePulse, 0);
TIM1_Cmd(ENABLE);
```

4. 设置PWM占空比:根据您的需求,设置TIM1通道4的比较值(CCR4)。例如:

```c
TIM1_SetCompare4(您的占空比值);
```

5. 检查您的中断设置:如果您使用了中断来更新PWM占空比,确保您的中断服务例程正确设置。

关于您提到的TIM1_CCR寄存器“intrusive read”的问题,这可能与STVD编译环境的寄存器查看器有关。在某些情况下,寄存器查看器可能会将某些寄存器标记为“intrusive read”,这意味着读取这些寄存器可能会影响其值。然而,这通常不会影响您的代码执行。您可以尝试在单步执行时直接修改CCR4寄存器的值,看看是否有所改善。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分