Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-окт-24 03:14

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-окт-17 09:45 
Не в сети

Зарегистрирован: 2012-окт-17 09:28
Сообщения: 12
Здравствуйте уважаемые форумчане.
Разбираюсь с отладочным комплектом на мк 1901ВЦ1х. Не могу разобраться с работой uart. Разъем DB-9 подключен к Uart 3. В демо примере реализован uart 1 для работы с lcd дисплеем.
Может есть примеры по реализации Uart 3? буду очень благодарен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-окт-19 09:07 
Не в сети
Аватара пользователя

Зарегистрирован: 2012-авг-07 09:58
Сообщения: 132
Держите.


Вложения:
Uart.rar [4.06 МБ]
Скачиваний: 288
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-окт-19 09:22 
Не в сети

Зарегистрирован: 2012-окт-17 09:28
Сообщения: 12
Спасибо огромноеееее :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-07 13:57 
Не в сети

Зарегистрирован: 2012-дек-07 13:52
Сообщения: 4
Добрый день

Подскажите пожалуйста, что я делаю не так при инициализации UAR3


#define RXE ((WORD)0x0200)
#define TXE ((WORD)0x0100)
#define UART_EN ((WORD)0x0001)


void Init_UART3()
{

DWORD integerdivider,fractionaldivider;

PORTF->FUNC=0x0000000A;
PORTF->PWR=0x0000000A;
PORTF->ANALOG=0x00000003;

RST_CLK->UART_CLOCK=0x04000000;

//divider = 40000000 / (9600 *16);
integerdivider = 260;
/* Determine the fractional part */
fractionaldivider = 27;

UART3->IBRD=integerdivider;//SPEED[NrSpeed].Integer;
UART3->FBRD=fractionaldivider;//SPEED[NrSpeed].Fraction;
UART3->LCR_H=data_bit_8|stop_bit_1|parity_none|FIFO_ON;
UART3->CR=RXE|TXE;//|UART_EN;
UART3->CR|=UART_EN;
}

Отправка байта

void sendchar_UART3(char c)
{
while(UART3->FR &0x00000020)

UART3->DR=c;
}

Что я делаю не так?

Инициализация частоты процессора как из вашего примера

Заранее спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-07 15:26 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
в приведенном коде вроде бы все хорошо. Тактирование PORTF и UART3 вы включаете (в регистре RST_CLK->PER_CLOCK)? Если есть возможность, то выложите весь проект.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-10 10:31 
Не в сети

Зарегистрирован: 2012-дек-07 13:52
Сообщения: 4
Получить / принять данные удалось, но с ошибкой

К примеру отправляю символ '2' а приходит '0'

Программа Terminal.exe также находиться в архиве.

В чем ошибка пока не могу понять. Может терминал "кривой".


Вложения:
IKAR_uOS.rar [837.58 КБ]
Скачиваний: 214
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-10 17:01 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
Дмитрий Сергеев писал(а):
Получить / принять данные удалось, но с ошибкой

К примеру отправляю символ '2' а приходит '0'

Программа Terminal.exe также находиться в архиве.

В чем ошибка пока не могу понять. Может терминал "кривой".

Предлагаю функцию ClockConfigure() сделать такой:
Код:
void ClockConfigure()
{
  RST_CLK->PER_CLOCK = 0xFFFFFFFF;

  RST_CLK->HS_CONTROL = 0x01;                               // HSE_ON
  while ( (RST_CLK->CLOCK_STATUS & 0x04) == 0);

  RST_CLK->CPU_CLOCK = 0x02;                    //добавил эту строчку (HSE источник сигнала для PLL, ядро работает на частоте HSI)

  RST_CLK->PLL_CONTROL |= 0x0904;                   
  while ( (RST_CLK->CLOCK_STATUS & 0x02) == 0);
  EEPROM->CMD = 0x0018;
  RST_CLK->CPU_CLOCK = 0x0106;                //ядро и периферия работает на 80МГц от PLL                                 
}


И поменять делители в функции Init_UART3() на:
Код:
   UART3->IBRD = 0x0208;   // 9600 бит/с при 80МГц
        UART3->FBRD = 0x035;


HSI нестабильный генератор, и я бы рекомендовал вам работать от внешнего резонатора/генератора. Нестабильная частота HSI, скорее всего, и дает плавающий прием/передачу данных через UART.

Я рассматривал работу только UART, остальные детали проекта не смотрел, и как повлияли данные изменения стоит уточнить вам.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2012-дек-11 08:10 
Не в сети

Зарегистрирован: 2012-дек-07 13:52
Сообщения: 4
Спасибо огромное, все заработало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2015-мар-25 16:18 
Не в сети

Зарегистрирован: 2012-июн-01 14:12
Сообщения: 38
Относительно работы UART возник следующий вопрос.

Исходные данные:

Есть код, запускающий работу UART

Код:
   RST_CLK->PER_CLOCK |= PER_PORTF;
   PORTF->FUNC = (PORTF->FUNC & 0xFFFFFFF0)
                  |(2 << PORT_FUNC_MODE0_Pos)
                  |(2 << PORT_FUNC_MODE1_Pos);
   PORTF->ANALOG |= 0x0003;
   PORTF->PWR |= (3 << PORT_PWR_PWR0_Pos)|(3 << PORT_PWR_PWR1_Pos);

   RST_CLK->PER_CLOCK |= PER_UART3;
   RST_CLK->UART_CLOCK = (1 << 26)|(4 << 16);
   UART3->IBRD = 1;
   UART3->FBRD = 25;
   UART3->LCR_H = (3 << UART_LCR_H_WLEN_Pos) | UART_LCR_H_FEN;
   UART3->IFLS = (2 << UART_IFLS_RXIFLSEL_Pos)|(2 << UART_IFLS_TXIFLSEL_Pos);
   UART3->IMSC |= UART_IMSC_RXIM | UART_IMSC_TXIM;
   UART3->CR = UART_CR_UARTEN | UART_CR_TXE | UART_CR_RXE; // +

   NVIC_EnableIRQ(UART3_IRQn);


Который, в том числе, настраивает работу по прерываниям (полуполные очереди) для приемника и передатчика. Очередь при этом включена(разрешена).
Если с внешнего терминала я ввожу восемь символов, то прерывание приемника срабатывает, но как я не пытался получить прерывание от передатчика - результат нулевой.

Вопросы:
1. Почему при заданной настройке я не попадаю в прерывание по передатчику? Даже флаг не взодится в регистре RIS, хотя данные я ложу часто

Код:
   while (1)
      {
      UART3RIS = UART3->RIS;
      if (UART3RIS & 0x400)
         {
         UART3->DR = (uint8_t)(UART3CountData & 0xFF);
         }
      UART3->DR = (uint8_t)(UART3CountData & 0xFF);
      //sleep_clk(1000000);
      UART3CountData++;
      }

2. В документации описано

Цитата:
2…0 TXIFLSEL Порог прерывания по заполнению буфера передатчика:
b000 = буфер заполнен на 1/8
b001 = буфер заполнен на 1/4
b010 = буфер заполнен на 1/2
b011 = буфер заполнен на 3/4
b100 = буфер заполнен на 7/8
b101-b111 = резерв

Хочу уточнить, "заполнен" или "заполнен менее чем" как в других переферийных блоках?

Проверял на скорости работы 115200 и 9600. 9600 явно не должен успевать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2015-мар-26 15:52 
Не в сети

Зарегистрирован: 2012-июн-01 14:12
Сообщения: 38
В общем странно работает (не работает) прерывание по передаче UART. С очередью работает, но надо заполнить ВЕСЬ буфер. и прерывание срабатывает если заполнен ВЕСЬ(возможно больше границы) буфер.
А если отключить очередь, то прерывание срабатывает не когда данные передадутся (освободится регистр ), а когда заполнится регистр(возможно).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2015-апр-03 18:22 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
Перечитайте ещё раз раздел спецификации, посвященный прерываниям от передатчика блока UART (раздел "28 Контроллер UART", пункт "28.10 Прерывания", подпункт 28.10.3 UARTTXINTR).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с Uart на 1901ВЦ1х
СообщениеДобавлено: 2018-сен-25 11:52 
Не в сети

Зарегистрирован: 2013-мар-13 14:30
Сообщения: 7
Откуда: Зеленоград
Здравствуйте!

На микроконтроллере 1901ВЦ1 (MDR32FG16S1Q1) не удается настроить UART3.

Чип тактируется от HSE на CPU_C1 8 MHz. Запущен PLL. На HCLK 96 Mhz.
В регистре UART_CLOCK (адрес 0x40020028) установлен бит 26 (UART3CLKEN) для разрешение тактовой частоты на UART3.

Тактирование на PORTF подано. Бит PORTF (29) в регистре PER_CLOCK установлен. В режиме GPIO PF0 и PF1 работают.
Тактирование на UART3 подано. Бит UART3 (бит 26) в PER_CLOCK установлен.
Передача и прием разрешены битами TXE и RXE в регистре MDR_UART3->CR.
Разрешение работы выставлено. В регистре UART3-CR (0x400D0030) установлено поле UARTEN (бит 0).
В errata ничего не написано про UART.

Однако отправки нет.

Причем куда не прикрепляй UART3_TX результат один и тот же:
- подключить UART3_TX к основной функции пина PD13, то сигнал не появляется при отправке.
- подключить UART3_TX к альтернативной функции пина PD7, то сигнал не появляется при отправке.
- подключить UART3_TX к альтернативной функции пина PF1, то сигнал не появляется при отправке.

Чего же не хватает, чтобы заставить UART3 работать?

В качестве Hardware Abstraction Layer использую
C:\Keil_v5\ARM\PACK\Keil\MDR1986BExx\1.5\Libraries\MDR32F9Qx_StdPeriph_Driver\src

Вот мой код инициализации:

void init_uart3(void)
{
RST_CLK_PCLKcmd(RST_CLK_PCLK_PORTF, ENABLE);
RST_CLK_PCLKcmd(RST_CLK_PCLK_UART3, ENABLE);

// Set the HCLK division factor = for UART3
UART_BRGInit(MDR_UART3, UART_HCLKdiv128);

PortInit.PORT_PULL_UP = PORT_PULL_UP_OFF;
PortInit.PORT_PULL_DOWN = PORT_PULL_DOWN_OFF;
PortInit.PORT_PD_SHM = PORT_PD_SHM_OFF;
PortInit.PORT_PD = PORT_PD_DRIVER;
PortInit.PORT_GFEN = PORT_GFEN_OFF;
PortInit.PORT_FUNC = PORT_FUNC_ALTER;
PortInit.PORT_SPEED = PORT_SPEED_MAXFAST;
PortInit.PORT_MODE = PORT_MODE_DIGITAL;

//UART3_TX
PortInit.PORT_OE = PORT_OE_OUT;
PortInit.PORT_Pin = PORT_Pin_1;
PORT_Init(MDR_PORTF, &PortInit);

//UART3_RX
PortInit.PORT_OE = PORT_OE_IN;
PortInit.PORT_Pin = PORT_Pin_0;
PORT_Init(MDR_PORTF, &PortInit);

UART_InitStructure.UART_BaudRate = 115000;
UART_InitStructure.UART_WordLength = UART_WordLength8b;
UART_InitStructure.UART_StopBits = UART_StopBits1;
UART_InitStructure.UART_Parity = UART_Parity_No;
UART_InitStructure.UART_FIFOMode = UART_FIFO_OFF;
UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_RXE | UART_HardwareFlowControl_TXE;

UART_DeInit(MDR_UART3);
UART_Init(MDR_UART3, &UART_InitStructure);

// Enable transmitter Receiver interrupt ()
UART_ITConfig(MDR_UART3, UART_IT_TX | UART_IT_RX, ENABLE);

NVIC_EnableIRQ(UART3_IRQn);

UART_Cmd(MDR_UART3, ENABLE);

UART_SendData(MDR_UART3, 0xAA);
}

Что не так с UART3?


------------------------------------------------------------------------------------------------

Как выяснилось, чтобы запустить UART3 надо чтобы был еще и запущен UART1.

Не понятно почему, но только так у меня заработало.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB