Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с USARTами для STM32F207
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
A.Lex
Работал с USARTами для STM32F100 и STM32L152 - работают нормально, а с STM32F207 не получается.
Из инициализированных USART2, UART4 и USART6 работает только USART6.
CODE



RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); // for USART1 and USART6
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG
| RCC_APB1Periph_USART2 | RCC_APB1Periph_UART4, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

// USART2 Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
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);
// USART2 Tx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
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);


PWR_WakeUpPinCmd(DISABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_UART4);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_UART4);

// USART4 Tx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
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);

// USART4 Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
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);

GPIO_PinAFConfig(GPIOG, GPIO_PinSource9, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_USART6);

// USART6 Rx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
// USART6 Tx
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &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_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(UART4, &USART_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(USART6, &USART_InitStructure);

USART_Cmd(USART2, ENABLE);
USART_Cmd(UART4, ENABLE);
USART_Cmd(USART6, ENABLE);
//=========

USART6->DR = SData;

while (USART_GetFlagStatus(USART6, USART_FLAG_TC) == RESET)
{}
USART_ClearFlag(USART6, USART_FLAG_TC);
USART_ClearFlag(USART6, USART_FLAG_TXE);


UART4->DR = SData;

while (USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET)
{}
USART_ClearFlag(UART4, USART_FLAG_TC);
USART_ClearFlag(UART4, USART_FLAG_TXE);

USART2->DR = SData;

while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
{}
USART_ClearFlag(USART2, USART_FLAG_TC);
USART_ClearFlag(USART2, USART_FLAG_TXE);



Где собака порылась?
Что я делаю неправильно?
controller_m30
Цитата(A.Lex @ Sep 9 2013, 18:51) *
Из инициализированных USART2, UART4 и USART6 работает только USART6.

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); // for USART1 and USART6
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG
| RCC_APB1Periph_USART2 | RCC_APB1Periph_UART4, ENABLE);
То что выделено, должно быть
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_UART4, ENABLE).
UART2, UART4 разрешаются через регистр APB1, а не через AHB1. А из AHB1 надо это изъять.


A.Lex
Цитата(controller_m30 @ Sep 9 2013, 20:46) *
То что выделено, должно быть вместе с первой строчкой, там где разрешаются клоки для APB2 (а не там где AHB1)

Получается, что клок для USART2 и USART4 не был разрешен, вот они и не работают.


Не согласен. В файле stm32f2xx_usart.c сказано:

* =============================================
* How to use this driver
* =============================================
* 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.
*
* 2. According to the USART mode, enable the GPIO clocks using
* RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS,
* or/and SCLK).
controller_m30
Цитата(A.Lex @ Sep 9 2013, 20:58) *
Не согласен. В файле stm32f2xx_usart.c сказано:

Я сначала нашел просто ошибочную строчку, и написал про неё пост. А потом глянул в даташит, и переписал уже совсем правильно cool.gif
Цитата(A.Lex @ Sep 9 2013, 20:58) *
2. According to the USART mode, enable the GPIO clocks using
* RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS,
* or/and SCLK)
То имеется ввиду, что для разрешения выводов контроллера (I/O, TX, RX, и т.д.) нужно сначала разрешить клоки GPIO - потому что TX, RX и т.д. являются альтернативной функцией ножек GPIO.
Т.е. чтоб работали альтернативные функции GPIO, нужно сначала разрешить клок GPIO. Ну а клок GPIO разрешается в RCC_AHB1.

PS. Если не разрешить клок UARTx, то он и не инициализируется, и все его регистры сохраняют нулевое значение несмотря на запись в него настроек.
А то, что для ног GPIO выбраны альтернативной функцией выводы UART - вовсе не обязывает UART работать. На ножках GPIO будет какое-то состояние, но по причине выключенного модуля UART работать оно конечно не будет.
A.Lex
Увы, не помогло sad.gif
Но ВЫ правы: инициализация проходит только для USART6

Вопрос решен: виноват я, буквы внимательно читать надо. Было RCC_AHB1PeriphClockCmd, надо RCC_APB1PeriphClockCmd
Tolyaha
Было так
Цитата
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG
| RCC_APB1Periph_USART2 | RCC_APB1Periph_UART4, ENABLE);
А теперь сделали так?
Цитата
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB1Periph_USART4, ENABLE);
Должно помочь у меня на STM32F4 работает
Сама APB1 тактируется?
Код
RCC_PCLK1Config(RCC_HCLK_Div2);//PCLK1 = HCLK/2

Хотя я посмотрел там делитель не выключается и последнее наверно не важно.
A.Lex
Да, теперь так и работает. Проблему создал сам sad.gif Спасибо всем за помощь!


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.