ДЕЙЛ 31 29 июня, 2014 Опубликовано 29 июня, 2014 · Жалоба Доброй ночи, коллеги. Продолжаю начинать осваивать 32битные контроллеры. Прилепил к проекту CMSIS, как написано в статье http://easyelectronics.ru/arm-uchebnyj-kur...ls-library.html Всё сделал так же, но применительно к LPC1778. Далее последовали странности на мой взгляд. Написал тестовую программу передачи данных по UART0. Без CMSIS всё передаётся правильно, но после добавления в дерево проекта CMSIS со своими хидерами UART0 замолчал, хотя в main.c ничего не поменял и не добавлял никаких новых функций. Проект также компилируется, но с небольшими предупреждениями, которые на мой взгляд не должны повлиять на передачу данных по последовательному порту. Оба проекта - работающий и неработающий прикреплены к сообщению. Использую IAR 6.4 Что сделал не так? 10062014LPC______________.rar 10062014LPC___________.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба выхлоп компилятора угадать надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба выхлоп компилятора угадать надо? не понял На свежую голову запустил отладчик, нажал Break. Программа зациклилась на проверке установке какого-то бита в функции SystemInit. С этим покопаюсь. Возник другой вопрос - каким образом эта функция из system_LPC17xx.c попала в главную программу main.c, если этот файл (system_LPC17xx.c) нигде не прописан в инклудах и функция SystemInit тоже не упоминается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба не понялТелепаты нынче в отпуске, а остальные не могут угадать, что за предупреждения вам писал компилятор. Ваша уверенность, что предупреждения не важны - ошибочна. Возник другой вопрос - каким образом эта функция из system_LPC17xx.c попала в главную программу main.c, если этот файл (system_LPC17xx.c) нигде не прописан в инклудах и функция SystemInit тоже не упоминается.Эта функция не попала в главную программу main.c. Она вызвалась из кода инициализации (startup-кода) еще до запуска main(). Вам надо почитать про раздельную компиляцию и о роли компоновщика (линкера) в сборке проекта. А прописывать файл исходного кода (*.c) в заголовочные файлы - исключительно неразумно. Даже и не думайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 30 июня, 2014 Опубликовано 30 июня, 2014 (изменено) · Жалоба Телепаты нынче в отпуске, а остальные не могут угадать, что за предупреждения вам писал компилятор. Ваша уверенность, что предупреждения не важны - ошибочна. вот эти предупреждения Изменено 30 июня, 2014 пользователем ДЕЙЛ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба вот эти предупрежденияИ что не понятно? Компилятор явно сообщает вам, что поведение программы может быть непредсказуемым ввиду не заданной явно очерёдности доступа в выражении к volatile переменным. Чтобы этого не было volatile переменную можно закешировать перед выражением, либо расставить в выражении достаточное количество скобочек, но не всегда это возможно... Пример: extern volatile int port1; extern volatile int port2; int y = port1*port1 + port2 + port1/2; // плохо, т.к. неизвестна очерёдность доступа к volatile переменным extern volatile int port1; extern volatile int port2; int t = port1; // кешируем int y = t*t + port2 + t/2; // хорошо т.к. в выражении одна volatile переменная, читаемая один раз Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Scientificer 0 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба Предположу, что проблема в настройках тактовой частоты. В startup файле происходит ее настройка. Поэтому после присоединения CMSIS у вас изменилась ситуация и усарт перестал работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба И что не понятно? Компилятор явно сообщает вам, что поведение программы может быть непредсказуемым ввиду не заданной явно очерёдности доступа в выражении к volatile переменным. Чтобы этого не было volatile переменную можно закешировать перед выражением, либо расставить в выражении достаточное количество скобочек, но не всегда это возможно... Пример: extern volatile int port1; extern volatile int port2; int y = port1*port1 + port2 + port1/2; // плохо, т.к. неизвестна очерёдность доступа к volatile переменным extern volatile int port1; extern volatile int port2; int t = port1; // кешируем int y = t*t + port2 + t/2; // хорошо т.к. в выражении одна volatile переменная, читаемая один раз что-то так просто закешировать не получилось. В чём причина этих ошибок? Файлы я готовые взял из установленных библиотек. Предположу, что проблема в настройках тактовой частоты. В startup файле происходит ее настройка. Поэтому после присоединения CMSIS у вас изменилась ситуация и усарт перестал работать. к этой мысли тоже пришёл, но пока разбираюсь с основами работы CMSIS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба что-то так просто закешировать не получилось. В чём причина этих ошибок? Файлы я готовые взял из установленных библиотек. Библиотеки тоже пишут люди и очень часто они это делают не совсем профессионально. Причина только в этом. А что у вас конкретно не получается? Приводите примеры _вашего_ кода и сообщений компилятора, только тогда можно что-то посоветовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба Библиотеки тоже пишут люди и очень часто они это делают не совсем профессионально. Причина только в этом. А что у вас конкретно не получается? Приводите примеры _вашего_ кода и сообщений компилятора, только тогда можно что-то посоветовать. К самому первому сообщению прилепил два проекта. Оба отправляют циклически код от 0 до 250 в UART0. Но проблема в том, что без файлов CMSIS всё отправляется, программа на компе принимает данные с COM-порта. После добавления в дерево проекта файлов библиотеки CMSIS передача данных не идёт. Насколько я понял, проблема связана с настройкой частоты тактирования, которая имеет не то значение по причине опечатки в файле system_LPC17xx.c На скринах в этой теме видны предупреждения. Этот файл я брал из разных источников с различными датами изменений. Может кто-нибудь тут выложить пустой проект для IAR_LPC1778 с прилепленной библиотекой CMSIS, который не ругается при компиляции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 30 июня, 2014 Опубликовано 30 июня, 2014 (изменено) · Жалоба С этой проблемой разобрался, дело было в настройках тактирования. В функции SystemInit файла System_LPC17xx.c полностью всё убрал, оставив только пустое место {}. В этой функции была куча настроек тактированя, которые непринципиальны для меня в данный момент, поэтому отложу их до лучших времён. Ручная настройка оказалась более предсказуемой. В книге по Cortex-M3 сегодня в электричке прочитал, что функции для переферийных модулей в CMSIS пока не доведены до совершенства. Похоже на мой случай. К посту прилепил архив проекта, который не ругается на корявость. Мошть кого-то от лишней шишки избавит :) 10062014LPC.rar Изменено 30 июня, 2014 пользователем ДЕЙЛ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mempfis_ 0 1 июля, 2014 Опубликовано 1 июля, 2014 · Жалоба С этой проблемой разобрался, дело было в настройках тактирования. В функции SystemInit файла System_LPC17xx.c полностью всё убрал, оставив только пустое место {}. В этой функции была куча настроек тактированя, которые непринципиальны для меня в данный момент, поэтому отложу их до лучших времён. Ручная настройка оказалась более предсказуемой. По чуть-чуть, по немногу придёте к пониманию, что собственноручно написанный код и переносится легко, и вспоминается без проблем через месяц-год, и оставляет в голове больше понимания того, как работает периферия, и свободен от глюков непонятно кем написанной библиотеки. Если у Вас получилось самостоятельно настроить PLL и UART, продолжайте работать в этом направлении. В LPC17 нет сложной периферии, работа которой непонятна или требует архисложной настройки. Для него осталось наследие в вид примеров кода от LPC23/24 написанных без CMSIS. И документация содержит хорошее описание всех регистров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 31 1 июля, 2014 Опубликовано 1 июля, 2014 · Жалоба Думается мне, что в функции SystemInit изначально заложен пример инициализации и ошибки здесь нет. Просто образец или шаблон, но эту функцию под каждый проект нужно переписывать - настроивать тактирование и конфигурацию кристалла под себя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 1 июля, 2014 Опубликовано 1 июля, 2014 · Жалоба Просто образец или шаблон, но эту функцию под каждый проект нужно переписыватьСкорее там надо какими-то #define задать частоту внешнего кварца, выбрать внешний кварц/внутренний RC и указать желаемую частоту ядра. Но чтобы узнать это точно надо читать документацию на CMSIS, а делать это за вас никакого желания нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 1 июля, 2014 Опубликовано 1 июля, 2014 · Жалоба Скорее там надо какими-то #define задать частоту внешнего кварцаНасколько я помню это не всегда возможно. Например для STM32 не было никакой возможности штатно запустить его через CMSIS от кварц в 16мГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться