Решил портировать один проект на STM32, но возникла проблема в следующем, имеется такое выражение
Код: Выделить всё
PORTC.2=RS;Код: Выделить всё
GPIO_Pin_2=RS;Код: Выделить всё
char RS;Пишу в CoIDE.
Спасибо!
Код: Выделить всё
PORTC.2=RS;Код: Выделить всё
GPIO_Pin_2=RS;Код: Выделить всё
char RS;если переменная RS это только 0 или 1 то надо так6Н23П писал(а):Код: Выделить всё
GPIO_Pin_2=RS;
Код: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;Теперь следует ждать лавины вопросов. человек спросил КАК, ему в лоб и ответили КАК. Сомнительная польза от такого ответа. Ведь судя по качеству вопроса человек в самом начале пути. Да еще с платформы Атмела. В таких случаях рекомендуют читать. Слава Богу, есть что и есть где.Neekeetos писал(а):если переменная RS это только 0 или 1 то надо так6Н23П писал(а):Код: Выделить всё
GPIO_Pin_2=RS;где GPIOA это нужный порт , а 2 это номер пинаКод: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
Код не рабочий. Привыкайте любой, самый простой код проверять перед тем, как рекомендовать его начинающим.Neekeetos писал(а):если переменная RS это только 0 или 1 то надо так6Н23П писал(а):Код: Выделить всё
GPIO_Pin_2=RS;где GPIOA это нужный порт , а 2 это номер пинаКод: Выделить всё
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);
}В документации от производителя. Плюс тот же самый Гугл, который почему-то не любят новички. А зря...6Н23П писал(а):да я начинающий в стм 32, а почему код то не рабочий ? И еще где можно прочитать по подробнее как работать с портами?
Применение фигурных скобок (их еще называют операторными) никакого отношения к STM32 не имеют. Похоже, вам надо еще владение языком подтягивать.6Н23П писал(а):Единственное что меня смущало, так это отсутствие фигурных скобоку оператора if.
Озвучьте с чего он не рабочий.ut1wpr писал(а):Код не рабочий. Привыкайте любой, самый простой код проверять перед тем, как рекомендовать его начинающим.Neekeetos писал(а):если переменная RS это только 0 или 1 то надо такгде GPIOA это нужный порт , а 2 это номер пинаКод: Выделить всё
if(RS) GPIOA->BSRR = 1<<2; else GPIOA->BRR = 1<<2;
Это не одно и тоже. Подумайте, почему.6Н23П писал(а):Вот такой вариант еще образовался, хотя это одно и тоже.Код: Выделить всё
if(RS) { GPIO_SetBits(GPIOA,GPIO_Pin_2); } else { GPIO_ResetBits(GPIOA,GPIO_Pin_2); }
С какой радости я должен эту чушь озвучивать. Вы не поняли, что вы написали? Я здесь при чем?Neekeetos писал(а):Озвучьте с чего он не рабочий.
Код: Выделить всё
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 */
Я имел ввиду то, что эти две конструкции выполняют одно и то же действие. Кароче сегодня постараюсь проверить в железе.Это не одно и тоже.
Код: Выделить всё
[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]Мне любопытно стало почему код который работает у меня стал вдруг нерабочим. Теперь понятно, что это просто ваша неграмотность и хамство. Куча сообщений и ни одного по теме.ut1wpr писал(а):С какой радости я должен эту чушь озвучивать. Вы не поняли, что вы написали? Я здесь при чем?Neekeetos писал(а):Озвучьте с чего он не рабочий.
код по размеру можно сократить используя дополнительные переменные и функции сдвига.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]
Интересен сам дисплей . "Код" яркий пример быдлокода.6Н23П писал(а): Если кому интересно то вот код где используется это:
Приношу свои извинения, воспринял второй регистр, как первый. Называется "не заметил" разницы в написании. Насчет неграмотности согласен. Пишу всего третий год. Ряд проектов в эксплуатации. Но утверждать, что знаю всё и вся в отношении STM32 это слишком самоуверенно. Хамства не должно было прозвучать, это натяжка. Я не переходил, в отличии от вас, на личности. Я высказал отношение к ошибочно прочтенному коду.Neekeetos писал(а):Мне любопытно стало почему код который работает у меня стал вдруг нерабочим. Теперь понятно, что это просто ваша неграмотность и хамство. Куча сообщений и ни одного по теме.
В первом случае вы воздействуете непосредственно на биты регистра порта, во втором вы вызываете библиотечную функцию, действия в которой могут посеять сомнения в их рациональности и эффективности. Вдобавок отнимая время на вызов функции, возврат из нее и прочее.6Н23П писал(а):Я имел ввиду то, что эти две конструкции выполняют одно и то же действие. Кароче сегодня постараюсь проверить в железе.Это не одно и тоже.
Это вы зря здесь написали. Больше постарайтесь не приводить таких примеров. 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;
}Понятно, учту данный момент.во втором вы вызываете библиотечную функцию, действия в которой могут посеять сомнения в их рациональности и эффективности.