Таймер не работает
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3751881#p3751881"]а ваша - extern "C"? void TIM2_IRQHandler(void) везде, хотя первый вариант указан в подключаемых стандартных библиотеках, в чем шутка юмора?[/uquote]В стартапе и инициализационном коде С-ной библиотеки все функции поименованы по стандарту Си. Стартап вообще частенько на асме писан, там всё так же. А проект IAR создаёт с настройками компилятора по умолчанию на С++. А в С++ после компиляции функции меняют свои имена. К ним добавляется тип аргумента, чтобы механизм перегрузки работал. Можно написать стартап на плюсах, но тогда из Си-шного кода без бубна не обойтись. В принципе даже удобно - сразу видно в коде что это прерывание по extern "C".
- Реклама
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Ага, я понял, Иар все пытается привести к синтаксису плюс плюс
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
Любой С++ компилятор так делает. Не надо ничего лишнего IAR- у приписывать.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Потру китайский код, пол страницы занимает
Последний раз редактировалось TEPEM Вт дек 10, 2019 01:14:10, всего редактировалось 1 раз.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752044#p3752044"]В самом конце две строки я так понимаю записи в FSMC, на них ругается иар, говорит
Error[Li005]: no definition for "FSMC_NORSRAMInit"
Error[Li005]: no definition for "FSMC_NORSRAMCmd"
Кто то знает от чего так может быть?[/uquote]Попробуй найти в своём проекте объявление/определение функций FSMC_NORSRAMInit() и FSMC_NORSRAMCmd(). Вот и компилятор не может.
Я конечно понимаю, что хочется всего и сразу. Но, надо идти от простого к сложному. И "на регистрах" программируют для того чтобы код был эффективным и понятным. А пока что, извини, но это говнокод.Вот его листинг
Даже если тупо вот так напишешь, будет уже лучше
Листинг. Во сколько раз меньше исполняемого кода получилось сам посчитай.
Не говоря уже о том, что при включении питания там и так нули и этот код в принципе не нужен.
И открой для себя регистр GPIOx->BSRR для "дрыгания ногами".
Добавлено after 2 hours 50 minutes:
2ALL: Если абстрагироваться от того что состояние OTYPER при включении известно и в подавляющем большинстве случаев туда можно просто константу записать один раз и навсегда. Допустим, стартанули мы из какого-то "недоверенного" загрузчика и надо все эти биты сбросить для надёжности. Как-то такУ меня два вопроса. Все ли видят, как можно оптимизировать этот код? Кто-нибудь стал бы делать эту оптимизацию в своём проекте?
Error[Li005]: no definition for "FSMC_NORSRAMInit"
Error[Li005]: no definition for "FSMC_NORSRAMCmd"
Кто то знает от чего так может быть?[/uquote]Попробуй найти в своём проекте объявление/определение функций FSMC_NORSRAMInit() и FSMC_NORSRAMCmd(). Вот и компилятор не может.
Я конечно понимаю, что хочется всего и сразу. Но, надо идти от простого к сложному. И "на регистрах" программируют для того чтобы код был эффективным и понятным. А пока что, извини, но это говнокод.
Спойлер
Код: Выделить всё
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_15;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_14;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_8;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_10;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_1;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_11;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_4;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_0;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_5;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_7;
GPIOD->OTYPER &= ~GPIO_OTYPER_OT_9;Код: Выделить всё
// 8 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_15;
LDR.N R1,??main_0+0x4 ;; 0x40020c04
LDR R0,[R1, #+0]
BIC R0,R0,#0x8000
STR R0,[R1, #+0]
// 9 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_14;
LDR R2,[R1, #+0]
BIC R2,R2,#0x4000
STR R2,[R1, #+0]
// 10 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_8;
LDR R0,[R1, #+0]
BIC R0,R0,#0x100
STR R0,[R1, #+0]
// 11 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_10;
LDR R2,[R1, #+0]
BIC R2,R2,#0x400
STR R2,[R1, #+0]
// 12 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_1;
LDR R0,[R1, #+0]
BIC R0,R0,#0x2
STR R0,[R1, #+0]
// 13 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_11;
LDR R2,[R1, #+0]
BIC R2,R2,#0x800
STR R2,[R1, #+0]
// 14 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_4;
LDR R0,[R1, #+0]
BIC R0,R0,#0x10
STR R0,[R1, #+0]
// 15 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_0;
LDR R2,[R1, #+0]
LSRS R2,R2,#+1
LSLS R2,R2,#+1
STR R2,[R1, #+0]
// 16 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_5;
LDR R0,[R1, #+0]
BIC R0,R0,#0x20
STR R0,[R1, #+0]
// 17 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_7;
LDR R2,[R1, #+0]
BIC R2,R2,#0x80
STR R2,[R1, #+0]
// 18 GPIOD->OTYPER &= ~GPIO_OTYPER_OT_9;
LDR R0,[R1, #+0]
BIC R0,R0,#0x200
STR R0,[R1, #+0]
Код: Выделить всё
GPIOD->OTYPER &= ~( GPIO_OTYPER_OT_15
| GPIO_OTYPER_OT_14
| GPIO_OTYPER_OT_8
| GPIO_OTYPER_OT_10
| GPIO_OTYPER_OT_1
| GPIO_OTYPER_OT_11
| GPIO_OTYPER_OT_4
| GPIO_OTYPER_OT_0
| GPIO_OTYPER_OT_5
| GPIO_OTYPER_OT_7
| GPIO_OTYPER_OT_9 );
Код: Выделить всё
// 8 GPIOD->OTYPER &= ~( GPIO_OTYPER_OT_15
// 9 | GPIO_OTYPER_OT_14
// 10 | GPIO_OTYPER_OT_8
// 11 | GPIO_OTYPER_OT_10
// 12 | GPIO_OTYPER_OT_1
// 13 | GPIO_OTYPER_OT_11
// 14 | GPIO_OTYPER_OT_4
// 15 | GPIO_OTYPER_OT_0
// 16 | GPIO_OTYPER_OT_5
// 17 | GPIO_OTYPER_OT_7
// 18 | GPIO_OTYPER_OT_9 );
LDR.N R1,??main_0+0x4 ;; 0x40020c04
LDR.N R0,??main_0+0x8 ;; 0xffff304c
LDR R2,[R1, #+0]
ANDS R2,R0,R2
STR R2,[R1, #+0]
Добавлено after 2 hours 50 minutes:
2ALL: Если абстрагироваться от того что состояние OTYPER при включении известно и в подавляющем большинстве случаев туда можно просто константу записать один раз и навсегда. Допустим, стартанули мы из какого-то "недоверенного" загрузчика и надо все эти биты сбросить для надёжности. Как-то так
Код: Выделить всё
GPIOD->OTYPER &= ~( GPIO_OTYPER_OT_15
| GPIO_OTYPER_OT_14
| GPIO_OTYPER_OT_8
| GPIO_OTYPER_OT_10
| GPIO_OTYPER_OT_1
| GPIO_OTYPER_OT_11
| GPIO_OTYPER_OT_4
| GPIO_OTYPER_OT_0
| GPIO_OTYPER_OT_5
| GPIO_OTYPER_OT_7
| GPIO_OTYPER_OT_9 );
- Реклама
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Вот спасибо! Дело в том что я не в курсе как канонично должен выглядеть код в данном случае, вариантов много, но Ваш вариант и взаправду удобнее, буду пользоваться им. По крайней мере, где перечисляются порты, с асмом я пока не дружу, хотя честно пытался несколько раз.
Функции FSMC_NORSRAMInit() и FSMC_NORSRAMCmd() объявлены в подключенном файле stm32f4xx_fsmc.h, и компилятор по команде Go to Definition of '' исправно туда прыгает, а все равно кидает ошибку
Добавлено after 1 minute 58 seconds:
// 8 GPIOD->OTYPER &= ~( GPIO_OTYPER_OT_15
// 9 | GPIO_OTYPER_OT_14
// 10 | GPIO_OTYPER_OT_8
// 11 | GPIO_OTYPER_OT_10
// 12 | GPIO_OTYPER_OT_1
// 13 | GPIO_OTYPER_OT_11
// 14 | GPIO_OTYPER_OT_4
// 15 | GPIO_OTYPER_OT_0
// 16 | GPIO_OTYPER_OT_5
// 17 | GPIO_OTYPER_OT_7
// 18 | GPIO_OTYPER_OT_9 );
LDR.N R1,??main_0+0x4 ;; 0x40020c04
LDR.N R0,??main_0+0x8 ;; 0xffff304c
LDR R2,[R1, #+0]
ANDS R2,R0,R2
STR R2,[R1, #+0]
А это равнозначные инструкции, т.е. на асме 5 строк настраивают весь порт Д?
Функции FSMC_NORSRAMInit() и FSMC_NORSRAMCmd() объявлены в подключенном файле stm32f4xx_fsmc.h, и компилятор по команде Go to Definition of '' исправно туда прыгает, а все равно кидает ошибку
Добавлено after 1 minute 58 seconds:
// 8 GPIOD->OTYPER &= ~( GPIO_OTYPER_OT_15
// 9 | GPIO_OTYPER_OT_14
// 10 | GPIO_OTYPER_OT_8
// 11 | GPIO_OTYPER_OT_10
// 12 | GPIO_OTYPER_OT_1
// 13 | GPIO_OTYPER_OT_11
// 14 | GPIO_OTYPER_OT_4
// 15 | GPIO_OTYPER_OT_0
// 16 | GPIO_OTYPER_OT_5
// 17 | GPIO_OTYPER_OT_7
// 18 | GPIO_OTYPER_OT_9 );
LDR.N R1,??main_0+0x4 ;; 0x40020c04
LDR.N R0,??main_0+0x8 ;; 0xffff304c
LDR R2,[R1, #+0]
ANDS R2,R0,R2
STR R2,[R1, #+0]
А это равнозначные инструкции, т.е. на асме 5 строк настраивают весь порт Д?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752602#p3752602"]Функции FSMC_NORSRAMInit() и FSMC_NORSRAMCmd() объявлены в подключенном файле stm32f4xx_fsmc.h, и компилятор по команде Go to Definition of '' исправно туда прыгает, а все равно кидает ошибку[/uquote]Объявлены это замечательно. А тело функций где определено? Наверное в каком-то неподключенном в проект stm32f4xx_fsmc.с?
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752602#p3752602"]А это равнозначные инструкции, т.е. на асме 5 строк настраивают весь порт Д?[/uquote]Это вместо 11 операций чтения-модификации-записи регистра GPIOD->OTYPER я написал всего одну, делающую то же самое. Оптимизировал твой код на порядок. С остальными регистрами надо сделать то же самое.
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752602#p3752602"]А это равнозначные инструкции, т.е. на асме 5 строк настраивают весь порт Д?[/uquote]Это вместо 11 операций чтения-модификации-записи регистра GPIOD->OTYPER я написал всего одну, делающую то же самое. Оптимизировал твой код на порядок. С остальными регистрами надо сделать то же самое.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Вы знаете я находил как причину ошибки на форуме отсутствие именно этого файла, но подумал, что это опечатка, потому что интернет не знает о нем, только о .h, где вообще можно взять все стандартные библиотеки? В архиве с примерами от стм их нет(
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752692#p3752692"]где вообще можно взять все стандартные библиотеки?[/uquote]Сгенерить кубом проект под свой микроконтроллер - они их все в проект скопирует. Но у вас ещё есть шанс не ступить на этот скользкий путь. Без них можно жить, надо только не лениться RM читать. Та же конфигурация FSMC это запись двух регистров вместо той безумной портянки. Это по коду проще чем GPIO настроить, надо лишь почитать внимательно.
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Пытаюсь читать
Добавлено after 2 hours 22 minutes 17 seconds:
Короче пытаюсь выдрать весь код дисплея из примера в один заглавный лист, упразднив бесконечные переименования и дефайны. Нашел очень неприятный момент. Я переменные свои переименовываю и подменяю ими стоковые, чтобы в любой момент можно было что то проверить в стоке примера, но при этом избежать дублирования.
Есть такой код
Потом вот эта фигня, так как все из разных файлов.
И запись
[/color]
Я головой то понимаю что это масло масленое, но все мои потуги по сокращению приводят к ошибке, отложил бы пока, так эта мерзавка не работает. Хотя все структуры ST007_ я тоже принес и переименовал. Десять раз все пролез, ни чего из структур не ссылается ни куда, ошибок нет, но и не работает. Дисплей запускается со старым содержимым застывшим, по умолчанию там простенькая анимация чтобы понимать работает или нет.
Мне кажется тут что то не так
LCD_DrvTypeDef1 ST007_drv;
LCD_DrvTypeDef1 *LcdDrv1;
....
LcdDrv1 = &ST007_drv;
LcdDrv1->Init();
Добавлено after 7 minutes 47 seconds:
Ко всем функциям также прилагается
void ST007_Init(void);
uint16_t ST007_ReadID(void);
void ST007_DisplayOn(void);
void ST007_DisplayOff(void);
void ST007_SetCursor(uint16_t Xpos, uint16_t Ypos);
void ST007_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode);
uint16_t ST007_ReadPixel(uint16_t Xpos, uint16_t Ypos);
void ST007_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
void ST007_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
void ST007_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp);
void ST007_DrawRGBImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata);
void ST007_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
void ST007_WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters);
uint16_t ST007_GetLcdPixelWidth(void);
uint16_t ST007_GetLcdPixelHeight(void);
Добавлено after 3 minutes 55 seconds:
Тоесть если у меня есть функция например
void ST007_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
}
- из ST007_drv.
Почему сразу не использовать SetDisplayWindow из LCD_DrvTypeDef1?
Добавлено after 1 minute 15 seconds:
Но такая строчка вызывает ошибку
ST007_drv->Init();
Добавлено after 3 minutes 24 seconds:
Хотя с другой стороны Init вызывается, проверил(
Добавлено after 2 hours 22 minutes 17 seconds:
Короче пытаюсь выдрать весь код дисплея из примера в один заглавный лист, упразднив бесконечные переименования и дефайны. Нашел очень неприятный момент. Я переменные свои переименовываю и подменяю ими стоковые, чтобы в любой момент можно было что то проверить в стоке примера, но при этом избежать дублирования.
Есть такой код
Код: Выделить всё
typedef struct
{
void (*Init)(void);
uint16_t (*ReadID)(void);
void (*DisplayOn)(void);
void (*DisplayOff)(void);
void (*SetCursor)(uint16_t, uint16_t);
void (*WritePixel)(uint16_t, uint16_t, uint16_t);
uint16_t (*ReadPixel)(uint16_t, uint16_t);
void (*SetDisplayWindow)(uint16_t, uint16_t, uint16_t, uint16_t);
void (*DrawHLine)(uint16_t, uint16_t, uint16_t, uint16_t);
void (*DrawVLine)(uint16_t, uint16_t, uint16_t, uint16_t);
uint16_t (*GetLcdPixelWidth)(void);
uint16_t (*GetLcdPixelHeight)(void);
void (*DrawBitmap)(uint16_t, uint16_t, uint8_t*);
void (*DrawRGBImage)(uint16_t, uint16_t, uint16_t, uint16_t, uint8_t*);
}LCD_DrvTypeDef1;
Код: Выделить всё
LCD_DrvTypeDef1 ST007_drv;
LCD_DrvTypeDef1 *LcdDrv1;
LCD_DrvTypeDef1 ST007_drv =
{
ST007_Init, //тактирование, настройка фсмс и дисплея
ST007_ReadID,// Еще раз?
ST007_DisplayOn,//rab i bez onogo
ST007_DisplayOff,//rab i bez onogo
ST007_SetCursor,//nad
ST007_WritePixel,//nad
ST007_ReadPixel,//rab i bez onogo
ST007_SetDisplayWindow,//rab i bez onogo
ST007_DrawHLine,//nad
ST007_DrawVLine,//nad
ST007_GetLcdPixelWidth,
ST007_GetLcdPixelHeight,
ST007_DrawBitmap,
ST007_DrawRGBImage,
};Код: Выделить всё
LcdDrv1 = &ST007_drv;
LcdDrv1->Init(); Я головой то понимаю что это масло масленое, но все мои потуги по сокращению приводят к ошибке, отложил бы пока, так эта мерзавка не работает. Хотя все структуры ST007_ я тоже принес и переименовал. Десять раз все пролез, ни чего из структур не ссылается ни куда, ошибок нет, но и не работает. Дисплей запускается со старым содержимым застывшим, по умолчанию там простенькая анимация чтобы понимать работает или нет.
Мне кажется тут что то не так
LCD_DrvTypeDef1 ST007_drv;
LCD_DrvTypeDef1 *LcdDrv1;
....
LcdDrv1 = &ST007_drv;
LcdDrv1->Init();
Добавлено after 7 minutes 47 seconds:
Ко всем функциям также прилагается
void ST007_Init(void);
uint16_t ST007_ReadID(void);
void ST007_DisplayOn(void);
void ST007_DisplayOff(void);
void ST007_SetCursor(uint16_t Xpos, uint16_t Ypos);
void ST007_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode);
uint16_t ST007_ReadPixel(uint16_t Xpos, uint16_t Ypos);
void ST007_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
void ST007_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
void ST007_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp);
void ST007_DrawRGBImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata);
void ST007_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
void ST007_WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters);
uint16_t ST007_GetLcdPixelWidth(void);
uint16_t ST007_GetLcdPixelHeight(void);
Добавлено after 3 minutes 55 seconds:
Тоесть если у меня есть функция например
void ST007_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
}
- из ST007_drv.
Почему сразу не использовать SetDisplayWindow из LCD_DrvTypeDef1?
Добавлено after 1 minute 15 seconds:
Но такая строчка вызывает ошибку
ST007_drv->Init();
Добавлено after 3 minutes 24 seconds:
Хотя с другой стороны Init вызывается, проверил(
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752721#p3752721"]Тоесть если у меня есть функция например
void ST007_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
}[/uquote] То сразу ей и пользуйсяА указателями на структуру указателей на функциии будешь пользоваться когда знания по K&R подтянешь.
void ST007_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
{
}[/uquote] То сразу ей и пользуйся
Код: Выделить всё
ST007_SetDisplayWindow(0,0,240,240);- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Даже мысли не было такими страшными вещами пользоваться)
Если верить примерам из интернета по использованию FSMC + дисплей.
Надо настроить порты
Настроить FSMC
Передать морзянку инициации дисплею
И должно произойти чудо.
Инициализацию портов я проверил по рабочему примеру, подменив на свою.
FSMC тоже подменял, на разные варианты, там вообще чтобы что то сломать надо ее удалить целиком.
Морзянку я с примера слизал.
А чуда нет =(
Добавлено after 34 minutes 53 seconds:
Есть там стремная строчка, без нее оригинал не работает, но она абсурдна если проследить переменные. Там через халовские доки дефанйнами расходятся с сходятся в один файл 4 переменные.
hsram.Instance = FSMC_NORSRAM_DEVICE;
hsram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
На деле это все из stm32f412zx.h
И выглядит примерно так -
FSMC_Bank1_TypeDef = FSMC_Bank1;
FSMC_Bank1E_TypeDef = FSMC_Bank1E;
Но так компилятор ругается, говорит больно ожидаемо с моей стороны. Error[Pe029]: expected an expression
Если более содержательно то вот так
/**
* @brief Flexible Static Memory Controller
*/
typedef struct
{
__IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */
} FSMC_Bank1_TypeDef;
/**
* @brief Flexible Static Memory Controller Bank1E
*/
typedef struct
{
__IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */
} FSMC_Bank1E_TypeDef;
////////////////////////////////////////////////////////////////////////////////
#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)
Внутри дефайнов матрешка
#defineFSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000U)
#defineFSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104U)
А в нем #define FSMC_R_BASE 0xA0000000U /*!< FSMC registers base address */
И все это в одном файле.
Скажите люди добрые пожалуйста как их записать в присвоение значения чтобы компилятор меня не ругал.
Если верить примерам из интернета по использованию FSMC + дисплей.
Надо настроить порты
Настроить FSMC
Передать морзянку инициации дисплею
И должно произойти чудо.
Инициализацию портов я проверил по рабочему примеру, подменив на свою.
FSMC тоже подменял, на разные варианты, там вообще чтобы что то сломать надо ее удалить целиком.
Морзянку я с примера слизал.
А чуда нет =(
Добавлено after 34 minutes 53 seconds:
Есть там стремная строчка, без нее оригинал не работает, но она абсурдна если проследить переменные. Там через халовские доки дефанйнами расходятся с сходятся в один файл 4 переменные.
hsram.Instance = FSMC_NORSRAM_DEVICE;
hsram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
На деле это все из stm32f412zx.h
И выглядит примерно так -
FSMC_Bank1_TypeDef = FSMC_Bank1;
FSMC_Bank1E_TypeDef = FSMC_Bank1E;
Но так компилятор ругается, говорит больно ожидаемо с моей стороны. Error[Pe029]: expected an expression
Если более содержательно то вот так
/**
* @brief Flexible Static Memory Controller
*/
typedef struct
{
__IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */
} FSMC_Bank1_TypeDef;
/**
* @brief Flexible Static Memory Controller Bank1E
*/
typedef struct
{
__IO uint32_t BWTR[7]; /*!< NOR/PSRAM write timing registers, Address offset: 0x104-0x11C */
} FSMC_Bank1E_TypeDef;
////////////////////////////////////////////////////////////////////////////////
#define FSMC_Bank1 ((FSMC_Bank1_TypeDef *) FSMC_Bank1_R_BASE)
#define FSMC_Bank1E ((FSMC_Bank1E_TypeDef *) FSMC_Bank1E_R_BASE)
Внутри дефайнов матрешка
#defineFSMC_Bank1_R_BASE (FSMC_R_BASE + 0x0000U)
#defineFSMC_Bank1E_R_BASE (FSMC_R_BASE + 0x0104U)
А в нем #define FSMC_R_BASE 0xA0000000U /*!< FSMC registers base address */
И все это в одном файле.
Скажите люди добрые пожалуйста как их записать в присвоение значения чтобы компилятор меня не ругал.
Последний раз редактировалось TEPEM Вт дек 10, 2019 09:11:28, всего редактировалось 1 раз.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752833#p3752833"]И выглядит примерно так -
[/uquote]Зачем типу присваивать какое-то значение? Всё таки, K&R стоит почитать.
Вообще, инициализация FSMC выглядить примерно так. Точное название регистров на конкретный процессор берём из RM.Надо только правильно эти константы сформировать, основываясь на RM.
Код: Выделить всё
FSMC_Bank1_TypeDef = FSMC_Bank1;
FSMC_Bank1E_TypeDef = FSMC_Bank1E;
Вообще, инициализация FSMC выглядить примерно так. Точное название регистров на конкретный процессор берём из RM.
Код: Выделить всё
FMC_Bank1->BCR1 = CONST1;
FMC_Bank1->BTR1 = CONST2;
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Как не удивительно гугл знает эту книгу, думал по двум буквам фиг что найдешь.
Добавлено after 3 minutes:
Блин я понял, правильно будет так да?
FSMC_Bank1_TypeDef.BTCR = FSMC_Bank1;
Не, один фиг ругается
Добавлено after 3 minutes:
Блин я понял, правильно будет так да?
FSMC_Bank1_TypeDef.BTCR = FSMC_Bank1;
Не, один фиг ругается
Последний раз редактировалось TEPEM Вт дек 10, 2019 09:22:31, всего редактировалось 1 раз.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752853#p3752853"]Надо попробовать почитать, а что это, K&R?[/uquote]
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752853#p3752853"]Блин я понял, правильно будет так да?
FSMC_Bank1_TypeDef.BTCR = FSMC_Bank1;[/uquote]
Нет. Правильно вот так
Спойлер

FSMC_Bank1_TypeDef.BTCR = FSMC_Bank1;[/uquote]
Нет. Правильно вот так
Код: Выделить всё
FSMC_Bank1->BTCR = значение;
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Отсутствие сна сказывается( Спасибо большое! Попробую вникнуть в книгу)
Добавлено after 4 minutes 32 seconds:
Все равно ругается( Говорит Error[Pe137]: expression must be a modifiable lvalue
FSMC_Bank1->BTCR = FSMC_Bank1;
FSMC_Bank1E->BWTR = FSMC_Bank1E;
Добавлено after 4 minutes 32 seconds:
Все равно ругается( Говорит Error[Pe137]: expression must be a modifiable lvalue
FSMC_Bank1->BTCR = FSMC_Bank1;
FSMC_Bank1E->BWTR = FSMC_Bank1E;
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Таймер не работает
Ну просто уж очень много неопределённости получается когда не знаешь ни языка, ни железа. Так можно долго биться об стену.
А по поводу инициализации дисплея. Надо взять логический анализатор. Проверить диаграмму выполнения простейших команд записи/чтения на шине. То что код скомпилировался ещё не означает, что он работает как задумано. А уж затем инициализационные последовательности в него пихать.
Добавлено after 5 minutes 46 seconds:
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752857#p3752857"]Все равно ругается( Говорит Error[Pe137]: expression must be a modifiable lvalue
FSMC_Bank1->BTCR = FSMC_Bank1;
FSMC_Bank1E->BWTR = FSMC_Bank1E;[/uquote]Ну вот смотри. В заголовочном файле определена структура, а FSMC_Bank1 указатель на неё.Как к её полю можно обратиться? Мне думается как-то так?
Добавлено after 22 minutes 58 seconds:
А по поводу инициализации дисплея. Надо взять логический анализатор. Проверить диаграмму выполнения простейших команд записи/чтения на шине. То что код скомпилировался ещё не означает, что он работает как задумано. А уж затем инициализационные последовательности в него пихать.
Добавлено after 5 minutes 46 seconds:
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752857#p3752857"]Все равно ругается( Говорит Error[Pe137]: expression must be a modifiable lvalue
FSMC_Bank1->BTCR = FSMC_Bank1;
FSMC_Bank1E->BWTR = FSMC_Bank1E;[/uquote]Ну вот смотри. В заголовочном файле определена структура, а FSMC_Bank1 указатель на неё.
Код: Выделить всё
typedef struct
{
__IO uint32_t BTCR[8]; /*!< NOR/PSRAM chip-select control register(BCR) and chip-select timing register(BTR), Address offset: 0x00-1C */
} FSMC_Bank1_TypeDef;
Код: Выделить всё
FSMC_Bank1->BTCR[x] = y;Спойлер
Ради хохмы. Я когда впервые столкнулся с FSMC честно попытался по RM все параметры написать. Но диаграмма хоть ты тресни не получалась и всё тут. Подключил ЛА, запустил отладчик и начал "на живую" менять поля регистров FSMC, благо их всего два, пока не получил требуемую диаграмму. Записал значения регистров в код. До сих пор эти две строчки в проекте для напоминания как писать не надо жирно светятсяКод: Выделить всё
//Инициализация FMC для доступа к регистрам CPLD
FMC_Bank1->BCR1 = 0x1091;
FMC_Bank1->BTR1 = 0x0FFF01F2;
- TEPEM
- Нашел транзистор. Понюхал.
- Сообщения: 153
- Зарегистрирован: Чт дек 05, 2019 16:28:11
- Откуда: Самара
Re: Таймер не работает
Там регистры в FSMC в адовом количестве и мягко говоря не очень однозначные все(
Можно как то посмотреть в режиме отладки какие регистры записываются из примера?
Добавлено after 8 minutes 25 seconds:
Вроде нашел, но он показывает BCR BTR и прочие все забитыми 0xFFFFFFFFFFFF/ Разве может так быть или это глюк?
Можно как то посмотреть в режиме отладки какие регистры записываются из примера?
Добавлено after 8 minutes 25 seconds:
Вроде нашел, но он показывает BCR BTR и прочие все забитыми 0xFFFFFFFFFFFF/ Разве может так быть или это глюк?
Re: Таймер не работает
[uquote="TEPEM",url="/forum/viewtopic.php?p=3752882#p3752882"]Там регистры в FSMC в адовом количестве и мягко говоря не очень однозначные все([/uquote]
Если просто проверить, то FSMC инитится одной строкой(FSMC_Bank1->BTCR[bank * 2] = ...), не считая настройки портов. И еще в двух регистрах тайминги которые по умолчанию выставлены на максимум, потому там и 0x0FFFFFFF...
Если просто проверить, то FSMC инитится одной строкой(FSMC_Bank1->BTCR[bank * 2] = ...), не считая настройки портов. И еще в двух регистрах тайминги которые по умолчанию выставлены на максимум, потому там и 0x0FFFFFFF...


