Перейти к содержанию
    

Вопрос по разности скоростей STM32F103 и PC

Здравствуйте. 2 день бьюсь с этой проблемой. Вопрос в следующем на при включении терминала и просмотре посылок от STM32 скорость нужно выбирать в 2 раза больше. Почему не понятно. Пробовал понижать/увеличивать частоты - не помогает.

1. STM32F103RC

2. USART1.

3. PPR2 = 64MHz (здесь изменял частоты)

4. Внешний кварц - 16MHz

5. Запись на прямую без DMA

Пожалуйста если можно помогите. (Я новичек - первый проект на STM)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вод код инициализации UART1

 

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
[codebox] для длинного кода, [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
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL4);

Но это ничего не дает.

В старой конфигурации при выполнении функции RCC_GetClocksFreq(&RCC_ClockFreq);

показывала частоту 64.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стояло HSE_VALUE= 8000000 исправил.

Сейчас строка в инициализации стоит RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9);

По идее 72. Но проблема не уходит. При выборе в термина 9600 ероглифы при выборе 19200 нормальный тест

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже один раз над по первости весь лоб расшиб, когда у меня тактовая не совпадала, ситуация была аналогична. Оказалось что код инициализации тактовой частоты просто не вызывался. В main() надо было прописать SysnemInit() Это когда я пользовал SPL и стандартные заготовки CoCox. Вы вообще отладчиком попадаете в код который отвечает за инициализацию? А то ведь startup файлы которые вызывают SystemInit(), а есть которые не вызывают и его надо вызвать в Main() лапами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...