Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2020, 20:09

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: USART2 на STM32F4xx
СообщениеДобавлено: 04 июл 2012, 16:27 
Здравствуйте!

Зарегистрирован: 04 июл 2012, 15:44
Сообщения: 2
Новичок в работе с STM32. Второй день бьюсь с простенькой задачей - выслать что-нибудь на ПК через USART. С библиотеками не работал, поэтму настраивал через регистры. Получилось следующее:
Код:
#include <stm32F4xx.h>

void Sleep(int);
void UARTInit(void);
void transmit(char);

int main(void)
{
   char k='A';   
   SystemInit();              
   UARTInit();

   while(1)
   {
      transmit(k++ & 0xFF);
      Sleep(5000000);
   }
}

void Sleep(int ticks)
{
   while(ticks)
      ticks--;
}

void UARTInit(void)         //настройка USART2
{
   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //разрешить тактирование порта A
   RCC->APB1ENR |= RCC_APB1ENR_USART2EN;   //разрешить тактирование альтернативной функции
   
   GPIOA->MODER |= 0x02<<4; //PA2 - alternate function mode
   GPIOA->MODER |= 0x02<<6; //PA3 - alternate function mode         

   GPIOA->AFR[0] |= 0x07<<8;    //AF7 для PA2
   GPIOA->AFR[0] |= 0x07<<12;    //AF7 для PA3
      
   USART2->CR1 |= 0x01<<13;     //UE вкл., UART доступен
   
   USART2->BRR |= 0x445C;   //скорость обмена - 9600 бит/с при 168 МГц

   USART2->CR1 |= 0x01<<3; //TE вкл., передатчик доступен
   USART2->CR1 |= 0x01<<2; //RE вкл., приемник доступен
}

void transmit(char symb)
{
   while (!(USART2->SR & 0x01<<7)); //ждем, когда освободится передатчик
   USART2->DR = symb;       //передача данных
}


Результат - программа не работает. Помогите, плз., отыскать ошибку. Хочется "добить" эту задачку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 04 июл 2012, 16:47 
Старожил
Аватара пользователя

Зарегистрирован: 27 апр 2011, 07:50
Сообщения: 404
Для таких начинающих самый верный вариант - использование библиотеки периферии + многочисленные примеры к ней.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 06 июл 2012, 10:09 
Здравствуйте!

Зарегистрирован: 04 июл 2012, 15:44
Сообщения: 2
011119xx писал(а):
Для таких начинающих самый верный вариант - использование библиотеки периферии + многочисленные примеры к ней.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 06 июл 2012, 16:13 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
STM32F407 100pin (discovery)

Код:
void UART2Init(void)
{

   GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    // 1.
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); // 2.

   GPIO_PinAFConfig  ( GPIOD, GPIO_PinSource5 , GPIO_AF_USART2) ;
   GPIO_PinAFConfig  ( GPIOD, GPIO_PinSource6 , GPIO_AF_USART2) ;   
   // 
   //     //  Tx
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // alternate function!
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP ;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
   ////

   //     // Rx
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
   //
     USART_InitStructure.USART_BaudRate = 9600;
     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(USART2, &USART_InitStructure);

   USART_Cmd(USART2, ENABLE); // enable USART2

}


void SendStringUSART2(const char *str)
{
   while(*str != '\0')
   {
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
        USART_SendData(USART2, *str++);
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 12:38 
Здравствуйте!

Зарегистрирован: 21 сен 2012, 12:25
Сообщения: 3
dima2611 писал(а):
STM32F407 100pin (discovery)

Код:
void UART2Init(void)
{

   GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    // 1.
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); // 2.

   GPIO_PinAFConfig  ( GPIOD, GPIO_PinSource5 , GPIO_AF_USART2) ;
   GPIO_PinAFConfig  ( GPIOD, GPIO_PinSource6 , GPIO_AF_USART2) ;   
   // 
   //     //  Tx
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // alternate function!
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP ;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
   ////

   //     // Rx
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
     GPIO_Init(GPIOD, &GPIO_InitStructure);
   //
     USART_InitStructure.USART_BaudRate = 9600;
     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(USART2, &USART_InitStructure);

   USART_Cmd(USART2, ENABLE); // enable USART2

}


void SendStringUSART2(const char *str)
{
   while(*str != '\0')
   {
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
        USART_SendData(USART2, *str++);
   }
}


Этот код у меня не работает ни через терминал, ни через прогу, написанную в LabView. Подключил все необходимые библиотеки, все компилится, заливается, но дальше дело никак: комп ничего не получает. Все ноги сорок раз перепроверил, настройку RS232 тоже. С чем еще может быть связана проблема?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 12:47 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
Цитата:
Все ноги сорок раз перепроверил

на ногах осциллографом смотрели? Тихо?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 13:05 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
В примере пины инициализируются вот так:

Код:
/* Configure USART Tx and Rx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
  GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
  GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 14:51 
Здравствуйте!

Зарегистрирован: 21 сен 2012, 12:25
Сообщения: 3
dima2611 писал(а):
Цитата:
Все ноги сорок раз перепроверил

на ногах осциллографом смотрели? Тихо?


Угу, тихо. Правда, наблюдалось забавное явление: уходил буквально на час на обед, отключил питание, вернулся - осцилл показывает то, что надо, но передача через терминал и LabView опять не идет. (Отправлял вместо строки 1 символ). Перепрошил тем же hex-ом - и о, чудо, снова ничего. Мозг сломан теперь еще и вопросом, что это было?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 14:59 
Здравствуйте!

Зарегистрирован: 21 сен 2012, 12:25
Сообщения: 3
Steel.ne писал(а):
В примере пины инициализируются вот так:

Код:
/* Configure USART Tx and Rx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
  GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
  GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);


Не могу сообразить, в каком файле определены USART2_TX_PIN, USART2_RX_PIN


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 15:11 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
_NJ_ писал(а):
dima2611 писал(а):
Цитата:
Все ноги сорок раз перепроверил

на ногах осциллографом смотрели? Тихо?


Угу, тихо. Правда, наблюдалось забавное явление: уходил буквально на час на обед, отключил питание, вернулся - осцилл показывает то, что надо, но передача через терминал и LabView опять не идет. (Отправлял вместо строки 1 символ). Перепрошил тем же hex-ом - и о, чудо, снова ничего. Мозг сломан теперь еще и вопросом, что это было?

Вы проект сами собирали или взяли готовый? Если первое, возьмите готовый (есть с мигающими светодиодами) и вставьте уарт туда. Так будет гарантина, что там нет брящего вочдога или ещё чего-то.

Про пины. Если в Кайле и в настройках проекта в регистре OUTPUT помечено browsing information, то клик правой мышкой на объект, потом "Go to definition of...". А то иначе Кайла не находит по поиску такие вещи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 18:51 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1589
Откуда: Киев
_NJ_ писал(а):
Steel.ne писал(а):
В примере пины инициализируются вот так:

Код:
/* Configure USART Tx and Rx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN;
  GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
  GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);


Не могу сообразить, в каком файле определены USART2_TX_PIN, USART2_RX_PIN



Это из примеров к библиотеке "STM32F4 DSP and standard peripherals library, including 82 examples for 26 different peripherals and template project for 5 different IDEs". Рекомендую скачать и почитать. Там же есть примеры к дискавери.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 21 сен 2012, 19:31 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
И вообще, товарищи, СТМ32 не АВР. Инициализация привычных вещей в разы сложнее (много всего надо включить/переключить).
Всегда отталкивайтесь от готовых примеров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 26 сен 2012, 12:37 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
dima2611 писал(а):
И вообще, Всегда отталкивайтесь от готовых примеров.

ну и взял я готовый пример, снес весь код и оставил голый Main. Начинаю компиляцию у меня жалуется на объектный файл. Как тут быть?
а с нуля запустить IAR ваще приводит в бешенство)) .
КEIL я так и не смог настроить ни разу.

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: USART2 на STM32F4xx
СообщениеДобавлено: 26 сен 2012, 13:09 
Старожил

Зарегистрирован: 14 мар 2012, 13:58
Сообщения: 1727
yazimma писал(а):
dima2611 писал(а):
И вообще, Всегда отталкивайтесь от готовых примеров.

ну и взял я готовый пример, снес весь код и оставил голый Main. Начинаю компиляцию у меня жалуется на объектный файл. Как тут быть?
а с нуля запустить IAR ваще приводит в бешенство)) .
КEIL я так и не смог настроить ни разу.

Может, слишком много снесли :) Как жалуется? Типа reference for (XXX) not found in YYYY.o?


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


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


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

Сейчас этот форум просматривают: sed_alex


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB