реклама на сайте
подробности

 
 
> STM8L: Настройка прерываний по Таймеру 2
Порфирий
сообщение Apr 25 2012, 12:54
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 8-11-08
Пользователь №: 41 464



Добрый день, друзья!

Передо мной на столе - 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
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th July 2025 - 23:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016