Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM8L: Настройка прерываний по Таймеру 2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Порфирий
Добрый день, друзья!

Передо мной на столе - STM8L-Discovery, а на экране - бесплатная версия IAR Workbench. Пытаюсь заставить микроконтроллер формировать на одной из лап меандр частотой 36 кГц. Код приведён ниже:
Код
#include "stm8l15x.h"
#include "stm8l15x_it.h"
#include "stm8l15x_conf.h"

#define     IR_LED_PORT     GPIOD
#define     IR_LED_PIN      GPIO_Pin_1

void init( void )
{
    CLK_LSEConfig(CLK_LSE_OFF);
    CLK_HSECmd(DISABLE);    
    CLK_HSICmd( ENABLE );
    
    CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
    CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);    
    CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);

    GPIO_Init( IR_LED_PORT, IR_LED_PIN, GPIO_Mode_Out_PP_Low_Fast );
    
    TIM2_DeInit();
    // Timer 2, F = 36000 Гц
    // ARR = Fsck/Prescale/Fuser
    // ARR = 16 000 000 / 16 / (36 000 * 2) = 222
    CLK_PeripheralClockConfig( CLK_Peripheral_TIM2,ENABLE );
    TIM2_TimeBaseInit( TIM2_Prescaler_16, TIM2_CounterMode_Up, (uint16_t)222 );
    TIM2_UpdateRequestConfig(TIM2_UpdateSource_Global);
    TIM2_InternalClockConfig();
    
    // Interrupt
    TIM2_ITConfig( TIM2_IT_Update, ENABLE );
    
    // Start TIM2
    TIM2_Cmd(ENABLE);  
}

void main( void )
{
    init();
    
    volatile uint32_t freq =  CLK_GetClockFreq();
    
    for( int32_t i = 0; i < 100000; i++ );
    
    rim();
  
    while ( 1 );
}

// Timer 2 interrupt
INTERRUPT_HANDLER(TIM2_handler,TIM2_UPD_OVF_TRG_BRK_IRQn)
{
    if (TIM2_GetFlagStatus(TIM2_FLAG_Update))
    {
        GPIO_ToggleBits( IR_LED_PORT, IR_LED_PIN );

        TIM2_ClearFlag(TIM2_FLAG_Update);
    }
}


Смотрю осциллом на пине - частота что-то в окрестности 30...31 кГц. Ради интереса изменил частоту меандра на 1 МГц - на выходе ничего не изменилось. Думал, может проц запускается не от HSI, поэтому добавил строку:

Код
volatile uint32_t freq =  CLK_GetClockFreq();


Просмотрев отладчиком, убедился, что тактовая частота таки 16 МГц.

Включил полную оптимизацию кода. Частота меандра автоматом увеличилась с 30...31 до 50...55 кГц.

STM Peripherial Library - последняя с их сайта.

Подскажите, пожалуйста, что я делаю не так ? sm.gif
Порфирий
После включения максимальной оптимизации кода по скорости в настройках проекта и замены вызова:

Код
GPIO_ToggleBits( IR_LED_PORT, IR_LED_PIN );


макросом:

Код
#define GPIO_TOGGLE(a,b) a->ODR^=b


Частота стала адекватной
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.