STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3425555#p3425555"]Помогите разобраться с FSMC.[/uquote]
Сумбурный пост, для начала скажи какая адресная линию к RS экрана подключена, потому что судя по коду это A18, что весьма вероятно не так.
Реклама
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Да, А18. Какая еще информация нужна?
Я конечно все понимаю, но этого я не понимаю.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3425750#p3425750"]Да, А18. Какая еще информация нужна?[/uquote]
Экран подключен по 8-ми битной шине, потому для COM_ADR и DAT_ADR нужно (uint16_t*) заменить на (volatile uint8_t*). Кроме того в таком случае адрес 0x60080000 превратится в 0x60040000. Функции обращения к экрану там простейшие, должно быть как-то так:
Спойлер

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

#define DAT_ADR   *(volatile uint8_t*)0x60040000
#define COM_ADR   *(volatile uint8_t*)0x60000000


void writeReg(uint16_t reg)
{
    COM_ADR = 0;
    COM_ADR = reg;
}

void writeReg(uint16_t reg, uint16_t data)
{
	writeReg(reg);
	writeData(data);
}

uint16_t readReg(uint16_t reg)
{
	writeReg(reg);
	uint16_t data = COM_ADR << 8;
	return data | COM_ADR;
}

void writeData(uint16_t data)
{
	DAT_ADR = data >> 8;
	DAT_ADR = data;
}
Инициализацию можешь для начала свою проверить, после нее можно попробовать прочесть ID...

ps. Касательно адресов... Когда пишем по адресу 0x60040000, то активируется линия A18 идущая на RS, в противном случае там 0. В документации это колонка D/CX, в ней всегда, если речь о идет записи, 0 для команды и 1 для данных. Это если я правильно понял причину твоих затруднений...
Аватара пользователя
240265
Электрический кот
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Re: STM32 новичку в ARM что к чему

Сообщение 240265 »

Что бы прочесть ID инициализация экрана не нужна. Нужна настройка FSMC
IVL ex UA6PJ
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Функции обращения к экрану там простейшие, должно быть как-то так:
Я не понимаю что именно надо заводить в аргумент reg. Какой адрес? Ведь в документации указана только data, то есть то, что выводить на шину D0-D7.
Вот например функция

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

void writeReg(uint16_t reg, uint16_t data)
{
   writeReg(reg);
   writeData(data);
}
Где в документации data, а где reg?


Инициализация FSMC

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

  FSMC_NORSRAM_TimingTypeDef Timing;

  /** Perform the SRAM1 memory initialization sequence
  */
  hsram1.Instance = FSMC_NORSRAM_DEVICE;
  hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
  /* hsram1.Init */
  hsram1.Init.NSBank = FSMC_NORSRAM_BANK1;
  hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;//ENABLE ?
  hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
  hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_8;
  hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
  hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
  hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
  hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
  hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
  hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
  hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
  hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
  /* Timing */
  Timing.AddressSetupTime = 15;
  Timing.AddressHoldTime = 15;
  Timing.DataSetupTime = 255;
  Timing.BusTurnAroundDuration = 15;
  Timing.CLKDivision = 16;
  Timing.DataLatency = 17;
  Timing.AccessMode = FSMC_ACCESS_MODE_A;
Я конечно все понимаю, но этого я не понимаю.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3426170#p3426170"]Я не понимаю что именно надо заводить в аргумент reg. Какой адрес? Ведь в документации указана только data, то есть то, что выводить на шину D0-D7.[/uquote]
Вот эти данные туда и заводишь, но писать их нужно по адресу который будет означать запись именно команды. В таблице колонка D/CX для любой команды изначально в 0, т.е. первый раз мы пишем по адресу 0x60000000, при этом на входе RS будет 0, а дополнительные данные, если таковые имеются, уже пишутся по адресу 0x60040000. Если у команды нет аргументов, то будет просто:

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

writeReg(reg);
Где reg(или cmd) - SWRESET(0x01), например.
Если аргумента два, то получается:

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

writeReg(reg);
writeData(data1);
writeData(data2);
Понятно?
Реклама
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Кажется дошло. Спасибо :))
Я конечно все понимаю, но этого я не понимаю.
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

Я правильно понимаю, смещение адреса команд на 1 влево актуально только для 16 битного интерфейса, а для 8 битного 18 бит так и останется на своем месте(0x60040000)?
Дисплей пока не хочет работать.
Хочу прочитать ID. Делаю так:

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


#define LCD_HW_RES_ON 			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET)
#define LCD_HW_RES_OFF			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)
 

uint8_t data=0;
 HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_FSMC_Init();

	LCD_ON; 		
	LCD_HW_RES_ON;    
	HAL_Delay(150);
	LCD_HW_RES_OFF;
	HAL_Delay(150);

	LCD_Write_Com(0x04); //RDDID
	data = COM_ADR;         //Dummy read
	data = COM_ADR;         //ID1 read
        data = COM_ADR;         //ID2 read
        data = COM_ADR;         //ID3 read
Но data не меняется и равно 0x55;
Еще пробовала с помощью команд RDID1-RDID3,но все так же. Нужно несколько раз вызывать команду LCD_Write_Com(0x04); //RDDID?
При попытке прочтения статуса, тоже выскакивает 0х55;
Алгоритм (во вложении) говорит, что вроде бы надо читать подряд.
Я неправильно читаю? Может быть читать надо не из COM_ADR, а из DAT_ADR?

Добавлено after 45 minutes 21 second:
Если отключить инициализацию FSMC, то значение так и остается 0. Значит ли это, что FSMC работает исправно, просто я неправильно обращаюсь к дисплею?

Добавлено after 1 hour 50 minutes 46 seconds:
Дисплей ожил наконец!
Проблема была в инициализации.
Вот моя инициализация для ST7735R:

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

#define LCD_LED_ON 			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_RESET)
#define LCD_LED_OFF			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10, GPIO_PIN_SET)
#define LCD_ON 				HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_RESET)
#define LCD_OFF				HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11, GPIO_PIN_SET)
#define LCD_HW_RES_ON 			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET)
#define LCD_HW_RES_OFF			HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)

void LCD_Ini(void){
	LCD_ON; 		
	LCD_HW_RES_OFF;   
	HAL_Delay(500);
	LCD_HW_RES_ON;
	HAL_Delay(500);

	LCD_Write_Com(0x11); 									//SLPOUT
	HAL_Delay(500);

	LCD_Write_Com(0x3A);									//COLMOD
	LCD_Write_Data(0x05);										

	LCD_Write_Com(0x36);									//MADCTL
	LCD_Write_Data(0x14);	
	
	LCD_Write_Com(0x29);									//DISPON
	LCD_LED_ON;											//LCD Backlight ON
}
Буду двигаться дальше
Вложения
Без имени.png
(62.4 КБ) 612 скачиваний
Я конечно все понимаю, но этого я не понимаю.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="bezzabotna",url="/forum/viewtopic.php?p=3426869#p3426869"]Дисплей ожил наконец!
Буду двигаться дальше[/uquote]
По большому счету осталось задать окно(0x2A/0x2B), после чего 0x2C и гонишь сырые байты цветов. У меня вообще унифицированная либа, там все через установку окна делается, потому что дисплеи очень разные, где-то можно задать только координату внутри окна, что быстрее, но на одних дисплеях можно менять одну из координат, на других обязательно обе сразу, на третьих таких команд нет вообще и если хочешь начать вывод в другом месте, то задается окно и отрисовка идет с его левого верхний угла. Еще одна из возможных проблем - это направление вывода при разных ориентациях, для ST7735 это можно настроить через MADCTL, при этом больше ничего делать не придется, что встречается не так и часто. И да, если вдруг будут проблемы с цветами, то возможно придется заполнять LUT(2Dh)...
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Попалось на глаза в твиттере, мож кому будет полезно:

Create new STM32 project in Keil uVision 5 tutorial

Материал на английском языке, который пошагово описывает создание проекта для STM32 в Keil uVision 5.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Вот вы мне и попались. Какого чёрта кейловский компилятор откликается на #ifdef __GNUC__ ?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Я мож и не знаю точного ответа, но при пользовании кейлом мне показалось, что по встроенным функциям и пре-дифайнам он практически совместим с GCC.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Есть у меня один проект, который на GCC и IAR собирается. Между ними разница вообще мизер. Даже стартап общий с парой ифдефов получился. Дай, думаю, ещё и Кейл прикручу. Будет, типа полигон для экспериментов. Ага, блин.

1. Притворяется __GNUC__, самозванец чёртов. Ладно, есть дефайны которых нет в GCC, обходим двойной проверкой.

2. Какой-то абсурдный стартап. Зачем он занимается распределением стека и кучи? Это дело линкера. Да ещё с бредовым колбэком из библиотеки, который не даёт переписать его с асма на С.

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

__user_initial_stackheap
                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR
Зачем, едрён батон??? Неужели линкер не может эти константы сам подставить куда надо?

3. Не хочет подхватывать инстанцированные в другом модуле шаблонные классы.

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

//Первый модуль
  HMC704T<1,LE3> snt1;
  template class HMC704T<1,LE3>;

//Второй модуль
  extern HMC704T<1,LE3> snt1;
  snt1.SetFreq(10000);     // <---- Уюшки!!!
Ну как так то? GCC и IAR видят, а этот слепой.

Тут терпение лопнуло. F8.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Кстати, сегодня дошли руки проверить в кейле. Ничего такого, о чем вы говорили.

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

#ifdef __GNUC__
  #warning "GNU C defined!"
#else 
  #warning "GNU C NOT defined!"
#endif
При компиляции оно радостно сообщает:

main.c(182): warning: #1215-D: #warning directive: "GNU C NOT defined!"
#warning "GNU C NOT defined!"
main.c: 1 warning, 0 errors

и наоборот, при компиляции с помощью GCC:

arm-none-eabi-gcc -c -mcpu=cortex-m0 -mthumb -DSTM32F031x6 -Iinc -Iinc\CMSIS -Og -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MF"build/main.d" -Wa,-a,-ad,-alms=build/main.lst main.c -o build/main.o
main.c: In function 'main':
main.c:180:4: warning: #warning "GNU C defined!" [-Wcpp]
#warning "GNU C defined!"
^~~~~~~

Возможно, у вас где-то в опциях этот гнус определен.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Да ёлы палы, специально создал чистый проект. Найдите в нём упоминание про __GNUC__. Заодно может кто-то уговорит его мой шаблон прилинковать? Код примера упростил до минимума, смысла в нём не ищите особого, оставил только эффект с которым хотелось бы разобраться.
Изображение
Templ_test.zip
(162.65 КБ) 219 скачиваний
Вложения
VirtualBox_Win7-29_07_2018_12_03_35.png
(7.33 КБ) 868 скачиваний
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

6.10.1 я доставил, но дальше оно начало что-то вопить про лицензии и мне показалось, что это не совсем то, что мне нужно в данный момент.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3428230#p3428230"]6.10.1 я доставил, но дальше оно начало что-то вопить про лицензии и мне показалось, что это не совсем то, что мне нужно в данный момент.[/uquote]
А причём тут версия компилятора? Я зашел на оффсайт, крайнее что дают скачал и попробовал.
На ЛЮБОЙ версиий в кейле мой код можно скомпилировать?
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

Я посчитал, что версия тут может иметь значение. Если на версию пофиг, то полученный мной результат аналогичен предыдущему.

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

#include "main.h"

int main()
{  
#ifdef __GNUC__
  snt1.SetHMCMode();
  snt2.SetHMCMode();
  #warning "GNU C defined"
#else      
  snt1.SetChannel(30);
  snt2.SetChannel(10);
  #warning "GNU C NOT defined"
#endif
  for(;;);
}
SRC\main.cpp(12): warning: #1215-D: #warning directive: "GNU C NOT defined"
#warning "GNU C NOT defined"
SRC\main.cpp: 2 warnings, 0 errors
linking...
Program Size: Code=832 RO-data=372 RW-data=4 ZI-data=1636
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: STM32 новичку в ARM что к чему

Сообщение VladislavS »

Ну а шаблон то? Убери, пожалуйста, все ифдефы.

А у меня вот так. Да и по подсветке ифдефа в редакторе это видно.
Спойлер

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

*** Using Compiler 'V6.10.1', folder: 'C:\Keil_v5\ARM\ARMCLANG\Bin'
Build target 'Target 1'
SRC/main.cpp(8): warning: "GNU C defined" [-W#warnings]
        #warning "GNU C defined"
         ^
1 warning generated.
compiling main.cpp...
linking...
.\Objects\Templ_test.axf: Warning: L6776W: The debug frame in .debug_frame(hmc704t.o) does not describe an executable section.
Program Size: Code=1060 RO-data=356 RW-data=0 ZI-data=1640  
Finished: 0 information, 1 warning and 0 error messages.
".\Objects\Templ_test.axf" - 0 Error(s), 2 Warning(s).
Build Time Elapsed:  00:00:01
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: STM32 новичку в ARM что к чему

Сообщение a5021 »

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling main.cpp...
compiling hmc704T.cpp...
linking...
Program Size: Code=864 RO-data=372 RW-data=4 ZI-data=1636
Ответить

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