Бодрый день.
Решил недавно немного поиграться с STM8
нашел буржуйское видео для начинающих и повторил код оттуда для мигания светодиодом посредством таймера, слегка адаптировав его для китайского модуля stm8s103f3, скомпилил его и залил в плату.
вобщем все заработало.
однако мне, как не очень большому знатоку С остались не ясны некоторые моменты кода...
сам код
#include "iostm8s103f3.h"
#include "stdint.h"
#define PIN 5
volatile uint8_t timer4 = 0;
#pragma vector = TIM4_OVR_UIF_vector
__interrupt void TIM4_UPD_OVF_IRQHandler(){
if(timer4 % 32 == 0){ //Замедляем Timer4 еще больше, чтобы видить мигание светодиода
PB_ODR ^= (1<<PIN); //переключаем Pin B5
timer4 = 0;
}
timer4++;
TIM4_SR &=~(1<<0); //Очищаем флаг обновления прерывания
}
void initGPIO(){
PB_DDR |= (1<<PIN); //Установить пин 5 как выход
PB_CR1 |= (1<<PIN); //Установить пин 5 как пушпул
PB_ODR |= (1<<PIN); //Установить пин 5 высокий (1)
}
void initTimer4(){
CLK_PCKENR1 |= (1<<4); //Разрешить тактирование переферии для Timer4
TIM4_PSCR = 0x0F; //Делитель частоты, делим на макс
TIM4_IER = 1; // Разрешить обновление прерывания
TIM4_CR1 |= 1; // Разрешаем таймер
asm ("rim"); //Разрешаем глобальные прерывания
}
int main( void )
{
initGPIO();
initTimer4();
while (1){
}
}
так вот, хотелось бы спросить более опытных камрадов, что именно делает и значит такая конструкция в условии проверки:
if(timer4 % 32 == 0){
а так же не понятно, зачем двумя строками ниже переменная timer4 сбрасывается на ноль, ведь эта секция кода выполняется только если timer4 и так равна 0 или я не прав?
так же, прошу пояснить как работает след конструкция
TIM4_SR &=~(1<<0);
понятно что & и ~ это логическое "и" и инвертирование... но как и в какой последовательности оно выполняется при таком написании?