Сообщение от Alex9797
|
Да забей ты на эти STM. Переходи на PIC
|
STM8S003 купил по 0,2USD. А PIC нонче раза в 3-4 дороже
Сообщение от gromovi
|
точнее будет сказать - оставайся на пиках. цель
- STM8 изучить. с пиками проще. согласен. они уже изучены.
|
Тю ))) шо там изучать.... там те же: ядро, FLASH, RAM, ноги, таймеры, периферия, фсё то же самое )))) Для ассемблера конечно есть отличия, а для СИ так почти никаких)))... разве что периферия более гибкая и более удобная.
STM8S - это для ВИП персон - ВСЁ ВКЛЮЧЕНО!!!
а у STM8L нада периферию включать. Т.к. серия для экономных приложений.
По поводу регисторов и битов, я поначалу делал так, пишем например для SPL, чтоб в даташит не лазить за названиями битов ))))):
Код:
|
TIM4_TimeBaseInit(TIM4_Prescaler_TypeDef TIM4_PRESCALER_1, uint8_t 100);
TIM4_ARRPreloadConfig(ENABLE);
TIM4_ITConfig(ENABLE);
TIM4_Cmd(ENABLE);
TIM4_ClearFlag(TIM4_FLAG_TypeDef TIM4_FLAG); |
потом потом лезем в дизассемблер и смотрим чего там накомпилировали...
а потом оставляем в коде, ненужное закоментируем и проверяем в железе как это работает:
Код:
|
#define Fclc 16 //MHz тут подставляем нужное
TIM4-› PSCR = (U8) (TIM4_PRESCALER_1); // значение пределителя
TIM4-› ARR = (U8) (100*10000/(10000/Fclc));//значение автоперезагрузки период 100 uS
TIM4-›CR1 |= TIM4_CR1_ARPE; // перезагрузку включить
TIM4-›CR1 &= (uint8_t)(~TIM4_CR1_ARPE); // перезагрузку выключить
TIM4-›IER |= (uint8_t)TIM4_IT; //прерывание переполнения TIM4 включить
TIM4-›IER &= (uint8_t)(~TIM4_IT);//прерывание переполнения TIM4 выключить
TIM4-›CR1 |= TIM4_CR1_CEN; //TIM4 включить
TIM4-›CR1 &= (uint8_t)(~TIM4_CR1_CEN); // TIM4 выключить
TIM4-›SR1 = (uint8_t)(~TIM4_FLAG);//флаг прерывание переполнения TIM4 выключить |
И в отладчике смотрим, чего там загрузили в регистры. Со временем, по мере запоминания, код сокращается до:
Код:
|
#define Fclc 16
TIM4-›CR1 = 0x00; //выключен
TIM4-›PSCR = 0x00; //пределитель 1
// TIM4-›PSCR = 0x01; //пределитель 2
// TIM4-›PSCR = 0x02; //пределитель 4
// TIM4-›PSCR = 0x03; //пределитель 8
// TIM4-›PSCR = 0x04; //пределитель 16
// TIM4-›PSCR = 0x05; //пределитель 32
// TIM4-›PSCR = 0x06; //пределитель 64
// TIM4-›PSCR = 0x07; //пределитель 128
TIM4-›ARR = (U8) (100*10000/(10000/Fclc)); //автозагрузка 100uS
ITC-›ISPR4 |= 0xC0; //прерывание TIM4_UPD_OVF очистка приоритета
// ITC-›ISPR4 &= 0x7F; //прерывание TIM4_UPD_OVF приоритет 1
// ITC-›ISPR4 &= 0x3F; //прерывание TIM4_UPD_OVF приоритет 2
// ITC-›ISPR4 &= 0xFF; //прерывание TIM4_UPD_OVF приоритет 3
TIM4-›IER = 0x01; //прерывание по переполнению включить
TIM4-›CR1 = 0x81; //включение TIM4 + автозагрузка включить |
А по мере разборок с периферией накапливаются такие заготовки.
А эта функция перекочевала из моих PIC и AVR функций.
Код:
|
#define frequancy 16000000 //Hz частота тактирования
#define tim4period0 100 //uS период
//если необходимо, то таких периодов задать можно много.
#define tim4period1 100 //uS период
#define tim4period2 1000 //uS период
#define tim4period3 320 //uS период
#define tim4period4 10 //uS период
// И под каждый написать свою функцию загрузки TIM4_period_x();
// каждая функция компилируется всего в 2 команды.
// TIM4-›PSCR=TIM4_PRESCALER_;
// TIM4_ARR=();
TIM4_period_0(); //загрузка пределителя и таймера по значению tim4period0
#ifdef tim4period0
void TIM4_period_0 (void){//вычисление и загрузка пределителя и таймера по tim4period0 и frequancy
#if (tim4period0*(frequancy/1/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_1;
TIM4_ARR=(tim4period0*(frequancy/1/1000)/1000);
#elif (tim4period0*(frequancy/2/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_2;
TIM4_ARR=(tim4period0*(frequancy/2/1000)/1000);
#elif (tim4period0*(frequancy/4/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_4;
TIM4_ARR=(tim4period0*(frequancy/4/1000)/1000);
#elif (tim4period0*(frequancy/8/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_8;
TIM4_ARR=(tim4period0*(frequancy/8/1000)/1000);
#elif (tim4period0*(frequancy/16/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_16;
TIM4_ARR=(tim4period0*(frequancy/16/1000)/1000);
#elif (tim4period0*(frequancy/32/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_32;
TIM4_ARR=(tim4period0*(frequancy/32/1000)/1000);
#elif (tim4period0*(frequancy/64/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_64;
TIM4_ARR=(tim4period0*(frequancy/64/1000)/1000);
#elif (tim4period0*(frequancy/128/1000)/1000)‹256UL
TIM4-›PSCR=TIM4_PRESCALER_128;
TIM4_ARR=(tim4period0*(frequancy/128/1000)/1000);
#elif (tim4period0*(frequancy/128/1000)/1000)›256UL
#error big period TIM4 заданый период таймера слишком большой
#endif
}
#endif |