STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3425555#p3425555"]Помогите разобраться с FSMC.[/uquote]
Сумбурный пост, для начала скажи какая адресная линию к RS экрана подключена, потому что судя по коду это A18, что весьма вероятно не так.
Сумбурный пост, для начала скажи какая адресная линию к RS экрана подключена, потому что судя по коду это A18, что весьма вероятно не так.
- Реклама
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Да, А18. Какая еще информация нужна?
Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3425750#p3425750"]Да, А18. Какая еще информация нужна?[/uquote]
Экран подключен по 8-ми битной шине, потому для COM_ADR и DAT_ADR нужно (uint16_t*) заменить на (volatile uint8_t*). Кроме того в таком случае адрес 0x60080000 превратится в 0x60040000. Функции обращения к экрану там простейшие, должно быть как-то так:
Инициализацию можешь для начала свою проверить, после нее можно попробовать прочесть ID...
ps. Касательно адресов... Когда пишем по адресу 0x60040000, то активируется линия A18 идущая на RS, в противном случае там 0. В документации это колонка D/CX, в ней всегда, если речь о идет записи, 0 для команды и 1 для данных. Это если я правильно понял причину твоих затруднений...
Экран подключен по 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;
}ps. Касательно адресов... Когда пишем по адресу 0x60040000, то активируется линия A18 идущая на RS, в противном случае там 0. В документации это колонка D/CX, в ней всегда, если речь о идет записи, 0 для команды и 1 для данных. Это если я правильно понял причину твоих затруднений...
- 240265
- Электрический кот
- Сообщения: 1029
- Зарегистрирован: Сб мар 09, 2013 11:29:22
- Откуда: 40RUS, Жуков
Re: STM32 новичку в ARM что к чему
Что бы прочесть ID инициализация экрана не нужна. Нужна настройка FSMC
IVL ex UA6PJ
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Я не понимаю что именно надо заводить в аргумент reg. Какой адрес? Ведь в документации указана только data, то есть то, что выводить на шину D0-D7.Функции обращения к экрану там простейшие, должно быть как-то так:
Вот например функция
Код: Выделить всё
void writeReg(uint16_t reg, uint16_t data)
{
writeReg(reg);
writeData(data);
}Инициализация 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;
Я конечно все понимаю, но этого я не понимаю.
- Реклама
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3426170#p3426170"]Я не понимаю что именно надо заводить в аргумент reg. Какой адрес? Ведь в документации указана только data, то есть то, что выводить на шину D0-D7.[/uquote]
Вот эти данные туда и заводишь, но писать их нужно по адресу который будет означать запись именно команды. В таблице колонка D/CX для любой команды изначально в 0, т.е. первый раз мы пишем по адресу 0x60000000, при этом на входе RS будет 0, а дополнительные данные, если таковые имеются, уже пишутся по адресу 0x60040000. Если у команды нет аргументов, то будет просто:
Где reg(или cmd) - SWRESET(0x01), например.
Если аргумента два, то получается:
Понятно?
Вот эти данные туда и заводишь, но писать их нужно по адресу который будет означать запись именно команды. В таблице колонка D/CX для любой команды изначально в 0, т.е. первый раз мы пишем по адресу 0x60000000, при этом на входе RS будет 0, а дополнительные данные, если таковые имеются, уже пишутся по адресу 0x60040000. Если у команды нет аргументов, то будет просто:
Код: Выделить всё
writeReg(reg);Если аргумента два, то получается:
Код: Выделить всё
writeReg(reg);
writeData(data1);
writeData(data2);- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Кажется дошло. Спасибо 
Я конечно все понимаю, но этого я не понимаю.
- bezzabotna
- Встал на лапы
- Сообщения: 134
- Зарегистрирован: Пн ноя 07, 2016 12:14:14
Re: STM32 новичку в ARM что к чему
Я правильно понимаю, смещение адреса команд на 1 влево актуально только для 16 битного интерфейса, а для 8 битного 18 бит так и останется на своем месте(0x60040000)?
Дисплей пока не хочет работать.
Хочу прочитать ID. Делаю так:
Но 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:
Буду двигаться дальше
Дисплей пока не хочет работать.
Хочу прочитать 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
Еще пробовала с помощью команд 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 скачиваний
Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
[uquote="bezzabotna",url="/forum/viewtopic.php?p=3426869#p3426869"]Дисплей ожил наконец!
Буду двигаться дальше[/uquote]
По большому счету осталось задать окно(0x2A/0x2B), после чего 0x2C и гонишь сырые байты цветов. У меня вообще унифицированная либа, там все через установку окна делается, потому что дисплеи очень разные, где-то можно задать только координату внутри окна, что быстрее, но на одних дисплеях можно менять одну из координат, на других обязательно обе сразу, на третьих таких команд нет вообще и если хочешь начать вывод в другом месте, то задается окно и отрисовка идет с его левого верхний угла. Еще одна из возможных проблем - это направление вывода при разных ориентациях, для ST7735 это можно настроить через MADCTL, при этом больше ничего делать не придется, что встречается не так и часто. И да, если вдруг будут проблемы с цветами, то возможно придется заполнять LUT(2Dh)...
Буду двигаться дальше[/uquote]
По большому счету осталось задать окно(0x2A/0x2B), после чего 0x2C и гонишь сырые байты цветов. У меня вообще унифицированная либа, там все через установку окна делается, потому что дисплеи очень разные, где-то можно задать только координату внутри окна, что быстрее, но на одних дисплеях можно менять одну из координат, на других обязательно обе сразу, на третьих таких команд нет вообще и если хочешь начать вывод в другом месте, то задается окно и отрисовка идет с его левого верхний угла. Еще одна из возможных проблем - это направление вывода при разных ориентациях, для ST7735 это можно настроить через MADCTL, при этом больше ничего делать не придется, что встречается не так и часто. И да, если вдруг будут проблемы с цветами, то возможно придется заполнять LUT(2Dh)...
Re: STM32 новичку в ARM что к чему
Попалось на глаза в твиттере, мож кому будет полезно:
Create new STM32 project in Keil uVision 5 tutorial
Материал на английском языке, который пошагово описывает создание проекта для STM32 в Keil uVision 5.
Create new STM32 project in Keil uVision 5 tutorial
Материал на английском языке, который пошагово описывает создание проекта для STM32 в Keil uVision 5.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Вот вы мне и попались. Какого чёрта кейловский компилятор откликается на #ifdef __GNUC__ ?
Re: STM32 новичку в ARM что к чему
Я мож и не знаю точного ответа, но при пользовании кейлом мне показалось, что по встроенным функциям и пре-дифайнам он практически совместим с GCC.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Есть у меня один проект, который на GCC и IAR собирается. Между ними разница вообще мизер. Даже стартап общий с парой ифдефов получился. Дай, думаю, ещё и Кейл прикручу. Будет, типа полигон для экспериментов. Ага, блин.
1. Притворяется __GNUC__, самозванец чёртов. Ладно, есть дефайны которых нет в GCC, обходим двойной проверкой.
2. Какой-то абсурдный стартап. Зачем он занимается распределением стека и кучи? Это дело линкера. Да ещё с бредовым колбэком из библиотеки, который не даёт переписать его с асма на С.Зачем, едрён батон??? Неужели линкер не может эти константы сам подставить куда надо?
3. Не хочет подхватывать инстанцированные в другом модуле шаблонные классы.Ну как так то? GCC и IAR видят, а этот слепой.
Тут терпение лопнуло. F8.
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); // <---- Уюшки!!!
Тут терпение лопнуло. F8.
Re: STM32 новичку в ARM что к чему
Кстати, сегодня дошли руки проверить в кейле. Ничего такого, о чем вы говорили.
При компиляции оно радостно сообщает:
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!"
^~~~~~~
Возможно, у вас где-то в опциях этот гнус определен.
Код: Выделить всё
#ifdef __GNUC__
#warning "GNU C defined!"
#else
#warning "GNU C NOT defined!"
#endifmain.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 что к чему
Да ёлы палы, специально создал чистый проект. Найдите в нём упоминание про __GNUC__. Заодно может кто-то уговорит его мой шаблон прилинковать? Код примера упростил до минимума, смысла в нём не ищите особого, оставил только эффект с которым хотелось бы разобраться.

- Вложения
-
- VirtualBox_Win7-29_07_2018_12_03_35.png
- (7.33 КБ) 868 скачиваний
Re: STM32 новичку в ARM что к чему
6.10.1 я доставил, но дальше оно начало что-то вопить про лицензии и мне показалось, что это не совсем то, что мне нужно в данный момент.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="a5021",url="/forum/viewtopic.php?p=3428230#p3428230"]6.10.1 я доставил, но дальше оно начало что-то вопить про лицензии и мне показалось, что это не совсем то, что мне нужно в данный момент.[/uquote]
А причём тут версия компилятора? Я зашел на оффсайт, крайнее что дают скачал и попробовал.
На ЛЮБОЙ версиий в кейле мой код можно скомпилировать?
А причём тут версия компилятора? Я зашел на оффсайт, крайнее что дают скачал и попробовал.
На ЛЮБОЙ версиий в кейле мой код можно скомпилировать?
Re: STM32 новичку в ARM что к чему
Я посчитал, что версия тут может иметь значение. Если на версию пофиг, то полученный мной результат аналогичен предыдущему.
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
Код: Выделить всё
#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(;;);
}#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 что к чему
Ну а шаблон то? Убери, пожалуйста, все ифдефы.
А у меня вот так. Да и по подсветке ифдефа в редакторе это видно.
А у меня вот так. Да и по подсветке ифдефа в редакторе это видно.
Спойлер
Код: Выделить всё
*** 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:01Re: STM32 новичку в ARM что к чему
*** 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
Build target 'Target 1'
compiling main.cpp...
compiling hmc704T.cpp...
linking...
Program Size: Code=864 RO-data=372 RW-data=4 ZI-data=1636


