Перейти к содержанию

STM8S103F3P6


Рекомендуемые сообщения

Объясните пожалуйста следующие, на руках имеется STM8S103F3P6, сначала была проблема запустить SPI, проблема была даже не в запуске а корректной работе - сделал! А вот с таймером я засел вообще. Хочу сделать программный delay по средствам таймера TIM1 без прерываний. Ниже скидываю инициализацию таймера TIM1 и обработчник(функция delay)

 

Тактовая частота 2MHz.

 

Где загвоздка?

 

#include "iostm8s103f3.h"

void TIM1_init(void);
void delay_us(unsigned int d);

void TIM1_init(void)
{
  ////Величина автоперезагрузки////
  unsigned int auto_preload = 65535;
  TIM1_ARRH=((auto_preload&0xFF00)>>8);
  TIM1_ARRL=auto_preload&0x00FF;
  ////////////////////////////////
  ////////Установка делителя//////
  unsigned int div_load = 2000;
  TIM1_PSCRH=((div_load&0xFF00)>>8);
  TIM1_PSCRL=div_load&0x00FF;
  ////////////////////////////////
  TIM1_CR1|=(1<<7)|(1<<1)|(1<<0);
}

void delay_us(unsigned int d)
{
  TIM1_CNTRH=0;TIM1_CNTRL=0;
  TIM1_ARRH=((d&0xFF00)>>8);
  TIM1_ARRL=d&0x00FF;
  while(((unsigned int)((TIM1_CNTRH<<8)+TIM1_CNTRL))<d){};
}

 int main()
{
  /////////////////////////////////////
  //Отключаем Всю периферию			// 
  CLK_PCKENR1=0x00;
  CLK_PCKENR2=0x00;
  /////////////////////////////////////
  CLK_PCKENR1|=(1<<7);//Включаем тактирование для TIM1
  TIM1_init();
  //Настройка ногодрыга для проверки таймера//
  PB_DDR|=(1<<5);
  PB_CR1|=(1<<5);
  PB_CR2|=(1<<5);
  ////////////////////////////////////////////
   while(1)
  {
    PB_ODR&=~(1<<5);
    delay_us(1000);//1сек
    PB_ODR|=(1<<5);
    delay_us(1000);//1сек
  }
  return 0;
}
                                                           

 

Изменено пользователем gafbich
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Ну если я правильно помню, то для обновление счетных регистров надо сгенерировать update event. Далее, зачем сравнивать счетные регистры с числом d, если за вас это сделает счётчик и поднимет флаг переполнения?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Да кажется этот флаг.

@gafbich вот код для STM8L152C6T6. На седьмом пине на дискавери светодиод, все моргает.

 

#include <iostm8l152c6.h>

void delay( unsigned int d )
{
  TIM1_ARRH = d >> 8; //TIM1 ovf value
  TIM1_ARRL = d & 0xFF;
  TIM1_CNTRH = 0; //counter = 0 now
  TIM1_CNTRL = 0; 
  TIM1_EGR_bit.UG = 1;  //Call for Update Event
  TIM1_SR1_bit.UIF = 0; //clear flag
  TIM1_CR1_bit.CEN = 1; //start TIM1
  while ( TIM1_SR1_bit.UIF == 0 ); //waiting for event
}


void main()
{
  unsigned int prsc = 15999; // TIM1 prescaler - 1
  
  CLK_CKDIVR_bit.CKM = 0; //16 MHz system clocking
  CLK_PCKENR2_bit.PCKEN21 = 1; //Timer1 clocked
  TIM1_PSCRH = prsc >> 8; //High byte of prescaler
  TIM1_PSCRL = prsc & 0xFF; //Low byte of prescaler
  TIM1_CR1_bit.OPM = 1; // start only onse
  TIM1_CR1_bit.URS = 1; //event only if OVF
  //1 tick = 1 ms
  
  PC_DDR_bit.DDR7 = 1; //PC7 as outout
  PC_CR1_bit.C17 = 1; //PP mode
  PC_CR2_bit.C27 = 1; // high speed
  
  while ( true )
  {
    PC_ODR_bit.ODR7 ^= 1; //invert LED
    delay( 1000 ); //1000 ms delay
  }
}

 

Писал минут пять, проблем не возникло

Ссылка на комментарий
Поделиться на другие сайты

Попробовал Ваш пример - не пашет( Вот в чем проблема не пойму.

Прошу прощения, Ваш пример и в правду работает! Спасибо

Изменено пользователем gafbich
Ссылка на комментарий
Поделиться на другие сайты

Еще один вопрос, в чем может быть затык в работе SPI на STM8S, к примеру настраивал на STM32 проблем вообще не было. а на данном камне мне посл каждой посылки (передачи) надо делать задержу в 20 nop`ОВ, а  иначе выброс кривой, если что могу кинуть с лог анализатора что получается без nop а что с nop

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...