Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по разности скоростей STM32F103 и PC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
dimon_rub
Здравствуйте. 2 день бьюсь с этой проблемой. Вопрос в следующем на при включении терминала и просмотре посылок от STM32 скорость нужно выбирать в 2 раза больше. Почему не понятно. Пробовал понижать/увеличивать частоты - не помогает.
1. STM32F103RC
2. USART1.
3. PPR2 = 64MHz (здесь изменял частоты)
4. Внешний кварц - 16MHz
5. Запись на прямую без DMA
Пожалуйста если можно помогите. (Я новичек - первый проект на STM)

arhiv6
Выкладывайте код. Интересует инициализация UART.
dimon_rub
Вод код инициализации 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
Вроде всё нормально. Покажите как настраиваете тактирование.
dimon_rub
Инициализация
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
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
Добавил RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL4);
Но это ничего не дает.
В старой конфигурации при выполнении функции RCC_GetClocksFreq(&RCC_ClockFreq);
показывала частоту 64.
arhiv6
Теперь Вы входной сигнал поделили на 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
Стояло HSE_VALUE= 8000000 исправил.
Сейчас строка в инициализации стоит RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9);
По идее 72. Но проблема не уходит. При выборе в термина 9600 ероглифы при выборе 19200 нормальный тест
gerber
"Типовым" значением кварца для данного контроллера является 8 МГц, у вас 16 МГц, и скорость выше в 2 раза тоже. Поэтому вероятно где-то ещё фигурирует "типовое" значение 8 МГц в виде константы, без использования HSE_VALUE. Особенно внимательно посмотрите часть, где вычисляются делители UART DIV_Fraction и DIV_Mantissa. Может, там потеря бита, переполнение при вычислении или что-то в этом духе.
seniorandre
Я тоже один раз над по первости весь лоб расшиб, когда у меня тактовая не совпадала, ситуация была аналогична. Оказалось что код инициализации тактовой частоты просто не вызывался. В main() надо было прописать SysnemInit() Это когда я пользовал SPL и стандартные заготовки CoCox. Вы вообще отладчиком попадаете в код который отвечает за инициализацию? А то ведь startup файлы которые вызывают SystemInit(), а есть которые не вызывают и его надо вызвать в Main() лапами.
EugenPKH
Цитата(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
ВЫ БИЛИ ПРАВЫ. На шел числовое значение. ВСЕМ ОГРОМНОЕ СПАСИБО
RusikOk
пользуйтесь кубом
Сергей Борщ
QUOTE (RusikOk @ Sep 11 2016, 03:50) *
пользуйтесь кубом
Лучше головой wink.gif
RusikOk
Цитата(Сергей Борщ @ Sep 11 2016, 09:31) *
Лучше головой wink.gif
оно то лучше но начинать надо с чего то попроще курения 100 томов описания HAL
Сергей Борщ
QUOTE (RusikOk @ Sep 11 2016, 13:19) *
но начинать надо с чего то попроще курения 100 томов описания HAL
Достаточно одного тома справочного руководства (Reference manual) на свое семейство контроллеров. Просветляет, поверьте.
SasaVitebsk
Кстати как раз в кубе инициализация тактовой неполная. И требует правки руками как правило. По крайней мере для 32F4..
Ну а если захочешь какие-нибудь мелочи, или кварц поставил не "тот", то поехал с кубом бороться.
Хотя саму библиотеку посмотреть можно.
У меня сделано так: пытаюсь проинитить кварц -> если не нахожу оного, то запускаюсь от внутреннего и выставляю признак ошибки. Потом тоже и с часовым.
RusikOk
Цитата(SasaVitebsk @ Sep 11 2016, 23:50) *
Кстати как раз в кубе инициализация тактовой неполная. И требует правки руками как правило. По крайней мере для 32F4..
ну хз. при работе с UART-ом мной таких проблем не выявлено для F103 по крайней мере. зато заметил неправильную инициализацию даты в часах. куб версии 4,9,0

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

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

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

для большего понимания всей серьезности ситуации вот http://radiokot.ru/forum/viewtopic.php?p=1111770#p1111770 и в заключение прочитайте последнюю строчку поста.
smalcom
Цитата(RusikOk @ Sep 15 2016, 13:57) *
вот западло! только проговорил и вот тебе на! подарочек пол дня провозился с этим ср*ым UART-ом. оказывается при настройке параметров четности адекватно работает только huart1.Init.Parity = UART_PARITY_NONE; все остальное выдает в терминал билиберду. проверял разными программами и UART переходниками


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

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


Еще один совет. Для таких целей очень полезен логический анализатор. Не обязательно профессиональный, сойдет и такой. И недорого. Тем более когда понадобится смотреть например на SPI или I2C сигналы. От древнего аналогового скопа толку не много.

http://www.ebay.com/itm/Free-shipping-1-se...%3D291910492928
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.