Добрый день, друзья!
Передо мной на столе - 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 - последняя с их сайта.
Подскажите, пожалуйста, что я делаю не так ?