|
Проблема с USARTами для STM32F207 |
|
|
|
Sep 9 2013, 15:51
|
Частый гость
 
Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107

|
Работал с 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);
Где собака порылась? Что я делаю неправильно?
Сообщение отредактировал IgorKossak - Sep 9 2013, 19:05
Причина редактирования: лишние пробельные строки
|
|
|
|
|
 |
Ответов
|
Sep 9 2013, 17:46
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309

|
Цитата(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 надо это изъять.
Сообщение отредактировал controller_m30 - Sep 9 2013, 17:57
|
|
|
|
|
Sep 9 2013, 17:58
|
Частый гость
 
Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107

|
Цитата(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).
Сообщение отредактировал IgorKossak - Sep 9 2013, 19:06
Причина редактирования: лишние пробельные строки
|
|
|
|
|
Sep 9 2013, 18:07
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309

|
Цитата(A.Lex @ Sep 9 2013, 20:58)  Не согласен. В файле stm32f2xx_usart.c сказано: Я сначала нашел просто ошибочную строчку, и написал про неё пост. А потом глянул в даташит, и переписал уже совсем правильно Цитата(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 работать оно конечно не будет.
Сообщение отредактировал controller_m30 - Sep 9 2013, 18:20
|
|
|
|
|
Sep 10 2013, 09:16
|
Частый гость
 
Группа: Участник
Сообщений: 138
Регистрация: 27-12-11
Пользователь №: 69 107

|
Увы, не помогло  Но ВЫ правы: инициализация проходит только для USART6 Вопрос решен: виноват я, буквы внимательно читать надо. Было RCC_AHB1PeriphClockCmd, надо RCC_APB1PeriphClockCmd
Сообщение отредактировал A.Lex - Sep 10 2013, 11:15
|
|
|
|
|
Sep 10 2013, 11:10
|
Частый гость
 
Группа: Свой
Сообщений: 116
Регистрация: 2-03-07
Из: Украина
Пользователь №: 25 826

|
Было так Цитата 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 Хотя я посмотрел там делитель не выключается и последнее наверно не важно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|