Jump to content
Sign in to follow this  
gafbich

STM8S103F3P6

Recommended Posts

Объясните пожалуйста следующие, на руках имеется 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;
}
                                                           

 

Edited by gafbich

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Вы имеете ввиду UIF флаг (TIM1_SR1)

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

 

Share this post


Link to post
Share on other sites

Вебинар STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

Компания Компэл приглашает вас 25 сентября принять участие в вебинаре, который посвящен новому семейству микроконтроллеров STM32G0. Вебинар рассчитан на технических специалистов и тех, кто хорошо знаком с семейством STM32. На вебинаре будут освоены современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0 и проведено их подробное сравнение.

Подробнее

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

@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
  }
}

 

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

Share this post


Link to post
Share on other sites

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

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

Edited by gafbich

Share this post


Link to post
Share on other sites
                     

Литиевые батарейки Fanso в беспроводных датчиках пожарно-охранной сигнализации

Выбор подходящего элемента питания, способного обеспечивать требуемый уровень напряжения и выдавать необходимый ток на протяжении всего периода эксплуатации беспроводной пожарно-охранной системы является одной из первостепенных задач. Наиболее подходящим для этих целей элементом являются литий-тионилхлоридные элементы питания, а одним из наиболее конкурентоспособных производителей – компания Fanso, предлагающая своим клиентам продукты как универсальные, так и разработанные специально для решения конкретных задач.

Подробнее...

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By megavolt3101
      Здравствуйте уважаемые форумчане. Пытаюсь связать два микроконтроллера по шине LIN. В качестве мастера выбрал контроллер STM8S103F3P6 (Его Usart умеет только LIN MASTER). В качестве ведомого выбрал STM8S208RBT6 (У него 2 Усарта, один из которых умеет быть ведомым LIN) Собрал на двух макетных платах. LIN трансивер TJA1020 Прием и передача работают нормально. Но как дошло дело до защиты от потери линии связи, тут возникли проблемы. После обрыва линии связи и ее восстановления связь возобновляется. Но вот после короткого замыкания шины LIN ведомое (SLAVE) устройство намертво виснет. Точнее виснет в обработчике прерывания от USART3. Я пытался принудительно очистить флаг приема по узарту (UART3_FLAG_RXNE) и флаг приема хедер байта (UART3_FLAG_LHDF). А также скидывал флаг брэйк байта (UART3_FLAG_LBDF). Ничего не помогает программа не возвращается из прерывания по приему от USART_3. Но зато если в этот момент с ведущего устройства снова подать команду, то работоспособность ведомого устройства восстанавливается. Тоже самое помогает, если в обработчике прерывания по USART_3 принудительно подать рандомную команду на передачу. То есть, так как линия одна, она сама свою же команду и принимает, получается. Вроде все нормально, но как то коробит такой колхозный способ защиты от короткого замыкания шины. Подскажите, может я забываю еще какой нибудь скинуть флаг при случае коротыша на линии LIN или есть еще каrой нибудь правильный способ обойти защиту от потери связи после кратковременного замыкания на шине. Надеюсь тут есть люди, которые что-то делали с шиной LIN ?

      Прилагаю инициализацию для мастер устройства 
      UART1_Init( 9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
      UART1_LINBreakDetectionConfig( UART1_LINBREAKDETECTIONLENGTH_11BITS);
      UART1_ITConfig( UART1_IT_RXNE_OR, ENABLE);
      UART1_LINCmd( ENABLE);
      enableInterrupts();

      И для Ведомого устройства
      UART3_Init( 9600, UART3_WORDLENGTH_8D, UART3_STOPBITS_1, UART3_PARITY_NO, UART3_MODE_TXRX_ENABLE);
      UART3_LINConfig( UART3_LIN_MODE_SLAVE, UART3_LIN_AUTOSYNC_ENABLE,UART3_LIN_DIVUP_LBRR1);
      UART3_LINBreakDetectionConfig( UART3_LINBREAKDETECTIONLENGTH_11BITS);
      UART3_ITConfig( UART3_IT_RXNE_OR, ENABLE);
      UART3_ITConfig( UART3_IT_LBDF, ENABLE);
      UART3_ITConfig( UART3_IT_LHDF, ENABLE);
      UART3_LINCmd( ENABLE);
      enableInterrupts();

      А также обработчик прерывания для ведомого устройства
      //Обработчик прерывания для UART3.
      INTERRUPT_HANDLER( UART3_RX_IRQHandler, 21)
      {
      if( UART3_GetFlagStatus( UART3_FLAG_LHDF)){recUART3_Header=UART3_ReceiveData8(); UART3_ClearFlag(UART3_FLAG_LHDF);}
      if( UART3_GetFlagStatus( UART3_FLAG_RXNE)){recUART3_Data=UART3_ReceiveData8(); UART3_ClearFlag(UART3_FLAG_RXNE);}
      if( UART3_GetFlagStatus( UART3_FLAG_LBDF)){ UART3_ClearFlag( UART3_FLAG_LBDF);}
      if( UART3_GetFlagStatus(UART3_FLAG_OR_LHE)){UART3_SendData8(0x00);UART3_ClearFlag(UART3_FLAG_OR_LHE);}// Отправляю пустую команду через USART_3
      }
    • By shemmer
      Продам микросхемы. Все новое. 95 % в упаковке.
      1. Микроконтроллеры
        STM32F030F4P6   - 3 шт. TSSOP20. 30 руб.   STM8S003F3U6TR - 5 шт. UFQFPN20. 20 руб.   STM8S003F3P6 - 3 шт. TSSOP20. 30 руб.   AT91SAM7S512 - 3 шт. TQPF64. 120 руб.   AT91SAM7S256 - 3 шт. TQPF64. 90 руб.   AT91SAM7S64 - 50 шт. TQPF64. Сняты с не работавших плат. 40 руб/шт.   PIC12LF1840 - 3 шт. 30 руб. 2. Память
      AT24C128C-SSHM  6 шт. SO8. 10 руб. AT25DF081A - 3 шт. SO8. 20 руб. AT45DB161 - 25 шт. 50 руб. 3. Питание
      NCP1013AP100G - 3 pcs NCP1012AP065G - 3 pcs NCP1028P100G - 2 pcs NCP1011AP100G - 3 pcs NCP1053P100G - 3 pcs NCP1011APL065R2G - 2 pcs VIPER12ASTR-E - 3 pcs VIPER12A - 5 pcs ST1S10PHR MC33063 КР142ЕН5А - 150 шт. В герметичных упаковках. 4. Прочее
      74HC595 - 50 шт. ADM485 ( SO8 )  
      Отправка почтой из Томска.
       
       
    • By Рена
      Прошу помощи в создании ШИМ регулятора вентилятора охлаждения двигателя на STM8S.
      В программировании навыков нет, учусь потихоньку, пока заказал STM8S-Discovery.
      Задача - плавное вкл/выкл. (программируемое значение) и регулирование оборотов вентилятора (ШИМ от 20-95%) в зависимости от температуры с датчика.
      Если есть возможность помогите.
    • By Norad2142
      Здравствуйте! Собираю платформу на основе гусеничного танка на микроконтроллере STM8S. Требуется сделать так, чтобы пройденный путь измерялся датчиком. В качестве датчика подумал использовать оптопару от компьютерной мыши. Нашел вот такую схему http://www.qrz.ru/schemes/contribute/comp/mouse.shtml, решил использовать вместо данного ОУ готовый компаратор LM339. Но с ним у меня начались проблемы. Сначала я хотел посмотреть, как работает компаратор. Поставил его на макетную плату, запитал от 5В, на неинвертирующий вход подал те же 5 В, а на инвертирующий 2,5 В в качестве опорного. По логике компаратор должен был выдать на выходе напряжение логической единицы, но там абсолютный 0. Подскажите пожалуйста, что я не так сделал, может чего не хватает?

  • Сообщения

    • А других у нас не купить. Эти самые дорогие, по 175 за штуку. Остальные хуже. Давно брал для УМ на 1875 подешевле, так они при завинчивании обломались под корешок, силумин.
    • Дурина, при загрузке в неё соответствующего ПО, тоже может программатором.  Но основная проблема всей темы вовсе не в программаторе.
    • @finn32 ,выходные терминалы эти оставишь?
    • Повёлся на мощность Она у этого пылесоса действительно большая, ~2,2 -2,5квт. Из которых эффективная на всасывание в районе 700вт. То есть пылесосит он действительно не плохо)) Да так собственно и хочу поступить) стоил бы фильтр до 3тр, то ещё куда не шло бы. А так, 5тр + доставка, мне жалко отдавать за кусок пластика с бумагой. Учитывая что например за подобную сумму можно купить целый пылесос) Прошлый пылесос (нилфиск) был как раз с мешками, проблема была в том, что к нему было не найти мешков и приходилось ножницами дорабатывать посадочную картонку, в принципе это не проблема была, у него потом просто двигатель клинанул, проработал он у меня долго, больше 7 лет. Вот после него захотелось мощный пылесос, но без пакетов)))
    • Название темы уже забавное. "Сквозной ток" однотактного генератора - надо записать в тетрадку.
    • Так об этом пишут уже десятки лет, зачем покупать "мерседес" если будете возить навоз на дачу. Хотите полный эксперимент отключите совсем датчик и увидите насколько хватит этого пылесоса раз не хотите менять фильтр.
    • На второй картинке 50 Гц на выходе. На печатке ЛБП ошибок не нашел. А сколько вольт на +моста? А какая ёмкость на выходе ЛБП. Осциллограммы питания +12 и -12 ОУ. С БП отключить цепь Z, ей нужен КС162. Пригодность КС182 зависит от напряжения на С6 в БП, если у тебя напряжения в БП больше на 2-3 вольта, чем написано на схеме, то КС182 может и подойдет. Последние наброски печаток и схема. Их не собирал, надо проверять. https://forum.cxem.net/applications/core/interface/file/attachment.php?id=647843   ЛБП 44.3.N.lay6
×
×
  • Create New...