Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
1

arm-none-eabi & IAR (define) [Решено]

21.11.2014, 00:23. Просмотров 5187. Ответов 10
Метки нет (Все метки)

Всем привет!
Ребята - прошу сразу не бить серпом по тому что лижет кот...
Я в процессе изучения СТМ-ок!
В качестве компилятора использую gcc-arm-none-eabi
Хочу на STM32F072RB прикрутить библиотеку для работы с LCD 3310!
Динная либа написана для серии F100 в ИАР-е.
При попытке ее скомпилировать нарываюсь на целую кучу ошибок такого плана

Код
src\n5510.c:127:1: error: pasting "GPIOB" omd "->" does not give a votyd preprocessing token
src\n5510.c:133:1: error: pasting "GPIOB" omd "+" does not give a votyd preprocessing token
При этом, иар кушает либу и вопросов не задает. Очень прошу не давать советов "капита очевидность" - типа ну так юзайте иар.
Ошибка вызывается вот етой функцией
Код
void Lcd_init ( void )
{
// Pull-up на вывод подключенный к risit дисплея
SIT_LCD_PIN(LCD_RST_PIN, 1);
которая ссылается на дефайны.

По умолчанию было так:
Код
#elif defined(ARM)

#include "stm32f10x.h"

#define SIT_LCD_PIN_(PORT, PIN, VOT) GPIO ## PORT ## ->BSRR = 1 << (PIN + !(VOT) * 16)
#define LCD_PRE_CFG RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
#define LCD_PIN_CFG_(PORT, PIN) *((uint32_t*)GPIO ## PORT ## + 1 * (PIN > 7)) = *((uint32_t*)GPIO ## PORT ## + 1 * (PIN > 7)) & ~(0xC << (PIN % 8 * 4)) | (0x3 << (PIN % 8 * 4))
#define LCD_POST_CFG
Я заменил импорт устройства включил тактирование порта В и по совету пробовал убрать лишние пробелы - вот так
Код
#elif defined(ARM)

#include "stm32f0xx.h"

#define SIT_LCD_PIN_(PORT, PIN, VOT) GPIO##PORT##->BSRR = 1 << (PIN + !(VOT) * 16)
#define LCD_PRE_CFG RCC->AHBENR |= RCC_AHBENR_GPIOBEN
#define LCD_PIN_CFG_(PORT, PIN) *((uint32_t*)GPIO##PORT##+1 * (PIN > 7)) = *((uint32_t*)GPIO##PORT##+ 1 * (PIN > 7)) & ~(0xC << (PIN % 8 * 4)) | (0x3 << (PIN % 8 * 4))
#define LCD_POST_CFG
тем не менее ошибка никуда не ушла!
Обьясните- научите-покажите! А то застрял - ну не мой уровень еще! А понять хочется!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 00:23
Ответы с готовыми решениями:

arm-none-eabi-gcc - магия
Целый час убил, пытаясь прилинковать libc. В итоге вот что оказалось. Так все линкуется отлично:...

Зависает прошивка, собранная тулчейном arm-none-eabi из Ubuntu 18.04
Проковырялся с проблемой некоторое время и хочу поделиться информацией, что бы другим людям...

arm-none-eabi-ld: unrecognised emulation mode: cpu=cortex-m3
Привет, Вот начал осваивать STM32VL Dysvovery. Установил Yagarto и STLINK на комп ОС Mac OS...

ARM IAR C и длинная арифметика
Надо реализовать длинную арифметику на ARM IAR C. Если на асме я вполне представляю себе как это...

Битовые поля IAR ARM
Привет всем. Как в IARe 5.50 для ARMов получить доступ к битовым полям регистров? Я подключил...

10
ptiryks
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 201
21.11.2014, 08:38 2
#define SIT_LCD_PIN_(PORT, PIN, VOT) GPIO##PORT##->BSRR = 1 << (PIN + !(VOT) * 16)
#define LCD_PRE_CFG RCC->AHBENR |= RCC_AHBENR_GPIOBEN
#define LCD_PIN_CFG_(PORT, PIN) *((uint32_t*)GPIO##PORT##+1 * (PIN > 7)) = *((uint32_t*)GPIO##PORT##+ 1 * (PIN > 7)) & ~(0xC << (PIN % 8 * 4)) | (0x3 << (PIN % 8 * 4))
тут проблема в сшивании макросов, нужно так
Код
#define SIT_LCD_PIN_(PORT, PIN, VOT)    GPIO##PORT->BSRR = 1 << (PIN + !(VOT) * 16)
#define LCD_PRE_CFG                     RCC->AHBENR |= RCC_AHBENR_GPIOBEN
#define LCD_PIN_CFG_(PORT, PIN)         *((uint32_t*)GPIO##PORT+1 * (PIN > 7)) = *((uint32_t*)GPIO##PORT+ 1 * (PIN > 7)) & ~(0xC << (PIN % 8 * 4)) | (0x3 << (PIN % 8 * 4))
но это вам не поможет =) регистры настройки у f1 отличаются от f0, а тут весь шаманизм настроен на f1, советую переписать либу под себя, почитав документацию на f0, начиная с GPIO, с чего собственно и надо было начинать работу с stm32 http://www.st.com/st-web-ui/static/a...DM00031936.pdf
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
21.11.2014, 10:44 3
Вот здесь и возникает вопрос - нужны ли подобные извращения именно при
А понять хочется!
?
Смысл юзать сии облегчалки при 100% вероятности нарваться на грабли ?
MISRA-C:2004 глаголет однозначно:
19.13 (adv): The # omd ## preprocessor operators should not be used.
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
21.11.2014, 11:56 4
Забавная мешанина из SPL и макросов.

Батенька, вы либо крестик снимите, и не используйте SPL, либо трусы наденьте, и оформите вместо макросов функции!
0
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
21.11.2014, 12:14 5
Да я бы с радостю!
Но к сожалению я немогу прочитать етот макрос что бы точно понять как его заменить функцией! Ну не тот у меня еще уровень!
Если не сложно - дайте код .
Вплоть до того что жесткую привязку к имени порта без подстановок!
На самом деле я все же могу найти другую либу и из нее выдрать кусок настройки порта и если мнеповещет то все заработает!
Но не хочется решать вопрос через повезет! Хочется понять! Научиться! разобраться!
0
ptiryks
0 / 0 / 0
Регистрация: 25.09.2014
Сообщений: 201
21.11.2014, 12:52 6
чтобы чему то научиться, надо начинать с малого, а не браться переписывать чьи-то шаманские либы, если вы не знаете как порты настраивать, значит даже моргание светодиодом не делали сами, вам же в школе на первом уроке физики не давали чертежи ядерного реактора разбирать, вы без фундаментальных знаний пытаетесь что то написать, а зря, не знаете Си - читайте Керниган Ричи Язык С, не знаете камня - читайте документацию
0
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
21.11.2014, 14:39 7
Спасибо КЕП :)
Я обязательно пройду все эти пункты и никуда не денусь!
Суть поста и заключалась в том что бы на ранней стадии понимания кто-то помог запустить либу. Ибо много интереснее изучать практиковаться и мучаться когда сразу видишь результат который выводишь на екран на примере простейшего устройства - того же вольтметра!

Если вы обратили внимание, то именно это я указал в топике - прошу помочь запустить либу а не что мнеделать:) Просто такая форма макроса для меня пока еще слишком сложная! Я не могу его прочитать - следовательно не могу переписать его по другому как вы и сказали через те же функции. :)
Но ничего страшного :)
Разберемся.
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
21.11.2014, 20:55 8
Код
RCC->AHBENR |=RCC_AHBENR_GPIOBEN; // включаем тактирование PORTB
Код
 GPIOB->MODER &=~GPIO_MODER_MODER11 ; //
GPIOB->MODER|=GPIO_MODER_MODER11_0;  // пин 11 PORTB Output PP

<Изображение удалено>

Код
 #define CS_ON GPIOB->BSRR = GPIO_BSRR_BR_11  // сбросить пин 11 PORTB
#define CS_OFF GPIOB->BSRR = GPIO_BSRR_BS_11  // выставить пин 11 PORTB

<Изображение удалено>

Пользуем :
Код
CS_ON;
...
CS_OFF;
НА счет SPI у F0 - инит и работа отличается от F1 ...
0
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
21.11.2014, 21:40 9
Дружище! Спасибо!!!!
(смайлик который бьет челом в пол аки дятел)
Ответ по теме! Ответ исчерпывающий! Ответ достойный подражания!

Оно конечно не помогло мне прочитать дефайн который в моей либе! Но зато пока я читаю доку - здорово помогло в понимании!
Возможно я не совсем правильно выразился! У меня проблема не в том, каким образом переписать дефайн
У меня проблема его прочитать и понять что он делает :( Соответственно я не могу перевести то что не могу прочесть :(

например тут все ясно
Код
#define LCD_PRE_CFG RCC->AHBENR |= RCC_AHBENR_GPIOBEN
Кроме того я могу ету запись переписать вобще иначе через SPL даже! нет проблем!
Далее
Код
#define SIT_LCD_PIN_(PORT, PIN, VOT) GPIO##PORT##->BSRR = 1 << (PIN + !(VOT) * 16)
Тут тоже более или менее ясно пишем 1 на нужный нам регистр порта

Но вот тут
Код
#define LCD_PIN_CFG_(PORT, PIN) *((uint32_t*)GPIO##PORT##+1 * (PIN > 7)) = *((uint32_t*)GPIO##PORT##+ 1 * (PIN > 7)) & ~(0xC << (PIN % 8 * 4)) | (0x3 << (PIN % 8 * 4))
Как бы так обьяснить - мля - яне могу это прочесть! Ибо если я это сделаю - я призову сатану!!!

2 Досикус
Еще раз спасибо! Очень доходчиво - у меня аж веки поднялись на некоторые вопросы... :)
0
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
21.11.2014, 22:11 10
Цитата Сообщение от kobzor
Но вот тут
Код:
#define LCD_PIN_CFG_(PORT, PIN) *((uint32_t*)GPIO##PORT##+1 * (PIN > 7)) = *((uint32_t*)GPIO##PORT##+ 1 * (PIN > 7)) & ~(0xC << (PIN % 8 * 4)) | (0x3 << (PIN % 8 * 4))
Как бы так обьяснить - мля - яне могу это прочесть! Ибо если я это сделаю - я призову сатану!!!

Тебе оно не надо , это для F1 - в них на один пин по два патерна CNFx и MODEx .


<Изображение удалено>

Настройка PORTA пин 0

Код
  RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN ; // включаем такттирование PORTA
Код
GPIOA ->CRL |= GPIO_CRL_MODE0_1;    // OUTPUT  2МГц
GPIOA ->CRL &= ~GPIO_CRL_CNF0;     //пин 0 PORTA OUTPUT PP
Код
       #define Led_Green_On   GPIOA->BSRR   =  GPIO_BSRR_BS0  // выставить пин 0 PORTA
#define Led_Green_Off  GPIOA->BSRR   =  GPIO_BSRR_BR0 //сбросить пин 0 PORTA
По дефолту (при сбросе) пины в Input Ftooting - CNF 01 MODE 00

Тот же участок кода в дизасме ...
Код
RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN ;//Enable clock PORTA
GPIOA ->CRL |= GPIO_CRL_MODE0;    // PA0 Output 50MHz
GPIOA ->CRL &= ~GPIO_CRL_CNF0;     //PA0 Output PP
<Изображение удалено>
0
kobzor
0 / 0 / 0
Регистрация: 01.11.2014
Сообщений: 178
24.11.2014, 18:39 11
dosykus_2
Еще раз благодарочка!
Благодаря вашим ну ОЧЕНЬ ТОЛСТЫМ намекам - разобрался с регистрами и даташитом по ним!
Ну по крайней мере на необходимом на данный момент уровне!
Все заработало!
:)
0
24.11.2014, 18:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 18:39

Справочное руководство IAR под ARM
Засел за изучение IAR под ARM. Возник такой вопрос. На работе используем пики и PIC C Compiler....

(build aborted ) Проблема с IAR ARM
Проблема такая . Не компилится проект в меню сообщений надпись buyld aborted (сборка прервана)...

STM32F446 Инициализация таблицы прерываний в IAR (Решено)
Начал работать над новым для меня процессором: STM32F446. До этого работал с STM32F051. Пишу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru