Страница 1 из 3

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

Добавлено: Вт сен 24, 2013 12:18:57
6Н23П
Здраствуйте
Решил портировать один проект на STM32, но возникла проблема в следующем, имеется такое выражение

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

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

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

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

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

char RS;
Как можно сделать такую же конструкцию на STM32 ??
Пишу в CoIDE.
Спасибо!

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

Добавлено: Вт сен 24, 2013 12:41:35
Neekeetos
6Н23П писал(а):

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

GPIO_Pin_2=RS;
если переменная 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 писал(а):
6Н23П писал(а):

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

GPIO_Pin_2=RS;
если переменная 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 писал(а):
6Н23П писал(а):

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

GPIO_Pin_2=RS;
если переменная 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;
} :tea:

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

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