реклама на сайте
подробности

 
 
> UART2 на STM32F100C4 сплошные глюки :')
Bob176
сообщение Aug 28 2012, 07:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870




Не могу понять в чём дело.. процессор STM32F100C4 инициализирую при помощи файла STM32_Init.c
пытаюсь принять и передать байты по прерываниям...

принимать удаётся, только все принятые данные почему то смещены на 0х80
т.е. если передается
1 то принимаю 129 (0х81)
2 то принимаю 130 (0х82)
и Т.Д.

а вот передать через прерывание вообще не получается...
точнее .. если не через прерывания, то байт передаётся.. правда данные искажены..
если ставлю галочку в мастере TXE Interrupt Enable , по вообще всё виснет

помогите разобраться



инициализирую теперь так:
Код
                    void USART_configuration(void)
{
  //Включение тактирования
  RCC->APB2ENR |=   RCC_APB2ENR_IOPAEN;                //Тактирование GPIO
  RCC->APB2ENR |=   RCC_APB2ENR_AFIOEN;                //Тактирование альтернативных функций GPIO
  RCC->APB1ENR |=   RCC_APB1ENR_USART2EN;              //Тактирование USART2
  //Конфигурирование PORTA.2 для TX; PORTA.3 для RX
      GPIOA->CRL   &= ~(0xFFUL  << 8);                      // Clear PA2, PA3
      GPIOA->CRL   |=  (0x0BUL  << 8);                      // USART2 Tx (PA2)  alternate output push-pull
      GPIOA->CRL   |=  (0x04UL  << 12);                     // USART2 Rx (PA3)  input floating

  //Задание режима работы
  USART2->BRR   =   0x0341;                            //Cкорость обмена 9600 бод
  USART2->CR1  &=  ~USART_CR1_M;                       //8 бит данных
  USART2->CR2  &=  ~USART_CR2_STOP;                    //Предочистка числа стоп-битов
  USART2->CR2  |=   USART_CR2_STOP_0;                  //Количество стоп-битов: 2
  //Управление работой
  USART2->CR1  |=   USART_CR1_UE;                      //Включение модуля USART2
  USART2->CR1  |=   USART_CR1_TE;                      //Включение передатчика
  USART2->CR1  |=   USART_CR1_RE;                      //Включение приемника
  //Разрешить прерывания
  //NVIC_EnableIRQ (USART2_IRQn);                        //Прерывания USART2
  // USART2->CR1  |= USART_CR1_TCIE;                      //Прерывание по завершении передачи
  USART2->CR1  |= USART_CR1_RXNEIE;                    //Прерывание по завершении приема
NVIC->ISER[1]  = (1 << (USART2_IRQn & 0x1F));   // enable interrupt

  USART_ITConfig(USART2, USART_IT_TC, DISABLE);
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);


прерывание

Код
           void USART2_IRQHandler(void)
{                  
  volatile unsigned int IIR;
    
       IIR = USART2->SR;

if(IIR & USART_IT_RXNE)  
   {
   USART2->SR &= ~USART_IT_RXNE;              // clear interrupt
    
        if(usart2.rxcnt>(BUF_SZ-2))    usart2.rxcnt=0;
              
    usart2.buffer[usart2.rxcnt++] =  USART_ReceiveData (USART2);

                  
        usart2.delay=0;

if(usart2.rxcnt>7)usart2.rxgap=1;       // принял всю посылку
    }


ф-я маin

Код
stm32_Init ();       // STM32 setup

USART_configuration();
while (1)
  {      
    if(usart2.rxgap==1)                        
      {        
        //   if (usart2.buffer[0]==129)
          // {      
                GPIOB->BSRR = GPIO_Pin_1; // передача        
    
//       rx_Data=usart2.buffer[1];


        //USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
        // USART_ITConfig(USART2, USART_IT_TC, ENABLE);
            Delay(100);
    
            USART_SendData(USART2, 1);

               
       usart2.rxcnt=0;
       usart2.rxtimer=0;
       usart2.delay=0;
       usart2.rxgap=0;
   GPIOB->BRR = GPIO_Pin_1;
      }


приём остался таким же
1 то принимаю 129 (0х81)
2 то принимаю 130 (0х82)
и Т.Д.

а при передаче байта отправляется мусор !!!

и тоже если в конфигурации разрешить
USART2->CR1 |= USART_CR1_TCIE; //Прерывание по завершении передачи
то уже ничего не принимает ... похоже висит.


посоветуйте, что проверить? как ещё настроить?

осциллографом смотрел, битики при передаче бегут rolleyes.gif до ST485 доходят crying.gif
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 14)
hatchet
сообщение Aug 28 2012, 08:26
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 13-08-12
Пользователь №: 73 111



Попробуйте настроить UART через стандартную stm'овскую либу.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 28 2012, 09:49
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Зря Вы в обработчике прерываний USART_IT_RXNE используете, эти ..... его очень оригинально определили.
И он нифига не совпадает ни с USART_SR_RXNE ни с USART_FLAG_RXNE.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
PoReX
сообщение Aug 28 2012, 13:31
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 1-05-09
Из: Ростов-на-Дону
Пользователь №: 48 518



Вы там случаем контролем четности не балуетесь? А тож смотрите, если он включен, то данных будет 7 бит, а восьмой бит четности.


--------------------
«У современных мобильных телефонов такая же вычислительная мощь, что и у компьютеров NASA в 60-е годы. И в то время этого хватало, чтобы запустить человека в космос, а сегодня — только чтобы запускать птиц в свиней.»
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 28 2012, 13:49
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(PoReX @ Aug 28 2012, 17:31) *
Вы там случаем контролем четности не балуетесь? А тож смотрите, если он включен, то данных будет 7 бит, а восьмой бит четности.

laughing.gif нет не балуюсь, не дошёл ещё до чётности, но Вы правы, на это надо обратить внимание. сегодня вечером займусь cranky.gif
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 29 2012, 05:28
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Ну что же помоему до меня дошло rolleyes.gif


я тактирую от внутреннего генератора 8 МГц. похоже отсуда и все глюки!!!

как считает общественность?

у меня стоит на макетке 32кГц внешний кварц Можно ли им обойтись?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 29 2012, 05:42
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Bob176 @ Aug 29 2012, 09:28) *
я тактирую от внутреннего генератора 8 МГц. похоже отсуда и все глюки!!!
как считает общественность?

Тактирую от него же, глюков нет. По паспорту, да и по жизни отклонение частоты внутреннего генератора - в допустимых пределах для UART. Кстати, это несложно проверить осциллографом: измерьте частоту следования битов.
Go to the top of the page
 
+Quote Post
spectral1989
сообщение Aug 29 2012, 06:03
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 5-04-12
Из: Томск
Пользователь №: 71 210



какой терминал и все ли там правильно стоит? baudrate, stop bits, data bits, parity
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 29 2012, 06:24
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Bob176 @ Aug 29 2012, 08:28) *
у меня стоит на макетке 32кГц внешний кварц Можно ли им обойтись?

Нельзя.
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 29 2012, 08:32
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(scifi @ Aug 29 2012, 08:42) *
Тактирую от него же, глюков нет.

crying.gif
Цитата(scifi @ Aug 29 2012, 08:42) *
Кстати, это несложно проверить осциллографом: измерьте частоту следования битов.

... хорошо измерю ...
Цитата(spectral1989 @ Aug 29 2012, 09:03) *
какой терминал и все ли там правильно стоит? baudrate, stop bits, data bits, parity


.. Терминал проверенный и стоит там всё правильно!

неужели проблема в железе ... wacko.gif

может у кого найдётся рабочий пример UARTа на stm32F100C4 ?
не важно на прерываниях или без ..

Сообщение отредактировал Bob176 - Aug 29 2012, 08:35
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 29 2012, 09:16
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Bob176 @ Aug 29 2012, 12:32) *
может у кого найдётся рабочий пример UARTа на stm32F100C4 ?

Пожалуйста:
CODE
#include "uart.h"
#include "stm32f1regs.h"
#include "assert_static.h"

#define USART_BASE USART3_BASE
#define USART_SR REG32(USART_BASE + 0)
#define USART_DR REG32(USART_BASE + 4)
#define USART_BRR REG32(USART_BASE + 8)
#define USART_CR1 REG32(USART_BASE + 0xC)
#define USART_CR2 REG32(USART_BASE + 0x10)
#define USART_CR3 REG32(USART_BASE + 0x14)

#define TXFIFOSIZE 32
#define RXFIFOSIZE 32
#define BAUDREG (24000000 / 100000) /* 100 kbps @ 24 MHz */

static uint8_t txfifo[TXFIFOSIZE];
static uint8_t volatile rxfifo[RXFIFOSIZE];
static unsigned int volatile txtail, rxhead;
static unsigned int txhead, rxtail;

void
uart_init(int prio)
{
assert_static(IS_PWR_OF_TWO(TXFIFOSIZE));
assert_static(IS_PWR_OF_TWO(RXFIFOSIZE));
REGBIT(RCC_APB1ENR, 18) = 1; /* enable clocking of USART3 */
REGBIT(RCC_APB2ENR, 3) = 1; /* enable clocking of PORT B */
USART_BRR = BAUDREG;
USART_CR1 = (1 << 13) /* USART enable */
| (1 << 5) /* RXNE irq enable */
| (1 << 3) /* transmitter enable */
| (1 << 2);/* receiver enable */
USART_CR3 = 8; /* select half duplex */
NVIC_IP[39 / 4] |= (prio << (9 * (39 % 4)));
NVIC_SETENA1 = (1 << (39 - 32));
/* configure PB10 as alternate function push-pull 2 MHz */
GPIOB_CRH = (GPIOB_CRH & 0xFFFFF0FF) | 0x00000A00;
}

__root void
usart_irq_handler(void)
{
uint32_t status;
status = USART_SR;
if (status & (1 << 5)) /* RXNE */
{
int head;
head = rxhead;
if ((head - rxtail) != RXFIFOSIZE)
{
rxfifo[head & (RXFIFOSIZE - 1)] = USART_DR;
rxhead = head + 1;
}
else
{
(void)USART_DR;
}
}
if (status & (1 << 7)) /* TXE */
{
int tail;
tail = txtail;
if (txhead != tail)
{
USART_DR = txfifo[tail & (TXFIFOSIZE - 1)];
txtail = tail + 1;
}
else
{
USART_CR1 &= ~(1 << 7); /* disable TXNE irq */
}
}
}

int
uart_txfree(void)
{
return TXFIFOSIZE - (txhead - txtail);
}

int
uart_txfull(void)
{
return txhead - txtail;
}

void
uart_putbyte(uint8_t byte)
{
while (uart_txfree() == 0)
{
/* wait for free space in Tx FIFO */
}
txfifo[txhead & (TXFIFOSIZE - 1)] = byte;
txhead++;
USART_CR1 |= (1 << 7); /* enable TXNE irq */
}

int
uart_rxcount(void)
{
return rxhead - rxtail;
}

uint8_t
uart_getbyte(void)
{
uint8_t ret;
ret = rxfifo[rxtail & (RXFIFOSIZE - 1)];
rxtail++;
return ret;
}
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 29 2012, 11:59
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(scifi @ Aug 29 2012, 12:16) *
Пожалуйста:

спасибо за пример,
Код
USART_CR3 = 8; /* select half duplex */

может быть в этом проблема ? ... вечером попробую

Сообщение отредактировал Bob176 - Aug 29 2012, 12:02
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 29 2012, 12:33
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Bob176 @ Aug 29 2012, 15:59) *
может быть в этом проблема ? ... вечером попробую

Нет. У меня используется полудуплексный режим. Вам он едва ли понадобится.
И вообще, чтение мануала никто не отменял. Бездумное копирование кода не есть комильфо.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 29 2012, 12:50
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Для scifi
У вас в коде есть строчка
(void)USART_DR;
Как это работает?
Go to the top of the page
 
+Quote Post
Bob176
сообщение Aug 29 2012, 13:21
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 23-01-09
Пользователь №: 43 870



Цитата(scifi @ Aug 29 2012, 15:33) *
У меня используется полудуплексный режим. Вам он едва ли понадобится.


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


А бездумное копирование кода - всегда не комильфо laughing.gif


Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 06:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.0158 секунд с 7
ELECTRONIX ©2004-2016