dimon_rub
Sep 10 2016, 07:35
Здравствуйте. 2 день бьюсь с этой проблемой. Вопрос в следующем на при включении терминала и просмотре посылок от STM32 скорость нужно выбирать в 2 раза больше. Почему не понятно. Пробовал понижать/увеличивать частоты - не помогает.
1. STM32F103RC
2. USART1.
3. PPR2 = 64MHz (здесь изменял частоты)
4. Внешний кварц - 16MHz
5. Запись на прямую без DMA
Пожалуйста если можно помогите. (Я новичек - первый проект на STM)
arhiv6
Sep 10 2016, 07:54
Выкладывайте код. Интересует инициализация UART.
dimon_rub
Sep 10 2016, 08:10
Вод код инициализации UART1
CODE
void USART1_UART_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART1_.USART_BaudRate = 9600;
USART1_.USART_WordLength = USART_WordLength_8b;
USART1_.USART_StopBits = USART_StopBits_1;
USART1_.USART_Parity = USART_Parity_No;
USART1_.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART1_.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1, &USART1_);
USART_Cmd(USART1, ENABLE);
}
arhiv6
Sep 10 2016, 08:17
Вроде всё нормально. Покажите как настраиваете тактирование.
dimon_rub
Sep 10 2016, 08:21
Инициализация
CODE
void init_(void)
{
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
ErrorStatus HSEStartUpStatus;
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS){
FLASH->ACR |= FLASH_ACR_PRFTBE;// Включаем буфер предвыборки FLASH
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); // Конфигурируем Flash на 2 цикла ожидания
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; // Конфигурируем Flash на 2 цикла ожидания
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; // HCLK = SYSCLK
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; // PCLK2 = HCLK
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; // PCLK1 = HCLK
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL8);
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) {/* Ждем*/} // Ожидаем, пока PLL выставит бит готовности
/* Выбираем PLL как источник системной частоты */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Ожидаем, пока PLL выберется как источник системной частоты */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) {/* Ждем*/}
//RCC->CFGR |= RCC_CFGR_ADCPRE_DIV6; // Предделитель АЦП
//RCC->CFGR |= RCC_CFGR_ADCPRE_DIV4; // Предделитель АЦП
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
}
else
{
}
}
arhiv6
Sep 10 2016, 08:37
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL8); - тактируемся от HSE (16МГц), в PLL умножаем на 8 = 128МГц. Или умножайте на 4, или включите предделитель PLLXTPRE (HSE divider for PLL entry). Хотя странно, что МК вообще заработал - для SYSCLK максимальная частот 72МГц.
dimon_rub
Sep 10 2016, 08:52
Добавил RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL4);
Но это ничего не дает.
В старой конфигурации при выполнении функции RCC_GetClocksFreq(&RCC_ClockFreq);
показывала частоту 64.
arhiv6
Sep 10 2016, 08:55
Теперь Вы входной сигнал поделили на 2 (RCC_CFGR_PLLXTPRE), потом умножили на 4. Итого = 32 МГц. Должно быть:
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL4);
или
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL8);
А функция RCC_GetClocksFreq может вернуть ошибочное значение, если установлено неправильное значение в дефайне HSE_VALUE. У Вас что записано в HSE_VALUE?
dimon_rub
Sep 10 2016, 09:11
Стояло HSE_VALUE= 8000000 исправил.
Сейчас строка в инициализации стоит RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9);
По идее 72. Но проблема не уходит. При выборе в термина 9600 ероглифы при выборе 19200 нормальный тест
gerber
Sep 10 2016, 09:31
"Типовым" значением кварца для данного контроллера является 8 МГц, у вас 16 МГц, и скорость выше в 2 раза тоже. Поэтому вероятно где-то ещё фигурирует "типовое" значение 8 МГц в виде константы, без использования HSE_VALUE. Особенно внимательно посмотрите часть, где вычисляются делители UART DIV_Fraction и DIV_Mantissa. Может, там потеря бита, переполнение при вычислении или что-то в этом духе.
seniorandre
Sep 10 2016, 09:50
Я тоже один раз над по первости весь лоб расшиб, когда у меня тактовая не совпадала, ситуация была аналогична. Оказалось что код инициализации тактовой частоты просто не вызывался. В main() надо было прописать SysnemInit() Это когда я пользовал SPL и стандартные заготовки CoCox. Вы вообще отладчиком попадаете в код который отвечает за инициализацию? А то ведь startup файлы которые вызывают SystemInit(), а есть которые не вызывают и его надо вызвать в Main() лапами.
EugenPKH
Sep 10 2016, 10:02
Цитата(dimon_rub @ Sep 10 2016, 08:35)

Здравствуйте. 2 день бьюсь с этой проблемой. Вопрос в следующем на при включении терминала и просмотре посылок от STM32 скорость нужно выбирать в 2 раза больше. Почему не понятно. Пробовал понижать/увеличивать частоты - не помогает.
1. STM32F103RC
2. USART1.
3. PPR2 = 64MHz (здесь изменял частоты)
4. Внешний кварц - 16MHz
5. Запись на прямую без DMA
Пожалуйста если можно помогите. (Я новичек - первый проект на STM)
Есть два варианта 1. настроена неправильно частота процессора ( проверить вывести на MCO , также надо понимать что у st есть несколько частот SYSCLK APB1(USART2....) APB2(USART1) и они разные ) 2. USART1 неправильно настроен так как он работает от другой шины - проверить USARTDIV = DIV_Mantissa + (DIV_Fraction / 16)
dimon_rub
Sep 10 2016, 10:17
ВЫ БИЛИ ПРАВЫ. На шел числовое значение. ВСЕМ ОГРОМНОЕ СПАСИБО
RusikOk
Sep 11 2016, 00:50
пользуйтесь кубом
Сергей Борщ
Sep 11 2016, 06:31
QUOTE (RusikOk @ Sep 11 2016, 03:50)

пользуйтесь кубом
Лучше головой
RusikOk
Sep 11 2016, 10:19
Цитата(Сергей Борщ @ Sep 11 2016, 09:31)

Лучше головой

оно то лучше но начинать надо с чего то попроще курения 100 томов описания HAL
Сергей Борщ
Sep 11 2016, 19:02
QUOTE (RusikOk @ Sep 11 2016, 13:19)

но начинать надо с чего то попроще курения 100 томов описания HAL
Достаточно одного тома справочного руководства (Reference manual) на свое семейство контроллеров. Просветляет, поверьте.
SasaVitebsk
Sep 11 2016, 20:50
Кстати как раз в кубе инициализация тактовой неполная. И требует правки руками как правило. По крайней мере для 32F4..
Ну а если захочешь какие-нибудь мелочи, или кварц поставил не "тот", то поехал с кубом бороться.
Хотя саму библиотеку посмотреть можно.
У меня сделано так: пытаюсь проинитить кварц -> если не нахожу оного, то запускаюсь от внутреннего и выставляю признак ошибки. Потом тоже и с часовым.
RusikOk
Sep 11 2016, 22:05
Цитата(SasaVitebsk @ Sep 11 2016, 23:50)

Кстати как раз в кубе инициализация тактовой неполная. И требует правки руками как правило. По крайней мере для 32F4..
ну хз. при работе с UART-ом мной таких проблем не выявлено для F103 по крайней мере. зато заметил неправильную инициализацию даты в часах. куб версии 4,9,0
кстати пользуюсь этой версией потому что в более новой невозможно разрешить включение выхода SWO. странный глюк, может политика компании. урезают возможности отладки для дешевых чипов
Цитата(SasaVitebsk @ Sep 11 2016, 23:50)

У меня сделано так: пытаюсь проинитить кварц -> если не нахожу оного, то запускаюсь от внутреннего и выставляю признак ошибки. Потом тоже и с часовым.
о а как такое сделать под HAL. хотел и себе замутить такую штуку но руки не дошли
RusikOk
Sep 15 2016, 11:57
вот западло! только проговорил и вот тебе на! подарочек пол дня провозился с этим ср*ым UART-ом. оказывается при настройке параметров четности адекватно работает только huart1.Init.Parity = UART_PARITY_NONE; все остальное выдает в терминал билиберду. проверял разными программами и UART переходниками
Сергей Борщ
Sep 15 2016, 12:08
QUOTE (RusikOk @ Sep 15 2016, 14:57)

проверял разными программами и UART переходниками
Осциллограф? Не, не слышали...
RusikOk
Sep 15 2016, 12:46
Цитата(Сергей Борщ @ Sep 15 2016, 15:08)

Осциллограф? Не, не слышали...
Н313 Не, не слышали...
Сергей Борщ
Sep 15 2016, 13:39
QUOTE (RusikOk @ Sep 15 2016, 15:46)

Н313
Эти цифры мне ни о чем не говорят. Но если есть осциллограф, то что мешает посмотреть на нем форму сигнала и по букварю опредить - есть в нем ошибка или нет? При чем тут "разные программы и UART переходники"?
Добавлено: посмотрел, это марка осциллографа, аналогового, т.е. без запоминания. Тогда тупо в цикле выводить один и тот же байт с небольшой задержкой, настроить осциллограф в ждущий режим, выводить на скорости 9600, чтобы уж точно попасть в полосу осциллогафа.
RusikOk
Sep 15 2016, 14:39
Цитата(Сергей Борщ @ Sep 15 2016, 16:39)

Эти цифры мне ни о чем не говорят.
в том то и дело
RusikOk
Oct 10 2016, 21:27
Цитата(Сергей Борщ @ Sep 15 2016, 16:39)

Добавлено: посмотрел, это марка осциллографа, аналогового, т.е. без запоминания. Тогда тупо в цикле выводить один и тот же байт с небольшой задержкой, настроить осциллограф в ждущий режим, выводить на скорости 9600, чтобы уж точно попасть в полосу осциллогафа.
ох только увидел. думал уже, что в этом разделе толковых советов не бывает. за ждущий режим спасибо.
для большего понимания всей серьезности ситуации вот
http://radiokot.ru/forum/viewtopic.php?p=1111770#p1111770 и в заключение прочитайте последнюю строчку поста.
smalcom
Nov 3 2016, 10:01
Цитата(RusikOk @ Sep 15 2016, 13:57)

вот западло! только проговорил и вот тебе на! подарочек пол дня провозился с этим ср*ым UART-ом. оказывается при настройке параметров четности адекватно работает только huart1.Init.Parity = UART_PARITY_NONE; все остальное выдает в терминал билиберду. проверял разными программами и UART переходниками
Проблема там, где вам указали - в голове, - а не в осциллографе. Который Н313 и старый... Оно нам надо? На форуме вам зарплату недодают, что вы здесь срываетесь?
Чтение главы о периферийном модуле, а в дополнение описание битов регистра заняло бы не более 10 минут. Вам об этотм и сказали.
А так вы, сэкономив 10 минут, выставили себя в дурном свете и засерели тему. Добрее надо быть.
RusikOk
Nov 3 2016, 14:55
Цитата(smalcom @ Nov 3 2016, 13:01)

Проблема там, где вам указали - в голове
а Вы пройдитесь по форуму. много ли тут советов которые решают проблему? все только отмахиваются. если нечего сказать по существу - пройдите мимо. а мануалы и датащиты можно до смерти читать и ничего там не найти особенно когда есть проблемы с языком
Цитата(RusikOk @ Nov 3 2016, 17:55)

а Вы пройдитесь по форуму. много ли тут советов которые решают проблему? все только отмахиваются. если нечего сказать по существу - пройдите мимо. а мануалы и датащиты можно до смерти читать и ничего там не найти особенно когда есть проблемы с языком
Есть проблемы с языком то это не сюда. Вашу лень ни один форум не вылечит, тут многие без языка со словарями переводили даташиты, а у вас копи-пастой и гугл и яндекс все переведут, только читай и понимай.
Цитата(RusikOk @ Oct 10 2016, 14:27)

ох только увидел. думал уже, что в этом разделе толковых советов не бывает. за ждущий режим спасибо.
Еще один совет. Для таких целей очень полезен логический анализатор. Не обязательно профессиональный, сойдет и такой. И недорого. Тем более когда понадобится смотреть например на SPI или I2C сигналы. От древнего аналогового скопа толку не много.
http://www.ebay.com/itm/Free-shipping-1-se...%3D291910492928
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.