Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART stm32f2xx по новой ...StdPeriph_Driver
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Acvarif
Пытаюсь запустить передачу по USART используя последнюю версию библиотеки STM32F2xx_StdPeriph_Driver
Все делаю по инструкции. Но USART ничего не передает. Может кто, кому не лень, зметит неточность в инициализации.
Код построил на базе scmRTOS310

Инициализация:
CODE
// 1.
// Enable peripheral clock using the follwoing functions
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

// 3.
// According to the USART mode, enable the GPIO clocks using
// RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS,
// or/and SCLK).

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

// 3.
// Peripheral's alternate function:
// - Connect the pin to the desired peripherals' Alternate
// Function (AF) using GPIO_PinAFConfig() function
// - Configure the desired pin in alternate function by:
// GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
// - Select the type, pull-up/pull-down and output speed via
// GPIO_PuPd, GPIO_OType and GPIO_Speed members
// - Call GPIO_Init() function

GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART1);

// USART1 Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART1 Tx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

// 4.
// Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware
// flow control and Mode(Receiver/Transmitter) using the USART_Init()
// function.

/* USARTx configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/

USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);

// 5.
// For synchronous mode, enable the clock and program the polarity,
// phase and last bit using the USART_ClockInit() function.

// 6.
// Enable the NVIC and the corresponding interrupt using the function
// USART_ITConfig() if you need to use interrupt mode.

// 7.
// When using the DMA mode
// - Configure the DMA using DMA_Init() function
// - Active the needed channel Request using USART_DMACmd() function

// 8.
// Enable the USART using the USART_Cmd() function.

USART_Cmd(USART1, ENABLE);

// 9.
// Enable the DMA using the DMA_Cmd() function, when using DMA mode.


Далее по переполнению системного таймера (~5мс):

Код
    
template<> OS_PROCESS void TProc2::Exec()
{
for(;;)
    {
      Timer_B_Ovf.Wait();

      GPIO_SetBits(GPIOB, GPIO_Pin_9);
      Delay(0x0000FF);
      GPIO_ResetBits(GPIOB, GPIO_Pin_9);
      Delay(0x0000FF);

      USART_SendData(USART1, 0x55);

     }
}

Переполнение системного таймера контролируется по GPIO_Pin_9 порта В (все работает)
Flexz
Тактирование включаете на порт А, а работаете с портом Б?
shmur
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART1);

Наверное должен быть GPIOA.
Acvarif
Цитата(shmur @ Dec 26 2011, 11:04) *
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART1);

Наверное должен быть GPIOA.


Большое спасибо. Действительно проглядел. Передача заработала.
Acvarif
Добавил прерывания:
Код
....
//  6.
//  Enable the NVIC and the corresponding interrupt using the function
//  USART_ITConfig() if you need to use interrupt mode.

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
//  7.
//  When using the DMA mode
//  - Configure the DMA using DMA_Init() function
//  - Active the needed channel Request using USART_DMACmd() function

//  8.
// Enable the USART using the USART_Cmd() function.

  // Разрешаем прерывания по приему
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

  USART_Cmd(USART1, ENABLE);


В файлах stm32f2xx_it.h stm32f2xx_it.c добавляю соответственно
Код
void USART1_IRQHandler(void);

Код
/*******************************************************************************
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    USART_SendData(USART1, USART_ReceiveData(USART1));  
  }  
}


Компилятор IAR 6 . Посылаю с компа байт в надежде, что stm32f217 ответит по прерыванию тем же.
Но в результате все глохнет ( Виснет до аппаратного сброса)
Acvarif
Все застревает на
Код
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}


вместо того, чтобы попасть на (USART1_IRQHandler (имеет только прочитать данные и дернуть ногой))
Код
void USART1_IRQHandler(void)
{
  RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);

  GPIOB->ODR ^= GPIO_OTYPER_ODR_9;
}
Но и то не работает. Что за чудеса? Подскажите кому не трудно...
Tolyaha
Цитата(Acvarif @ Dec 26 2011, 13:43) *
Но в результате все глохнет ( Виснет до аппаратного сброса)


Возможно не хватает загрузки адреса таблицы векторов функция NVIC_SetVectorTable();
Acvarif
Цитата(Tolyaha @ Dec 26 2011, 16:43) *
Возможно не хватает загрузки адреса таблицы векторов функция NVIC_SetVectorTable();


Добавил

Код
NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x08000000 );

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


Всеравно виснет на
Код
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}


Где то уже близко ....Но где?
Tolyaha
Попробуйте в опциях компилятора в настройках препроцессора где defined symbol добавить VECT_TAB_FLASH
SSerge
Если компилируете в режиме С++, то обработчики прерываний нужно объявлять с extern "C" чтобы линкер смог поместить их адреса в таблицу векторов.
Tolyaha
Может проблемы с файлом таблицы векторов типа startup_stm32f2xx.s вы его добавили из библиотеки в проект, а нельзя в отладке проследить на какой адрес прыгает по прерыванию, возможно станет понятно.
Acvarif
Цитата(Tolyaha @ Dec 26 2011, 17:47) *
Может проблемы с файлом таблицы векторов типа startup_stm32f2xx.s вы его добавили из библиотеки в проект, а нельзя в отладке проследить на какой адрес прыгает по прерыванию, возможно станет понятно.


Перенес проект один к одному в Keil.
Как ни странно все РАБОТАЕТ как и задумано.

Проектик под Iar в скрепке (не работает).
Посмотрите пожалуйста кому не лень (Iar Arm 6.21).
Acvarif
Все выяснилось. В проекте не хватает файла startup_stm32f2xx.s в котором прописан список векторов прерываний.
Всем спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.