2013-03-26 4 views
0

Теперь у меня есть stm32f4-discovery. Я делаю max232 для uart для подключения stm32f4. И я использую usb-rs232 для подключения max232. Надеюсь, я смогу общаться с stm32f4 и ПК через uart. И я открываю шпатлевку в Linux. Но у меня есть большая проблема с настройкой скорости uart baud-rate. Если я устанавливаю ту же скорость передачи, он не может получить правильное сообщение. Я использую осциллограф. Наконец, я устанавливаю 7680 (stm32f4) и 3200 (шпатлевка). то я могу получить правильное сообщение. Но я понятия не имею, почему он работает с разными скоростями передачи. Может ли кто-нибудь сказать мне, почему? И это мой код, thx https://gitcafe.com/ctc8631/stm32f4-test-uartstm32f4 настройка скорости передачи данных uart?

ответ

0

Возможно, вы используете авто-бодрет на шпатлевку. Деактивирует автоматическую скорость и повторите попытку. если все еще работает, частота apb1/apb2-bus может быть неправильной. Вы можете отредактировать частоту шины по stm32f4xx_rcc.c

0

У меня была точно такая же проблема. Я использовал различные библиотеки и включал файлы в свой проект. Большинство из них были новее, чем оригинал, поставленный ST. Это была моя мотивация «модернизировать» их, но это была большая ошибка.

Мое решение/обходной путь был:

Использование TrueSTUDIO. Создайте новое приложение Embedded C. Настройте мастер правильно (это однозначно, но вот видео о нем: http://www.youtube.com/watch?v=mT5bAgpW3jU). Он сгенерирует все необходимые файлы и настроит все хорошо (структура проекта, интерфейс отладки и т. Д.). Добавьте свои собственные источники и измените необходимые, а tadaaaaa USARTx будет управлять желаемой скоростью передачи.

Я предполагаю, что проблема в том, что периферийная тактовая частота была установлена ​​неправильно, и поэтому рабочая скорость не соответствует. Это только мое мнение, что я не могу найти источник проблемы, но если вы используете другую IDE, я советую изменить доски конкретных библиотек обратно к оригиналу.

3

Возможно, вам необходимо проверить настройки часов. Плата обнаружения имеет кристалл 8 МГц, например, соответствующий конфигурационный файл (библиотеки/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c) в стандартной периферийной библиотеке, по-видимому, настроен для кристалла 25 МГц. Он имеет Эти определения

#define PLL_M  25 
#define PLL_N  336 
#define PLL_P  2 
#define PLL_Q  7 

генерировать 168Mhz от 25МГц, тогда как рабочий пример локальных сетей для обнаружения борту найден из сети использует

#define PLL_M  8 
#define PLL_N  288 
#define PLL_P  2 
#define PLL_Q  6 

, чтобы получить 144MHz от 8MHz.

Редактировать: Оказалось, что этого недостаточно, поскольку stm32f4xx.h определяет «HSE_VALUE» как 25000000 (25 МГц), если он уже не определен, когда файл включен. Правильно работающий пример, на который я посмотрел, поэтому не определил и переопределил его до 8000000 (8 МГц) в stm32f4xx_conf.h. Но я думаю, что правильная вещь должна была бы определить ее в командной строке компилятора (т. Е. В некотором окне свойств, если вы используете IDE). По крайней мере, это отлично работало в IAR EWARM.

0

В файле stm32f4xx.h вам нужно исправить

HSE_VALUE from 25000000 to 8000000 

Затем в файле system_stm32f4xx.c Установить следующее:

/* PLL_VCO = (HSE_VALUE or HSI_VALUE/PLL_M) * PLL_N */ 
#define PLL_M  8 
#define PLL_N  336 

/* SYSCLK = PLL_VCO/PLL_P */ 
#define PLL_P  2 

/* USB OTG FS, SDIO and RNG Clock = PLL_VCO/PLLQ */ 
#define PLL_Q  7 
Смежные вопросы