|
Вопрос по разности скоростей 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

|
ВЫ БИЛИ ПРАВЫ. На шел числовое значение. ВСЕМ ОГРОМНОЕ СПАСИБО
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|