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

 
 
 
Reply to this topicStart new topic
> USART stm32f2xx по новой ...StdPeriph_Driver
Acvarif
сообщение Dec 26 2011, 06:52
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Пытаюсь запустить передачу по 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 порта В (все работает)

Сообщение отредактировал IgorKossak - Dec 26 2011, 08:48
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
Flexz
сообщение Dec 26 2011, 07:03
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Тактирование включаете на порт А, а работаете с портом Б?
Go to the top of the page
 
+Quote Post
shmur
сообщение Dec 26 2011, 07:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553



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

Наверное должен быть GPIOA.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 26 2011, 07:18
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(shmur @ Dec 26 2011, 11:04) *
GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART1);

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


Большое спасибо. Действительно проглядел. Передача заработала.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 26 2011, 11:43
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Добавил прерывания:
Код
....
//  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 ответит по прерыванию тем же.
Но в результате все глохнет ( Виснет до аппаратного сброса)
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 26 2011, 13:18
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Все застревает на
Код
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;
}
Но и то не работает. Что за чудеса? Подскажите кому не трудно...

Сообщение отредактировал Acvarif - Dec 26 2011, 13:22
Go to the top of the page
 
+Quote Post
Tolyaha
сообщение Dec 26 2011, 13:43
Сообщение #7


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

Группа: Свой
Сообщений: 116
Регистрация: 2-03-07
Из: Украина
Пользователь №: 25 826



Цитата(Acvarif @ Dec 26 2011, 13:43) *
Но в результате все глохнет ( Виснет до аппаратного сброса)


Возможно не хватает загрузки адреса таблицы векторов функция NVIC_SetVectorTable();
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 26 2011, 13:48
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(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)
  {
  }
}


Где то уже близко ....Но где?
Go to the top of the page
 
+Quote Post
Tolyaha
сообщение Dec 26 2011, 14:16
Сообщение #9


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

Группа: Свой
Сообщений: 116
Регистрация: 2-03-07
Из: Украина
Пользователь №: 25 826



Попробуйте в опциях компилятора в настройках препроцессора где defined symbol добавить VECT_TAB_FLASH
Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 26 2011, 14:22
Сообщение #10


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

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



Если компилируете в режиме С++, то обработчики прерываний нужно объявлять с extern "C" чтобы линкер смог поместить их адреса в таблицу векторов.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Tolyaha
сообщение Dec 26 2011, 14:47
Сообщение #11


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

Группа: Свой
Сообщений: 116
Регистрация: 2-03-07
Из: Украина
Пользователь №: 25 826



Может проблемы с файлом таблицы векторов типа startup_stm32f2xx.s вы его добавили из библиотеки в проект, а нельзя в отладке проследить на какой адрес прыгает по прерыванию, возможно станет понятно.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 26 2011, 14:59
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Tolyaha @ Dec 26 2011, 17:47) *
Может проблемы с файлом таблицы векторов типа startup_stm32f2xx.s вы его добавили из библиотеки в проект, а нельзя в отладке проследить на какой адрес прыгает по прерыванию, возможно станет понятно.


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

Проектик под Iar в скрепке (не работает).
Посмотрите пожалуйста кому не лень (Iar Arm 6.21).

Сообщение отредактировал Acvarif - Dec 26 2011, 15:00
Прикрепленные файлы
Прикрепленный файл  TestStm32f217_IarArmPrj.rar ( 422.43 килобайт ) Кол-во скачиваний: 20
 
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Dec 27 2011, 07:18
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Все выяснилось. В проекте не хватает файла startup_stm32f2xx.s в котором прописан список векторов прерываний.
Всем спасибо.
Go to the top of the page
 
+Quote Post

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

 


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


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