STM32
直播中

李丽华

7年用户 1361经验值
私信 关注
[问答]

stm8s003的tim1一直发不了脉冲的原因?

各个大哥好,stm8s003的tim1一直发不了脉冲,程序如下:
void TIM1_init(void)
{
  TIM1_DeInit();
  TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP,200,0);
// TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);

  TIM1_OC1Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_DISABLE, TIM1_OUTPUTNSTATE_DISABLE, 100, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET);

  TIM1_ARRPreloadConfig(ENABLE);
  TIM1_OC1PreloadConfig(ENABLE);

  TIM1_CtrlPWMOutputs(ENABLE);
  TIM1_Cmd(ENABLE);
}


请问有哪里需要改动的,另外,直接写寄存器的也不行
void TIM1_init(void)
{  
TIM1->PSCRH=0;//分频系数为0,定时器时钟为8M/(1+0)=8M
TIM1->PSCRL=0;  

  TIM1->ARRH=0x00;
  TIM1->ARRL=0xC8;//频率调为40k



  TIM1->CCMR1 =0x78;//通道1配置成比较输出模式,PWM2模式
//  TIM1->CCER1 |=0x03;//开启通道1引脚,低电平有效  
  TIM1->CCER1=0x03;
   //初始化CCR1,占空比为50%;
  TIM1->CCR1H=0x00;
  TIM1->CCR1L=0x64;
  TIM1->RCR|=0x01;
  TIM1->EGR=0x01;

//  TIM1->CNTRH=0;
//  TIM1->CNTRL=0;
  TIM1->BKR =0x80;  
  TIM1->CR1 =0x01;//启动定时器1
}


回帖(1)

李晶

2024-5-10 16:43:48
首先,让我们分析一下您提供的代码。这段代码是用于初始化STM8S003的TIM1定时器的。根据您的描述,TIM1定时器无法产生脉冲。我们将逐步检查代码中的各个部分,以找出可能的问题。

1. TIM1_DeInit():这个函数用于将TIM1定时器的所有寄存器重置为默认值。这一步是正确的。

2. TIM1_TimeBaseInit():这个函数用于初始化TIM1定时器的基本时钟和计数器模式。您设置了计数器模式为向上计数(TIM1_COUNTERMODE_UP),预分频器为200,自动重载寄存器值为0。这里的问题是,自动重载寄存器值为0,这意味着定时器的计数周期非常短,可能无法产生可见的脉冲。您需要根据所需的脉冲频率调整自动重载寄存器的值。

3. TIM1_OC1Init():这个函数用于初始化TIM1通道1的输出比较模式。您设置了PWM2模式,输出状态为禁用,输出N状态为禁用,脉冲宽度为100,极性为高,N极性为高,空闲状态为复位,N空闲状态为设置。这里的问题是,输出状态和输出N状态都设置为禁用,这意味着即使定时器开始计数,输出引脚也不会产生任何脉冲。您需要将输出状态设置为启用(TIM1_OUTPUTSTATE_ENABLE)。

4. TIM1_ARRPreloadConfig(ENABLE):这个函数用于启用自动重载寄存器的预装载功能。这一步是正确的。

综上所述,要解决您的问题,您需要做以下更改:

1. 调整TIM1_TimeBaseInit()中的自动重载寄存器值,以获得所需的脉冲频率。
2. 修改TIM1_OC1Init()中的输出状态为启用(TIM1_OUTPUTSTATE_ENABLE)。

以下是修改后的代码示例:

```c
void TIM1_init(void)
{
    TIM1_DeInit();
    TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 10000, 0); // 假设您想要1kHz的脉冲频率,自动重载寄存器值应为10000
    TIM1_OC1Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE, 5000, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET);
    TIM1_ARRPreloadConfig(ENABLE);
}
```

请注意,您需要根据您的具体需求调整自动重载寄存器值和脉冲宽度。希望这能帮助您解决问题。
举报

更多回帖

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