Страница 8 из 12
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 09:37:12
VladislavS
Ну чтож, кроме неоптимальности и лени есть и ошибки. Давай по полочкам. Вот что имеем.
Код: Выделить всё
RCC->CR |= ((uint32_t)RCC_CR_HSEON);//запускаем HSE (RCC->CR)
while(!(RCC->CR & RCC_CR_HSERDY));//ждем запуска HSE (RCC->CR)
RCC->PLLCFGR = 0x403208;
RCC->CR |= RCC_CR_PLLON;
while((RCC->CR & RCC_CR_PLLRDY) == 0) {}
FLASH->ACR = 3;
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
1.
RCC->PLLCFGR = 0x403208;
Вот за эти "мэджик намберс" надо

Не хотел проверять, но всё же решился. И вот оно, PLLR=0 и PLLQ=0. На ноль делить нельзя
2.
FLASH->ACR = 3;
По что кэши и предвыборку не включил? Без них смысла в 100 МГц проце нет. Зато __DSB() в коде используешь
3.
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
Вот это одна большая ошибка.
Во-первых, ты переключаешь источник тактирования с одного на другой через третий. В данном случае этот третий совпал с исходным и первая строчка в принципе ничего не делает, но ведь могло и не повезти.
Во-вторых, частота APB1 не может быть больше 50 МГц. У тебя без делителя она 100 МГц. Будут глюки, однозначно.
Нельзя так вольно с регистрами обращаться, на каком-нибудь бите может висеть запуск МБР и стирай потом с карты америку...
Собственно, я бы для себя написал так
Код: Выделить всё
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON; //Включаем HSE
while(!(RCC->CR & RCC_CR_HSERDY)); //Ждем запуска HSE
RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSE | _VAL2FLD(RCC_PLLCFGR_PLLR,2) | _VAL2FLD(RCC_PLLCFGR_PLLQ,4) |
_VAL2FLD(RCC_PLLCFGR_PLLP,0) | _VAL2FLD(RCC_PLLCFGR_PLLN,100) | _VAL2FLD(RCC_PLLCFGR_PLLM,4);
RCC->CR = _VAL2FLD(RCC_CR_HSITRIM,16) | RCC_CR_HSION | RCC_CR_HSEON | RCC_CR_PLLON; //Включаем PLL
while(!(RCC->CR & RCC_CR_PLLRDY)); //Ждем запуска PLL
FLASH->ACR = FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY_3WS;
RCC->CFGR = RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV1 | RCC_CFGR_HPRE_DIV1 | RCC_CFGR_SW_PLL;
Спойлер
Кстати, чисто поржать. А ты уверен, что для приведения типа RCC_CFGR_SW_PLL (определена в заголовочном файле как 0x00000002U) достаточно всего одного (uint32_t)? Может для надёжности тоже два раза надо, как с RCC_CFGR_SW (определена как 0x3UL<<0U )? K&R то почитываем!!!
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 10:58:33
Reflector
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756002#p3756002"]Получилось вот так на данный момент)[/uquote]
Оставь в WritePixel() только последнюю строку, все остальное будет SetWindow() которую нужно вызвать один раз перед отрисовкой всей прямоугольной области. Сейчас у тебя для вывода одного пикселя три раза вызывается WriteReg(), суммарно там помимо трех регистров еще 8 параметров, плюс сам цвет пикселя, итого простая очистка экрана должна быть медленнее раз в 12 минимум.
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:40:19
TEPEM
Да согласен что то намудрил с тактовой, но оно заработало, спал на ходу( Компилятор ругается на Error[Pe020]: identifier "_VAL2FLD" is undefined
А по поводу ВРит пиксел надо осмыслить
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:40:35
VladislavS
Вот тут тот самый volatile пропущен. Включишь оптимизацию (почему ты её ещё не включил не понимаю) и код перестанет работать.
Спойлер
Ещё интересное слов узнал - "скваженность" 
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:42:32
TEPEM
Владислав, а можно как то в переменной операндом if узнать есть определенный бит или нет? Ну тоесть например в int i = 0xFF, if (i определенный бит == 0)
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:45:15
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756063#p3756063"]Компилятор ругается на Error[Pe020]: identifier "_VAL2FLD" is undefined[/uquote]
Это стандартный макрос из CMSIS, определён в файле core_cm4.h Должен из заголовочного файла процессора подключаться.
Код: Выделить всё
#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
Добавлено after 1 minute 19 seconds:
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756065#p3756065"]Владислав, а можно как то в переменной операндом if узнать есть определенный бит или нет? Ну тоесть например в int i = 0xFF, if (i определенный бит == 0)[/uquote]
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:45:45
TEPEM
Что значит включишь оптимизацию?
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:50:04
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756072#p3756072"]Что значит включишь оптимизацию?[/uquote]
Спойлер

Но код более аккуратно надо писать при этом. Зато скорость (или размер) получаешь. Я обычно скорость выбираю, флэша сейчас в контроллерах хоть опой кушай.
Кстати, кинь проект, гляну на разумность настроек.
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:53:12
TEPEM
Error[Pe020]: identifier "bit" is undefined C:\Users\Media Markt\Desktop\Stm Disco\led 131119\main.cpp 69
На иф ругается(
Добавлено after 1 minute 29 seconds:
У меня core_Cm4.h, там такого нема(
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 11:56:37
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756076#p3756076"]Error[Pe020]: identifier "bit" is undefined C:\Users\Media Markt\Desktop\Stm Disco\led 131119\main.cpp 69
На иф ругается([/uquote]bit это номер бита. Поставь какой тебе надо
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756076#p3756076"]У меня core_Cm4.h, там такого нема([/uquote]Где ты его взял? В IAR есть в комплекте.
Спойлер

Re: Таймер не работает
Добавлено: Вс дек 15, 2019 12:00:39
TEPEM
Вот я ппц(
if( !(i1 & (1<<(i))))
Проверяем оператором и наличие "1" в бите номер int i байта int i1, все же верно?
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 12:11:47
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756081#p3756081"]Вот я ппц(
if( !(i1 & (1<<(i))))
Проверяем оператором и наличие "1" в бите номер int i байта int i1, все же верно?[/uquote]
Определись "наличие" или "отсутствие" проверяешь.
Наличие: if( i1 & (1<<i) )
Отсутствие: if( !(i1 & (1<<i)) )
Только аккуратней с типами (размерностью и знаковостью), ибо "байта int i1" никак не байт.
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 12:27:06
TEPEM
Заработало! Правда не то что хотел, но ИФ работает, я с ним все утро любовь делаю.
Пардон, не байт конечно, каюс
Добавлено after 7 minutes 23 seconds:
cm4 подключилась с галочкой, но эта функция так и не появилась
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 12:34:21
VladislavS
Версия IAR какая?
Убери галочку и вот этот CMSIS в проект кинь.
И это не функция, а макрос

Re: Таймер не работает
Добавлено: Вс дек 15, 2019 12:48:10
TEPEM
8.30.01
Добавлено after 2 minutes 12 seconds:
Галочку убрал, файл не убирается, а при подмене ругается(
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 12:49:51
VladislavS
Ну тогда я даже боюсь представить почему его у тебя нет...
Добавлено after 58 seconds:
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756101#p3756101"]Галочку убрал, файл не убирается, а при подмене ругается([/uquote]Он у тебя в редакторе открыт?
Убери из папки проекта все файлы CMSIS кроме заголовочного файла процессора stm32f412zx.h. И оставь галочку CMSIS. У тебя IAR не последний, но достаточно свежий - там всё есть.
В папке куда IAR установлен arm\CMSIS\Core\Include\core_cm4.h Вот в ней не вздумай ничего подменять!!!
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 18:39:45
TEPEM
Вредный ИАР не дает удалить ни чего кроме стартапа и майна, все проверил. Просто добавил дефайн и все заработало.
Добавлено after 16 minutes 45 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3756051#p3756051"][uquote="TEPEM",url="/forum/viewtopic.php?p=3756002#p3756002"]Получилось вот так на данный момент)[/uquote]
Оставь в WritePixel() только последнюю строку, все остальное будет SetWindow() которую нужно вызвать один раз перед отрисовкой всей прямоугольной области. Сейчас у тебя для вывода одного пикселя три раза вызывается WriteReg(), суммарно там помимо трех регистров еще 8 параметров, плюс сам цвет пикселя, итого простая очистка экрана должна быть медленнее раз в 12 минимум.[/uquote]
Не очень понятно что Вы предлагаете упразднить.
Вышло только так, хотя скорость очистки сократилась раза в 2
Спойлер
y=0;
while( y < 240)
{
/* RASET: Row Addrses Set */
parameter1[0] = 0x00;
parameter1[1] = 0x00 + y;// +y
parameter1[2] = 0x00;
parameter1[3] = 0xEF + y;// +y
WriteReg(0x2B, parameter1, 4);
x=0;
parameter1[0] = 0x00;
parameter1[2] = 0x00;
while( x < 240)
{
///WritePixel(x, y , rgbe);
parameter1[1] = 0x00 + x;// +X
parameter1[3] = 0xEF + x;// +x
WriteReg(0x2A, parameter1, 4);
/* Prepare to write to LCD RAM */
WriteReg(0x2C, (uint8_t*)NULL, 0);
FMC_BANK1->RAM = rgbe;
x++;
}
y++;
}
Добавлено after 1 minute 39 seconds:
Текст только побуквенно в Чар писать кодами, нет такой переменной чтобы сразу туда не думая слово залить, а потом по букве выковыривать?
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 18:58:58
Reflector
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756341#p3756341"]Не очень понятно что Вы предлагаете упразднить.[/uquote]
Перед началом работы с любой прямоугольной областью задаешь окно, потом все пиксели выводятся только при помощи твоего
Координаты для каждой точки не нужны, адреса и так инкрементятся внутри окна, главное проинитить правильно, потому что направление отрисовки можно любое выбрать. Для заливки не важно, а картинка может вверх ногами получиться, например.
Re: Таймер не работает
Добавлено: Вс дек 15, 2019 20:49:15
VladislavS
[uquote="TEPEM",url="/forum/viewtopic.php?p=3756341#p3756341"]Вредный ИАР не дает удалить ни чего кроме стартапа и майна, все проверил.[/uquote]Думаю, стоит пойти поспать. Ибо не IAR-а это собачье дело что-то не давать удалить. В нём лишь можно выбрать где искать заголовочные файлы. Резберись какую именно копию CMSIS он подключает в проект: через галочку в настройках, в папке проекта или через список директорий инклюда в настройках проекта.
Re: Таймер не работает
Добавлено: Пн дек 16, 2019 11:50:46
TEPEM
Все получилось, спасибо!)
Добавлено after 2 minutes 13 seconds:
Отрисовка не заметна, у меня там на QuardSpi висит 128м флешка, можно на нее залить камнем скажем массив с картинкой, использовать от туда его, чтобы при перепрошивке он не слетал, правильно я понимаю?