Страница 1 из 3
STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 12:18:57
6Н23П
Здраствуйте
Решил портировать один проект на STM32, но возникла проблема в следующем, имеется такое выражение
, я значит записываю аналогичное для STM32
, и при компиляции выходит ошибка error: lvalue required as left operand of assignment. Переменная RS это
Как можно сделать такую же конструкцию на STM32 ??
Пишу в CoIDE.
Спасибо!
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 12:41:35
Neekeetos
если переменная RS это только 0 или 1 то надо так
Код: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 12:51:04
6Н23П
Да переменная RS может быть только 0 или 1. Спасибо за помощь!
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 16:10:52
ut1wpr
Neekeetos писал(а):
если переменная RS это только 0 или 1 то надо так
Код: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Теперь следует ждать лавины вопросов. человек спросил КАК, ему в лоб и ответили КАК. Сомнительная польза от такого ответа. Ведь судя по качеству вопроса человек в самом начале пути. Да еще с платформы Атмела. В таких случаях рекомендуют читать. Слава Богу, есть что и есть где.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 16:16:09
ut1wpr
Neekeetos писал(а):
если переменная RS это только 0 или 1 то надо так
Код: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Код не рабочий. Привыкайте любой, самый простой код проверять перед тем, как рекомендовать его начинающим.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 16:46:00
6Н23П
да я начинающий в стм 32, а почему код то не рабочий ? И еще где можно прочитать по подробнее как работать с портами?
пс: предложеную конструкцию я специально ради интереса проверил в проекте на АВР, потом залил в МК = все работает. Значит далее, вставил данную конструкцию в проект на стм32, проект скомпилился, но в железе еще не проверял. Единственное что меня смущало, так это отсутствие фигурных скобоку оператора if.
Вот такой вариант еще образовался, хотя это одно и тоже.
Код: Выделить всё
if(RS)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 17:00:06
ut1wpr
6Н23П писал(а):да я начинающий в стм 32, а почему код то не рабочий ? И еще где можно прочитать по подробнее как работать с портами?
В документации от производителя. Плюс тот же самый Гугл, который почему-то не любят новички. А зря...
Наберите для начала "Литература по STM32" и откроется вам.
Рекомендую вот такое
http://forum.cxem.net/index.php?s=d3c8b ... _id=194244
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 17:03:44
ut1wpr
6Н23П писал(а):Единственное что меня смущало, так это отсутствие фигурных скобоку оператора if.
Применение фигурных скобок (их еще называют операторными) никакого отношения к STM32 не имеют. Похоже, вам надо еще владение языком подтягивать.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 17:12:23
6Н23П
Понятно, спасибо за книжку.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 18:33:26
Neekeetos
ut1wpr писал(а):Neekeetos писал(а):если переменная RS это только 0 или 1 то надо так
Код: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Код не рабочий. Привыкайте любой, самый простой код проверять перед тем, как рекомендовать его начинающим.
Озвучьте с чего он не рабочий.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 22:39:06
ut1wpr
6Н23П писал(а):Вот такой вариант еще образовался, хотя это одно и тоже.
Код: Выделить всё
if(RS)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
Это не одно и тоже. Подумайте, почему.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Вт сен 24, 2013 22:44:21
ut1wpr
Neekeetos писал(а):Озвучьте с чего он не рабочий.
С какой радости я должен эту чушь озвучивать. Вы не поняли, что вы написали? Я здесь при чем?
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 00:15:39
Myp3ik
Код: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
Прекрасно работает.
Разница с этим
Код: Выделить всё
if(RS)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
в том, что в первом случае бит устанавливается сдвигом, а во втором случае берется битовая маска
Код: Выделить всё
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
Если (1 << 2) = 0x0004 - то почему коду не работать ?
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 04:36:26
6Н23П
Это не одно и тоже.
Я имел ввиду то, что эти две конструкции выполняют одно и то же действие. Кароче сегодня постараюсь проверить в железе.
Если кому интересно то вот код где используется это:
Спойлер
Код: Выделить всё
[spoiler]#define LCD_PORT GPIOA
#define LCD_CS 3
#define LCD_RESET 4
#define LCD_RS 5
#define LCD_CLK 6
#define LCD_DATA 7
//Команда/Данные
#define CMD 0
#define DAT 1
char RS_old;
//=========
//Функция записи команды/данных в LCD (RS==0 - команда, RS==1 - данные)
//=========
void Send_to_lcd (unsigned char RS, unsigned char data)
{
//unsigned char count;
LCD_CLK = 0;
LCD_DATA = 0;
if ((RS_old != RS) || (!RS_old && !RS)) //проверяем старое значение RS (если поступают одни команды то дергаем CS)
{
LCD_CS=1; // Установка CS
//LCD_RS=RS;
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
LCD_CS=0; // Сброс CS
}
******************************************************************************
запись байта в дисплей
//******************************************************************************
LCD_DATA = 0;
if ((data & 128) == 128) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 64) == 64) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 32) == 32) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 16) ==16) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 8) == 8) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 4) == 4) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 2) == 2) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 1) == 1) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
RS_old=RS; //запоминаю значение RS
LCD_DATA = 0;
}[/spoiler]
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 07:23:23
Neekeetos
ut1wpr писал(а):Neekeetos писал(а):Озвучьте с чего он не рабочий.
С какой радости я должен эту чушь озвучивать. Вы не поняли, что вы написали? Я здесь при чем?
Мне любопытно стало почему код который работает у меня стал вдруг нерабочим. Теперь понятно, что это просто ваша неграмотность и хамство. Куча сообщений и ни одного по теме.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 11:02:19
pcb
6Н23П писал(а):Это не одно и тоже.
Если кому интересно то вот код где используется это:
Спойлер
Код: Выделить всё
[spoiler]#define LCD_PORT GPIOA
LCD_DATA = 0;
if ((data & 128) == 128) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 64) == 64) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 32) == 32) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 16) ==16) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 8) == 8) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 4) == 4) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 2) == 2) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
LCD_DATA = 0;
if ((data & 1) == 1) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
}[/spoiler]
код по размеру можно сократить используя дополнительные переменные и функции сдвига.
for(x=128;x>=1;x>>1)
{
тут магия;
LCD_DATA = 0;
if ((data & x) == 1) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
}

Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 13:44:25
dosikus
6Н23П писал(а):
Если кому интересно то вот код где используется это:
Интересен сам дисплей . "Код" яркий пример быдлокода.
По куску "кода" вырисовывается SPI.
К чему эти ручные дрочения пинов ?
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 13:53:51
ut1wpr
Neekeetos писал(а):Мне любопытно стало почему код который работает у меня стал вдруг нерабочим. Теперь понятно, что это просто ваша неграмотность и хамство. Куча сообщений и ни одного по теме.
Приношу свои извинения, воспринял второй регистр, как первый. Называется "не заметил" разницы в написании. Насчет неграмотности согласен. Пишу всего третий год. Ряд проектов в эксплуатации. Но утверждать, что знаю всё и вся в отношении STM32 это слишком самоуверенно. Хамства не должно было прозвучать, это натяжка. Я не переходил, в отличии от вас, на личности. Я высказал отношение к ошибочно прочтенному коду.
Для себя были раз и навсегда созданы свои макросы (коих много в разных вариациях), сводящих ногодрыг до уровня CLK_0 или CLK_1.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 14:07:59
ut1wpr
6Н23П писал(а):Это не одно и тоже.
Я имел ввиду то, что эти две конструкции выполняют одно и то же действие. Кароче сегодня постараюсь проверить в железе.
В первом случае вы воздействуете непосредственно на биты регистра порта, во втором вы вызываете библиотечную функцию, действия в которой могут посеять сомнения в их рациональности и эффективности. Вдобавок отнимая время на вызов функции, возврат из нее и прочее.
Для сокращения "буковок с строчечке" и улучшения читаемости самому себе, все рекомендуют использовать макросы, сделав их по возможности максимально универсальными. Хорошие примеры найдете и на Казусе, и на Изях.
Если кому интересно то вот код где используется это:
Это вы зря здесь написали. Больше постарайтесь не приводить таких примеров. SPI у этого производителя просто великолепен.
Re: STM32, не удается портирование проекта с AVR
Добавлено: Ср сен 25, 2013 14:20:07
6Н23П
Ну код писал не я. Я нашол его на паяльнике, так что мне не совсем очевидно какой код есть быдлокод, а какой нормальный. Собственно я и занимаюсь этими вещами чтобы научиться нормально писать программы.
Дисплей от сименса C75, и еще подобный ему С72(но там маленько другая библиотека). На счет того что там софтовый SPI мне самому не нравится. Писать сразу с аппаратным SPI для стм32 мне еще сложновато, вот и пытаюсь сначала на софтовом поюзать.
Если вы заинтересовались дисплеем то может быть подкинете пару идей ? Вообщем я так понимаю Функция инициализации дисплея останется той же, только в ней будет присутствовать заместо совтового SPI аппаратный.
Вот инициализация
Спойлер
Код: Выделить всё
void spi1_init () {
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_InitTypeDef spi_one;
spi_one.SPI_Mode = SPI_Mode_Master;
spi_one.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16 ;
spi_one.SPI_CPHA = SPI_CPHA_1Edge;
spi_one.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi_one.SPI_CPOL = SPI_CPOL_Low;
spi_one.SPI_CRCPolynomial = 7;
spi_one.SPI_DataSize = SPI_DataSize_8b;
spi_one.SPI_FirstBit = SPI_FirstBit_MSB;
spi_one.SPI_NSS = SPI_NSS_Hard;
SPI_Init(SPI1,&spi_one);
SPI_Cmd(SPI1,ENABLE);
}
Спойлер
Код: Выделить всё
for(x=128;x>=1;x>>1)
{
тут магия;
LCD_DATA = 0;
if ((data & x) == 1) LCD_DATA = 1;
LCD_CLK=1;
LCD_CLK=0;
}
да можно и так, но автор утверждает что такай код будет медленее передавать байт.
во втором вы вызываете библиотечную функцию, действия в которой могут посеять сомнения в их рациональности и эффективности.
Понятно, учту данный момент.