Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: недогоняю про UART STM32 103
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Tanker
Здравствуйте!
побаловался с Primer2 (в основном с экранчиком), и решил сделать первый реальный продакт на кортексе от STM, выбрал 103-й, вот он запаян на первой итерации девайса, и я уже моргаю светками по прерываниям таймера (прогу заливаю по UART1 флэшером от STM), следующй шаг - связь, пытаюсь, чтобы понять основы, сделать - ЭХО, т.е. отправляю ему байтик, он мне его же обратно отсылает.
пишу следующий обработчик прерывания:
Код
void USART1_IRQHandler(void)
{
  vu16 Echo;
  static vu8 i = 0;
  
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE | USART_IT_TXE);//почистил все битики прерываний от уарта
    Echo = USART_ReceiveData(USART1);//получил пришедшие данные
    USART_SendData(USART1, Echo);//и отправляю их обратно
  }
  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {  
    USART_ClearITPendingBit(USART1, USART_IT_TXE | USART_IT_TC);//попав в прерывания по ТХ, просто чищу битики, чтобы более сюда не заходить
  }
//контроль захода в прерывание
  if (i == 0) {
    GPIO_WriteBit(GPIOB, GPIO_Pin_6 , Bit_SET);
    i = 1;
  }
  else {
    GPIO_WriteBit(GPIOB, GPIO_Pin_6 , Bit_RESET);
    i = 0;
  }
}


выяснил, что проц выполняет заход в прерывание юарта сразу после ребута, хотя в инициализации я зачищаю все источники прерывания по уарту
Код
USART_ClearITPendingBit(USART1, USART_IT_RXNE | USART_IT_TXE);
  /* Enable USART1 Receive and Transmit interrupts */
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);


а самое прикольное, что написанный выше обработчик прерывания вызывает зависание проца ! какой-то флажок - инициатор прерывания не сбрасывается, и интерраптица постоянно...

ЭХО (1 раз) я получал, но для этого я (как в многочисленных примерах) запрещал прерывания по RX когда отправляю байтик, и запрещал прерывания по TX перед приёмом байтика, далее все прерывания оказывались заблокированными и эхо больше не появлялось

все экзамплы пересмотрел и док вроде перекурил, я конечно делаю по своему, но не с понталыку (и на LPC у меня есть 2 проекта, где обмен по всем 4-м уартам чуть ли не основная функция девайсов)
в общем чо не так делаю? ткните пальцем.
miksher
Вот пример все работает по USART1




Код
//******************************** Обработчик прерывания Usart1 ***********************************

void Interrupt_Usart1(void)
{
  //****************** Output если передался байт ******************************
  if (USART1_SR_bit.TC == 1 && USART1_CR1_bit.TCIE == 1)
  {//передача следующего байта
    usart_count++;
    if (usart_count < num_byte_out)
    {
      USART1_DR = usart_data_output[usart_count] & 0x1FF;
      if (usart_count >= num_byte_out-1)
      {
        usart_count = 0;
        USART1_CR1_bit.RXNEIE = 1;              // разрешение прерывания когда Read Data Register не пуст (Input)
        USART1_CR1_bit.TCIE = 0;                // запрешеним прерывания когда передача байта закончится (Output)
      }
    }
    USART1_SR_bit.TC = 0;
  }
  //************** Input если на входе появились данные (байт) *****************
  if (USART1_SR_bit.RXNE == 1 && USART1_CR1_bit.RXNEIE == 1)            
  {// считывание очередного байта
    if (usart_count < 4)
    {
      usart_data_input[usart_count] = USART1_DR;
      usart_count++;
      flag_start_input_usart = 1;
    }else
        { // если считана вся последовательность байт
          usart_data_input[usart_count] = USART1_DR;
          flag_start_input_usart = 0;
          
          usart_count = 0;
        }
    USART1_SR_bit.RXNE = 0;
  }
}



А инициализация проходит следующим образом:
Код
//****************** Инициализация Usart1 *********************************************************

void Usart1Init(void)
{
  // инизиализация clocks и pins
  RCC_APB2ENR_bit.USART1EN = 1;           // включаем clock к usart1
  RCC_APB2RSTR_bit.USART1RST = 0;         // сброс Usart1
  RCC_APB2ENR_bit.IOPAEN = 1;             // включаем clock к GPIOA
  RCC_APB2ENR_bit.AFIOEN = 1;             // включаем clock к AFIOEN  
  RCC_APB2RSTR_bit.IOPARST = 0;           // сброс GPIOA
  RCC_APB2RSTR_bit.AFIORST = 0;           // сброс AFIO
  
  AFIO_MAPR_bit.USART1_REMAP = 0;         // TX/PA9, RX/PA10
//  GPIOA_BRR_bit.BR9 = 1;                  // сброс выходного буферного регистра порта
//  GPIOA_BRR_bit.BR10 = 1;                 // сброс выходного буферного регистра порта
  GPIOA_CRH_bit.MODE9 = 3;                // TX - output - Output mode, max speed 50 MHz.
  GPIOA_CRH_bit.CNF9 = 2;                 // TX - output - Alternate function output Push-pull
  GPIOA_CRH_bit.MODE10 = 0;               // RX - input - Input mode (reset state)
  GPIOA_CRH_bit.CNF10 = 1;                // RX - input - Floating input (reset state)
  
//---------- инизиализация USART - CR1 -----------------------------------------
  USART1_CR1_bit.UE = 0;                  // USART prescaler and outputs disabled
  USART1_CR1_bit.M = 0;                   // 1 Start bit, 8 Data bits, n Stop bit
  USART1_CR1_bit.PCE = 0;                 // Parity control disabled
  USART1_CR1_bit.TE = 1;                  // Transmitter is enabled
  USART1_CR1_bit.RE = 1;                  // Receiver is enabled and begins searching for a start bit  
//---------- инизиализация USART - CR2 -----------------------------------------
  USART1_CR2_bit.STOP = 0;                // 1 Stop bit
  USART1_CR2_bit.CLKEN = 0;               // SCLK pin disabled
  USART1_CR2_bit.CPOL = 0;                // Steady low value on SCLK pin outside transmission window
  USART1_CR2_bit.CPHA = 0;                // The first clock transition is the  first data capture edge
  USART1_CR2_bit.LBCL = 0;                // The clock pulse of the last data bit is n ot o utput to the SCLK pin.
//---------- инизиализация USART - CR3 -----------------------------------------
  USART1_CR3_bit.CTSE = 0;                // CTS hardware flow control disabled
  USART1_CR3_bit.RTSE = 0;                // RTS hardware flow control disabled
  //11718.75
  //USART1_BRR_bit.DIV_Mantissa = 64;
  //USART1_BRR_bit.DIV_Fraction = 0;
  //9600
  USART1_BRR_bit.DIV_Mantissa = 78;
  //USART1_BRR_bit.DIV_Fraction = 0;
  USART1_BRR_bit.DIV_Fraction = 2;
  
  
  
  USART1_CR1_bit.TXEIE = 0;               // разрешение прерывания когда Transmit Data Register пуст (Output)
  USART1_CR1_bit.RXNEIE = 1;              // разрешение прерывания когда Read Data Register не пуст (Input)
  USART1_CR1_bit.PEIE = 1;
  USART1_CR1_bit.TCIE = 0;
  USART1_CR1_bit.IDLEIE = 0;
  USART1_CR2_bit.LBDIE = 0;
  USART1_CR3_bit.CTSIE = 0;
  USART1_CR3_bit.EIE = 0;
  
  USART1_CR1_bit.UE = 1;                  // ВКЛЮЧАЕМ USART1
  
  
  
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.