• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
ftp27

Stm8L И Uart

4 сообщения в этой теме

ftp27    2

Пытаюсь завести UART на сабжевом микроконтроллере. В принципе таки все есть, но UART упорно молчит при передаче и не выходит на прерывание при приеме. Чутье подсказывает, что я просто напросто не так подал тактирование на модуль USART, но уже раз 10 все перепроверил. Все именно так.

Вот код:

#include "iostm8l152c6.h"
int main ( void )
{
PC_DDR_bit.DDR3 = 1;
PC_CR1_bit.C13 = 1;
PC_CR2_bit.C23 = 0;
PC_DDR_bit.DDR2 = 0;
PC_CR1_bit.C12 = 1;
PC_CR2_bit.C22 = 1;

//UART init
CLK_PCKENR1_bit.PCKEN15 = 1;

USART1_CR1 = 0;
USART1_CR3 = 0;
USART1_CR4 = 0;
USART1_CR5 = 0;

USART1_BRR2 = 0x03;
USART1_BRR1 = 0x68;

USART1_CR2_bit.RIEN = 1;
USART1_CR2_bit.REN = 1;
USART1_CR2_bit.TEN = 1;

asm("RIM");

while (1) { //Loop
while(!(USART1_SR_bit.TC));
USART1_DR = '!';
}

return 0;
}
#pragma vector=USART_R_OR_vector
__interrupt void USART_RXNE(void)
{
while(!(USART1_SR_bit.TC));
USART1_DR = '?';
}

По поводу железа... Передачу (TX со стороны STM) я жду на лапе PC3, а прием (RX) на PC2

Изменено пользователем ftp27

Поделиться сообщением


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
ftp27    2

Да. Ошибка была моя. Не настроил проект для прошивки по ST-Link. Но возникла другая трабла. Если верить длине бита взятых с осциллографа и формуле подсчета BRR из даташита (Скорость = Генератор/BBR), то частота тактирования USART - 32Мгц, что просто не может быть (16Мгц же). К тому же в пакете не отсылается последний бит. При передаче передается 7 бит вместо 8.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ftp27    2

Решение:

настройка резонатора

CLK_CKDIVR = 0;
CLK_ICKCR_bit.HSION = 1;

BBR

USART1_BRR2 = 0x03;
USART1_BRR1 = 0x68;

Пиздатые тут у вас помошники....

  • Не одобряю 2

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Никитос
      Всем привет. Сделал устройство с семисегментным индикатором,но понадобилось снимаемые значения еще и на пк выводить. А порт UART'а занят,связь нужна симплексная,т.е. в одну сторону. Можно ли как-то вывести инфу на порт В0?Или проще задействовать реализацию железа,а индикатор перебросить на другие порты?
    • Автор: Atreides
      Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
    • Автор: dim3740
      Читается порт UART на микроконтроллере Atmega. Применяю типовой алгоритм, но аппаратно вижу ошибки. Что неверное, или отчего они могут быть?
       
      unsigned char rx_buffer[128]; //накопительный буфер unsigned char indexW; // индекс при наполнении накопительного буфера unsigned char Count; // счетчик накопительного буфера unsigned char indexR; // индекс при опорожнении накопительного буфера int Max; // максимум до переполнения char tempMessage; // временная переменная int main(void) {    Max=100; // пробовал разные    while(1)     {         _delay_us(40); // пробовал от 10 мкс до мс                          if (Count > 0)          {             tempMessage=rx_bufferR[indexR];                                        MesComplite(tempMessage); //тут анализ каждого считанного байта. Это занимает время                                          //поэтому и нужен буфер                          indexR++;                            if (indexR>=Max)  indexR=0;  //Значение Max одинаковое для чтения и записи. Может разные проба?                          cli();  // для надежности запрет прерывания             Count--;             sei(); //разрешение                          if (Count>=Max)  Count=0;                  }              } } ISR(USART_RXC_vect)   {     if (UCSRA & (1<<7))        {                  rx_buffer[indexW]=UDR;                  indexW++;                    if (indexW>=Max)  indexW=0;                   Count++;                  if (Count>Max)  Count=0;           } }
      1. Задержка нужна в цикле whole? У меня при нуле еще больше ошибок(((
      2. Размеры 128 и 100 методом подбора?
      3. Инкременты ++ ставить после команды?
      4. запреты прерывания нужны?
      5. If делаю на "равенство и больше". Верно?
      6. Какие есть иные методы повышения надежности, кроме повторной отправки при ошибке?
    • Автор: oops13
      Простите, продублирую свой пост в новой теме:
      Форумчане, коллеги! Подскажите, пожалуйста. CoIDE выдает вот такую ошибку при записи во флешпамять:  Error: Connect failed, check config and cable connection. Со шнуром USB всё в порядке, ST-Link Utility установил. Но в диспетчере устройств драйвер STM32 почему-то именно в разделе дисковых устройствах отображается(в контроллерах USB его нет). На отладочной плате Discovery горит Красный светодиод. Настройки дебаггера в CoIDE прилагаю. Спасибо.

    • Автор: Дмитрий Кузьмичёв
      Доброго времени суток!!! Я столкнулся с тем, что не работает UART и не реагирует на AT-команды. Пробовал с 2-мя переходниками: CH340 и FT232RL, тот, что в Arduino. Пробовал и менять контакты RX-TX местами, и скорость менял (должно быть 9600 бод) - терминал молчит от слова совсем. CH340 просто светит своим индикатором приема, а FT232 моргнет при включении и все. Должно выводиться в терминале при включении ON, но не выводится ничего и никак не реагирует. Проверял и обвязкой, и упрощенным подключением (4 провода - 2 питания и 2 UART), и напряжение то 3.3 делал, то 3.7, то питал с аккумулятора - молчание. Подумал, что UART нагнулся из-за моих кривых рук - махнулся с другом на свежую, проверить UART, но результат тот же, полагаю, что в моем даже и не сдох. А сам модуль работает, не считая злосчатного UART. Так в чем может быть проблема?