2019-09-04 01:17 AM
#include <stdint.h>
#include<iostm8s.h>
void main(void)
{
TIM2_PSCR = 0b00000111;
TIM2_EGR= 0x01;
TIM1_CR1 = 0x01;
PD_DDR = 0x01;
PD_CR1 = 0x01;
while(1)
{
if ( ( ((uint16_t)TIM2_CNTRH << 8) + (uint16_t)TIM2_CNTRL ) >= 15625 )
{
TIM2_CNTRH = 0;
TIM2_CNTRL = 0;
PD_ODR=0X01;
}
else
{
PD_ODR=0X00;
}
}
}
My microcontroller is not connected with any external clock and using internal clock to operate.
After I reading datasheet, I see MCU clock will be HSI/8 = 2MHz by default. I set 128 as prescaler for TIM2. So, TIM2 counter will increment in each 64us. So, when it reach at 15625 it will be 1 second (64 * 15625 = 1000000us = 1s).
So, I assumed the LED to toggle in each second.
The problem is the LED stays ON all time.
Could somebody help me to identify the problem with my code?
2019-09-08 11:36 AM
Hi!
It's not bad to be new with MCUs and STM8, it's actually good, and I'm glad to see new people involved in this, so let's see about your code: first, you try to configure TIMER2 but than you enable TIMER1 ("TIM1_CR1 = 0x01;") - this means TIMER2 is not enabled, not running, so can read the counter as long as you want, you'll always read the same value.
Second, even if this is just some startup code, try to do it right. For me it's killing to see an infinite loop reading the counter value. Instead, try to configure your timer right, and use an interrupt to switch the LED.
Good luck!
2019-09-08 11:42 AM
Oh, and there is some more: you did not enabled anyway the master clock for any timer. If you want the Fmaster to clock your timer you need to enable it in CLK_PCKENR1 register, if not, even if you set the enable bit in TIMx_CR1 it will not be clocked.
2019-09-09 05:15 AM
thank you sir