Top.Mail.Ru
Уведомления
Очистить все

STM8. Как настроить физические выводы таймера.

(@yuriy)
Level 3

Использую TIM1. Требуется выводить меандр в режиме TIM1_OCMODE_TOGGLE. Сам таймер дышит, значения счётчика меняются, компаратор срабатывает, а сигнала на выходе нет. Что-то ничего не нашёл как эти OCi привязываются к конкретным ножкам МК. Может, здесь у меня затык.

TIM1_DeInit();
TIM1_TimeBaseInit(TIM1_PRESCALER, TIM1_COUNTERMODE_UP, TIM1_PERIOD, 0);
TIM1_OC1Init(TIM1_OCMODE_TOGGLE, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE,
           0, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
           TIM1_OCNIDLESTATE_RESET);
TIM1_OC2Init(TIM1_OCMODE_TOGGLE, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE,
           GradazSdvig, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET,
           TIM1_OCNIDLESTATE_RESET);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);
TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE); 
TIM1_Cmd(ENABLE);

Цитата
Создатель темы Размещено : 21.01.2026 23:46
Aveal
(@aveal)
Top level Admin

Вроде фиксировано, что-то из серии:

  • CH1 - PC6
  • CH2 - PC7

Надо еще настройку пинов добавить и, возможно, TIM1_CtrlPWMOutputs(ENABLE); перед TIM1_Cmd(ENABLE);


ОтветитьЦитата
Размещено : 23.01.2026 12:20
(@yuriy)
Level 3

Запись от: @aveal

Вроде фиксировано, что-то из серии:

  • CH1 - PC6
  • CH2 - PC7

Возможно, но упоминании об этом нигде не нашёл.

Запись от: @aveal

Надо еще настройку пинов добавить и, возможно, TIM1_CtrlPWMOutputs(ENABLE); перед TIM1_Cmd(ENABLE);

Настройка пинов есть. TIM1_CtrlPWMOutputs(ENABLE); не помогло.


ОтветитьЦитата
Создатель темы Размещено : 23.01.2026 13:49
(@yuriy)
Level 3

Выяснилось, что для STM8S103F нет выходов для первого и второго каналов TIM1 (порт С, к которому привязаны выходы TIM1, начинается с выходов PC3), хотя STM8CubeMX предлагает другие выходы (не порта С), что меня и сбило с толку. Этот этап проехал перейдя на третий и четвёртый каналы. Но на новый уровень этой игры, касающийся прерываний по окончанию преобразования ADC, мне пока перейти не удаётся.  Настроить запуск АЦП от события переполнения таймера 1 мне, как я считаю, удалось. Этот вывод делаю из того, что если в бесконечном цикле делаю такую проверку

if( ADC1_GetFlagStatus( ADC1_FLAG_EOC))
{
    resultat_ADC1 = ADC1_GetConversionValue(); //Читаем результат преобразования.
    GPIO_WriteReverse(GPIOD, GPIO_PIN_4);
    ADC1_ClearFlag( ADC1_FLAG_EOC);	  
}

, то вижу реальные результаты преобразования. При этом инициализация глобального прерывания enableInterrupts(); закоментирована. Если её раскоментирую, то значения с АЦП больше не меняются, и в обработчик прерываний программа не попадает. Наверное, что-то ещё надо настраивать для обеспечения правильного прерывания.

main()
{	
    TIM1_PERIOD = GradazSdvig - 1;         // Период счета TIM1
    TIM1_PRECALER = (uint16_t)(CLK_HSI_RC / (4.0*f_Sig*(float)GradazSdvig)) - 1;   // Предделитель TIM1
    GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);
    GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);

    clk_Config();
    //enableInterrupts();
    TIM1_Config();
    ADC1_Config();  

    while (1)
    {
        //result_ADC1 = ADC1_GetConversionValue();
        //ADC1_ClearFlag( ADC1_FLAG_EOC);
        if( ADC1_GetFlagStatus( ADC1_FLAG_EOC))
        {
            resultat_ADC1 = ADC1_GetConversionValue(); //Читаем результат преобразования.
            GPIO_WriteReverse(GPIOD, GPIO_PIN_4);
            ADC1_ClearFlag( ADC1_FLAG_EOC);  
        }
    }
}

static void TIM1_Config(void)
{
    TIM1_DeInit();
    TIM1_TimeBaseInit(TIM1_PRECALER, TIM1_COUNTERMODE_UP, TIM1_PERIOD, 0);

    /*TIM1_Pulse = CCR3_Val*/
    TIM1_OC3Init(
        TIM1_OCMODE_PWM1,
        TIM1_OUTPUTSTATE_ENABLE,
        TIM1_OUTPUTNSTATE_DISABLE,
        4,                    // ШИМ 4/8, отладка
        TIM1_OCPOLARITY_HIGH,
        TIM1_OCNPOLARITY_HIGH,
        TIM1_OCIDLESTATE_SET,
        TIM1_OCNIDLESTATE_RESET);

    /*TIM1_Pulse = CCR4_Val*/
    TIM1_OC4Init(
        TIM1_OCMODE_PWM1,
        TIM1_OUTPUTSTATE_ENABLE,
        Sdvig,
        TIM1_OCPOLARITY_LOW,
        TIM1_OCIDLESTATE_SET);
        
    //TIM1_UpdateDisableConfig (ENABLE);		// Enables or Disables the TIM1 Update event.
    TIM1_SelectOutputTrigger(TIM1_TRGOSOURCE_UPDATE); // Настройка выходного триггера таймера
    //TIM1_UpdateDisableConfig (ENABLE);		// Enables or Disables the TIM1 Update event.

    TIM1_CtrlPWMOutputs(ENABLE); // TIM1 Main Output Enable
    TIM1_Cmd(ENABLE); // TIM1 counter enable	
}

static void ADC1_Config(void)
{
    ADC1_DeInit();
    ADC1_Init( 
        ADC1_CONVERSIONMODE_SINGLE,  // Непрерывное преобразование
        ADC1_CHANNEL_3,                  // Канал 3, PD2    
        ADC1_PRESSEL_FCPU_D8,            //Prescaler selection fADC1 = fcpu/8, 2 мГц
        ADC1_EXTTRIG_TIM,        //  Conversion from Internal TIM1 TRGO event.
        ENABLE,              // Разрешение внешнего тактирования.
        //DISABLE,              // Разрешение внешнего тактирования.
        ADC1_ALIGN_RIGHT,        // Правое выравнивание
        ADC1_SCHMITTTRIG_CHANNEL3, //параметр выбирает вывод для включения или отключения SchmittTrigger, внутрисхемное отключения вывода от лишних узлов для предотвращения искажения конвертируемого сигнала.
        DISABLE); // Преобразование без триггера Шмидта. Относится к предыдущему параметрру
            
    //ADC1_Cmd(ENABLE);
    ADC1_ClearFlag( ADC1_FLAG_EOC);  
    ADC1_ITConfig( ADC1_IT_EOCIE, ENABLE); //Включаем прерывание от окончания преобразования.
    //enableInterrupts();                    // Разрешениие прерывания   
    //ADC1_StartConversion();
    //ADC1->CR1 = 1;
    //ADC1->CR1 = 1;
    //ADC1_ClearFlag( ADC1_FLAG_EOC); 
    ADC1_Cmd(ENABLE);		
}

INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
    if( ADC1_GetFlagStatus( ADC1_FLAG_EOC))
    {
        resultat_ADC1 = ADC1_GetConversionValue(); //Читаем результат преобразования.
        ADC1_ClearFlag( ADC1_FLAG_EOC);
    }
}

т


ОтветитьЦитата
Создатель темы Размещено : 29.01.2026 18:22
Поделиться:
Обзор конфиденциальности

На этом сайте используются файлы cookie, что позволяет нам обеспечить наилучшее качество обслуживания пользователей. Информация о файлах cookie хранится в вашем браузере и выполняет такие функции, как распознавание вас при возвращении на наш сайт и помощь нашей команде в понимании того, какие разделы сайта вы считаете наиболее интересными и полезными.