STM32, не удается портирование проекта с AVR

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Здраствуйте
Решил портировать один проект на STM32, но возникла проблема в следующем, имеется такое выражение

Код: Выделить всё

PORTC.2=RS;
, я значит записываю аналогичное для STM32

Код: Выделить всё

GPIO_Pin_2=RS;
, и при компиляции выходит ошибка error: lvalue required as left operand of assignment. Переменная RS это

Код: Выделить всё

char RS;
Как можно сделать такую же конструкцию на STM32 ??
Пишу в CoIDE.
Спасибо!
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

6Н23П писал(а):

Код: Выделить всё

GPIO_Pin_2=RS;
если переменная RS это только 0 или 1 то надо так

Код: Выделить всё

if(RS) GPIOA->BSRR  =  1<<2; else GPIOA->BRR  =  1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Информация по RLC mini находится >тут<
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Да переменная RS может быть только 0 или 1. Спасибо за помощь!
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

Neekeetos писал(а):
6Н23П писал(а):

Код: Выделить всё

GPIO_Pin_2=RS;
если переменная RS это только 0 или 1 то надо так

Код: Выделить всё

if(RS) GPIOA->BSRR  =  1<<2; else GPIOA->BRR  =  1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Теперь следует ждать лавины вопросов. человек спросил КАК, ему в лоб и ответили КАК. Сомнительная польза от такого ответа. Ведь судя по качеству вопроса человек в самом начале пути. Да еще с платформы Атмела. В таких случаях рекомендуют читать. Слава Богу, есть что и есть где.
С уважением,
Виктор.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

Neekeetos писал(а):
6Н23П писал(а):

Код: Выделить всё

GPIO_Pin_2=RS;
если переменная RS это только 0 или 1 то надо так

Код: Выделить всё

if(RS) GPIOA->BSRR  =  1<<2; else GPIOA->BRR  =  1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Код не рабочий. Привыкайте любой, самый простой код проверять перед тем, как рекомендовать его начинающим.
С уважением,
Виктор.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

да я начинающий в стм 32, а почему код то не рабочий ? И еще где можно прочитать по подробнее как работать с портами?


пс: предложеную конструкцию я специально ради интереса проверил в проекте на АВР, потом залил в МК = все работает. Значит далее, вставил данную конструкцию в проект на стм32, проект скомпилился, но в железе еще не проверял. Единственное что меня смущало, так это отсутствие фигурных скобоку оператора if.

Вот такой вариант еще образовался, хотя это одно и тоже.

Код: Выделить всё

if(RS) 
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
Реклама
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

6Н23П писал(а):да я начинающий в стм 32, а почему код то не рабочий ? И еще где можно прочитать по подробнее как работать с портами?
В документации от производителя. Плюс тот же самый Гугл, который почему-то не любят новички. А зря...
Наберите для начала "Литература по STM32" и откроется вам.
Рекомендую вот такое http://forum.cxem.net/index.php?s=d3c8b ... _id=194244
С уважением,
Виктор.
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

6Н23П писал(а):Единственное что меня смущало, так это отсутствие фигурных скобоку оператора if.
Применение фигурных скобок (их еще называют операторными) никакого отношения к STM32 не имеют. Похоже, вам надо еще владение языком подтягивать.
С уважением,
Виктор.
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Понятно, спасибо за книжку.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

ut1wpr писал(а):
Neekeetos писал(а):если переменная RS это только 0 или 1 то надо так

Код: Выделить всё

if(RS) GPIOA->BSRR  =  1<<2; else GPIOA->BRR  =  1<<2;
где GPIOA это нужный порт , а 2 это номер пина
Код не рабочий. Привыкайте любой, самый простой код проверять перед тем, как рекомендовать его начинающим.
Озвучьте с чего он не рабочий.
Информация по RLC mini находится >тут<
Контактная информация:
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

6Н23П писал(а):Вот такой вариант еще образовался, хотя это одно и тоже.

Код: Выделить всё

if(RS) 
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
Это не одно и тоже. Подумайте, почему.
С уважением,
Виктор.
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

Neekeetos писал(а):Озвучьте с чего он не рабочий.
С какой радости я должен эту чушь озвучивать. Вы не поняли, что вы написали? Я здесь при чем?
С уважением,
Виктор.
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение 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 - то почему коду не работать ?
Иван Сусанин - первый полупроводник :solder:
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 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]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

ut1wpr писал(а):
Neekeetos писал(а):Озвучьте с чего он не рабочий.
С какой радости я должен эту чушь озвучивать. Вы не поняли, что вы написали? Я здесь при чем?
Мне любопытно стало почему код который работает у меня стал вдруг нерабочим. Теперь понятно, что это просто ваша неграмотность и хамство. Куча сообщений и ни одного по теме.
Информация по RLC mini находится >тут<
Контактная информация:
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение 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;
} :tea:
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

6Н23П писал(а): Если кому интересно то вот код где используется это:
Интересен сам дисплей . "Код" яркий пример быдлокода.
По куску "кода" вырисовывается SPI.
К чему эти ручные дрочения пинов ?
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

Neekeetos писал(а):Мне любопытно стало почему код который работает у меня стал вдруг нерабочим. Теперь понятно, что это просто ваша неграмотность и хамство. Куча сообщений и ни одного по теме.
Приношу свои извинения, воспринял второй регистр, как первый. Называется "не заметил" разницы в написании. Насчет неграмотности согласен. Пишу всего третий год. Ряд проектов в эксплуатации. Но утверждать, что знаю всё и вся в отношении STM32 это слишком самоуверенно. Хамства не должно было прозвучать, это натяжка. Я не переходил, в отличии от вас, на личности. Я высказал отношение к ошибочно прочтенному коду.
Для себя были раз и навсегда созданы свои макросы (коих много в разных вариациях), сводящих ногодрыг до уровня CLK_0 или CLK_1.
С уважением,
Виктор.
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Сообщение ut1wpr »

6Н23П писал(а):
Это не одно и тоже.
Я имел ввиду то, что эти две конструкции выполняют одно и то же действие. Кароче сегодня постараюсь проверить в железе.
В первом случае вы воздействуете непосредственно на биты регистра порта, во втором вы вызываете библиотечную функцию, действия в которой могут посеять сомнения в их рациональности и эффективности. Вдобавок отнимая время на вызов функции, возврат из нее и прочее.
Для сокращения "буковок с строчечке" и улучшения читаемости самому себе, все рекомендуют использовать макросы, сделав их по возможности максимально универсальными. Хорошие примеры найдете и на Казусе, и на Изях.
Если кому интересно то вот код где используется это:
Это вы зря здесь написали. Больше постарайтесь не приводить таких примеров. SPI у этого производителя просто великолепен.
С уважением,
Виктор.
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 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;
 }
да можно и так, но автор утверждает что такай код будет медленее передавать байт.

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

Вернуться в «ARM»