|
Вопрос по разности скоростей STM32F103 и PC |
|
|
|
Sep 10 2016, 07:35
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
Здравствуйте. 2 день бьюсь с этой проблемой. Вопрос в следующем на при включении терминала и просмотре посылок от STM32 скорость нужно выбирать в 2 раза больше. Почему не понятно. Пробовал понижать/увеличивать частоты - не помогает. 1. STM32F103RC 2. USART1. 3. PPR2 = 64MHz (здесь изменял частоты) 4. Внешний кварц - 16MHz 5. Запись на прямую без DMA Пожалуйста если можно помогите. (Я новичек - первый проект на STM)
|
|
|
|
|
Sep 10 2016, 08:10
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
Вод код инициализации 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); }
Сообщение отредактировал IgorKossak - Sep 10 2016, 20:35
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
Sep 10 2016, 08:21
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
Инициализация 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 {
} }
Сообщение отредактировал IgorKossak - Sep 10 2016, 20:36
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
Sep 10 2016, 08:52
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
Добавил RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL4); Но это ничего не дает. В старой конфигурации при выполнении функции RCC_GetClocksFreq(&RCC_ClockFreq); показывала частоту 64.
|
|
|
|
|
Sep 10 2016, 09:11
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
Стояло HSE_VALUE= 8000000 исправил. Сейчас строка в инициализации стоит RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9); По идее 72. Но проблема не уходит. При выборе в термина 9600 ероглифы при выборе 19200 нормальный тест
|
|
|
|
|
Sep 10 2016, 09:50
|
Участник

Группа: Свой
Сообщений: 58
Регистрация: 6-07-12
Из: г.Нижний Новгород
Пользователь №: 72 651

|
Я тоже один раз над по первости весь лоб расшиб, когда у меня тактовая не совпадала, ситуация была аналогична. Оказалось что код инициализации тактовой частоты просто не вызывался. В main() надо было прописать SysnemInit() Это когда я пользовал SPL и стандартные заготовки CoCox. Вы вообще отладчиком попадаете в код который отвечает за инициализацию? А то ведь startup файлы которые вызывают SystemInit(), а есть которые не вызывают и его надо вызвать в Main() лапами.
|
|
|
|
|
Sep 10 2016, 10:02
|
Группа: Новичок
Сообщений: 4
Регистрация: 6-07-16
Пользователь №: 92 447

|
Цитата(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)
|
|
|
|
|
Sep 10 2016, 10:17
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
ВЫ БИЛИ ПРАВЫ. На шел числовое значение. ВСЕМ ОГРОМНОЕ СПАСИБО
|
|
|
|
|
Sep 11 2016, 10:19
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438

|
Цитата(Сергей Борщ @ Sep 11 2016, 09:31)  Лучше головой  оно то лучше но начинать надо с чего то попроще курения 100 томов описания HAL
|
|
|
|
|
Sep 11 2016, 22:05
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438

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

Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438

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

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (RusikOk @ Sep 15 2016, 15:46)  Н313 Эти цифры мне ни о чем не говорят. Но если есть осциллограф, то что мешает посмотреть на нем форму сигнала и по букварю опредить - есть в нем ошибка или нет? При чем тут "разные программы и UART переходники"? Добавлено: посмотрел, это марка осциллографа, аналогового, т.е. без запоминания. Тогда тупо в цикле выводить один и тот же байт с небольшой задержкой, настроить осциллограф в ждущий режим, выводить на скорости 9600, чтобы уж точно попасть в полосу осциллогафа.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 15 2016, 14:39
|

Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438

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

Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438

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

Участник

Группа: Участник
Сообщений: 46
Регистрация: 14-01-12
Пользователь №: 69 438

|
Цитата(smalcom @ Nov 3 2016, 13:01)  Проблема там, где вам указали - в голове а Вы пройдитесь по форуму. много ли тут советов которые решают проблему? все только отмахиваются. если нечего сказать по существу - пройдите мимо. а мануалы и датащиты можно до смерти читать и ничего там не найти особенно когда есть проблемы с языком
|
|
|
|
|
Nov 4 2016, 04:08
|
Местный
  
Группа: Свой
Сообщений: 420
Регистрация: 22-12-04
Пользователь №: 1 608

|
Цитата(RusikOk @ Oct 10 2016, 14:27)  ох только увидел. думал уже, что в этом разделе толковых советов не бывает. за ждущий режим спасибо. Еще один совет. Для таких целей очень полезен логический анализатор. Не обязательно профессиональный, сойдет и такой. И недорого. Тем более когда понадобится смотреть например на SPI или I2C сигналы. От древнего аналогового скопа толку не много. http://www.ebay.com/itm/Free-shipping-1-se...%3D291910492928
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|