реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопрос по разности скоростей STM32F103 и PC
dimon_rub
сообщение Sep 10 2016, 07:35
Сообщение #1


Участник
*

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



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

Go to the top of the page
 
+Quote Post
arhiv6
сообщение Sep 10 2016, 07:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Выкладывайте код. Интересует инициализация UART.


--------------------
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Sep 10 2016, 08:10
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Sep 10 2016, 08:17
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Вроде всё нормально. Покажите как настраиваете тактирование.


--------------------
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Sep 10 2016, 08:21
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Sep 10 2016, 08:37
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



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МГц.


--------------------
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Sep 10 2016, 08:52
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Sep 10 2016, 08:55
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Теперь Вы входной сигнал поделили на 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?

Сообщение отредактировал arhiv6 - Sep 10 2016, 08:59


--------------------
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Sep 10 2016, 09:11
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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 нормальный тест
Go to the top of the page
 
+Quote Post
gerber
сообщение Sep 10 2016, 09:31
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



"Типовым" значением кварца для данного контроллера является 8 МГц, у вас 16 МГц, и скорость выше в 2 раза тоже. Поэтому вероятно где-то ещё фигурирует "типовое" значение 8 МГц в виде константы, без использования HSE_VALUE. Особенно внимательно посмотрите часть, где вычисляются делители UART DIV_Fraction и DIV_Mantissa. Может, там потеря бита, переполнение при вычислении или что-то в этом духе.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
seniorandre
сообщение Sep 10 2016, 09:50
Сообщение #11


Участник
*

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



Я тоже один раз над по первости весь лоб расшиб, когда у меня тактовая не совпадала, ситуация была аналогична. Оказалось что код инициализации тактовой частоты просто не вызывался. В main() надо было прописать SysnemInit() Это когда я пользовал SPL и стандартные заготовки CoCox. Вы вообще отладчиком попадаете в код который отвечает за инициализацию? А то ведь startup файлы которые вызывают SystemInit(), а есть которые не вызывают и его надо вызвать в Main() лапами.
Go to the top of the page
 
+Quote Post
EugenPKH
сообщение Sep 10 2016, 10:02
Сообщение #12





Группа: Новичок
Сообщений: 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)
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Sep 10 2016, 10:17
Сообщение #13


Участник
*

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



ВЫ БИЛИ ПРАВЫ. На шел числовое значение. ВСЕМ ОГРОМНОЕ СПАСИБО
Go to the top of the page
 
+Quote Post
RusikOk
сообщение Sep 11 2016, 00:50
Сообщение #14


Участник
*

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



пользуйтесь кубом
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 11 2016, 06:31
Сообщение #15


Гуру
******

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



QUOTE (RusikOk @ Sep 11 2016, 03:50) *
пользуйтесь кубом
Лучше головой wink.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016