Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Таймер не работает

Вс дек 15, 2019 09:37:12

Ну чтож, кроме неоптимальности и лени есть и ошибки. Давай по полочкам. Вот что имеем.
Код:
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;
Вот за эти "мэджик намберс" надо :kill: Не хотел проверять, но всё же решился. И вот оно, 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

Получилось вот так на данный момент)

Оставь в WritePixel() только последнюю строку, все остальное будет SetWindow() которую нужно вызвать один раз перед отрисовкой всей прямоугольной области. Сейчас у тебя для вывода одного пикселя три раза вызывается WriteReg(), суммарно там помимо трех регистров еще 8 параметров, плюс сам цвет пикселя, итого простая очистка экрана должна быть медленнее раз в 12 минимум.

Re: Таймер не работает

Вс дек 15, 2019 11:40:19

Да согласен что то намудрил с тактовой, но оно заработало, спал на ходу( Компилятор ругается на Error[Pe020]: identifier "_VAL2FLD" is undefined
А по поводу ВРит пиксел надо осмыслить

Re: Таймер не работает

Вс дек 15, 2019 11:40:35

Код:
static uint8_t flag = 1;

Вот тут тот самый volatile пропущен. Включишь оптимизацию (почему ты её ещё не включил не понимаю) и код перестанет работать.

СпойлерЕщё интересное слов узнал - "скваженность" :)

Re: Таймер не работает

Вс дек 15, 2019 11:42:32

Владислав, а можно как то в переменной операндом if узнать есть определенный бит или нет? Ну тоесть например в int i = 0xFF, if (i определенный бит == 0)

Re: Таймер не работает

Вс дек 15, 2019 11:45:15

Компилятор ругается на Error[Pe020]: identifier "_VAL2FLD" is undefined

Это стандартный макрос из CMSIS, определён в файле core_cm4.h Должен из заголовочного файла процессора подключаться.
Код:
#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)


Добавлено after 1 minute 19 seconds:
Владислав, а можно как то в переменной операндом if узнать есть определенный бит или нет? Ну тоесть например в int i = 0xFF, if (i определенный бит == 0)


Код:
if( !(i & (1<<bit)) )
Последний раз редактировалось VladislavS Вс дек 15, 2019 12:08:30, всего редактировалось 4 раз(а).

Re: Таймер не работает

Вс дек 15, 2019 11:45:45

Что значит включишь оптимизацию?

Re: Таймер не работает

Вс дек 15, 2019 11:50:04

Что значит включишь оптимизацию?

СпойлерИзображение

Но код более аккуратно надо писать при этом. Зато скорость (или размер) получаешь. Я обычно скорость выбираю, флэша сейчас в контроллерах хоть опой кушай.

Кстати, кинь проект, гляну на разумность настроек.
Вложения
Iar_opt.png
(99.51 KiB) Скачиваний: 246
Последний раз редактировалось VladislavS Вс дек 15, 2019 11:53:12, всего редактировалось 1 раз.

Re: Таймер не работает

Вс дек 15, 2019 11:53:12

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

Error[Pe020]: identifier "bit" is undefined C:\Users\Media Markt\Desktop\Stm Disco\led 131119\main.cpp 69
На иф ругается(
bit это номер бита. Поставь какой тебе надо :)

У меня core_Cm4.h, там такого нема(
Где ты его взял? В IAR есть в комплекте.
СпойлерИзображение
Вложения
Iar_CMSIS.png
(110.33 KiB) Скачиваний: 224

Re: Таймер не работает

Вс дек 15, 2019 12:00:39

Вот я ппц(

if( !(i1 & (1<<(i))))
Проверяем оператором и наличие "1" в бите номер int i байта int i1, все же верно?

Re: Таймер не работает

Вс дек 15, 2019 12:11:47

Вот я ппц(

if( !(i1 & (1<<(i))))
Проверяем оператором и наличие "1" в бите номер int i байта int i1, все же верно?

Определись "наличие" или "отсутствие" проверяешь.
Наличие: if( i1 & (1<<i) )
Отсутствие: if( !(i1 & (1<<i)) )

Только аккуратней с типами (размерностью и знаковостью), ибо "байта int i1" никак не байт.

Re: Таймер не работает

Вс дек 15, 2019 12:27:06

Заработало! Правда не то что хотел, но ИФ работает, я с ним все утро любовь делаю.
Пардон, не байт конечно, каюс

Добавлено after 7 minutes 23 seconds:
cm4 подключилась с галочкой, но эта функция так и не появилась

Re: Таймер не работает

Вс дек 15, 2019 12:34:21

Версия IAR какая?

Убери галочку и вот этот CMSIS в проект кинь.

И это не функция, а макрос :)
Вложения
CMSIS_CM4.zip
(28.31 KiB) Скачиваний: 230

Re: Таймер не работает

Вс дек 15, 2019 12:48:10

8.30.01

Добавлено after 2 minutes 12 seconds:
Галочку убрал, файл не убирается, а при подмене ругается(

Re: Таймер не работает

Вс дек 15, 2019 12:49:51

Ну тогда я даже боюсь представить почему его у тебя нет...
Добавлено after 58 seconds:
Галочку убрал, файл не убирается, а при подмене ругается(
Он у тебя в редакторе открыт?

Убери из папки проекта все файлы CMSIS кроме заголовочного файла процессора stm32f412zx.h. И оставь галочку CMSIS. У тебя IAR не последний, но достаточно свежий - там всё есть.
В папке куда IAR установлен arm\CMSIS\Core\Include\core_cm4.h Вот в ней не вздумай ничего подменять!!!

Re: Таймер не работает

Вс дек 15, 2019 18:39:45

Вредный ИАР не дает удалить ни чего кроме стартапа и майна, все проверил. Просто добавил дефайн и все заработало.

Добавлено after 16 minutes 45 seconds:
Получилось вот так на данный момент)

Оставь в WritePixel() только последнюю строку, все остальное будет SetWindow() которую нужно вызвать один раз перед отрисовкой всей прямоугольной области. Сейчас у тебя для вывода одного пикселя три раза вызывается WriteReg(), суммарно там помимо трех регистров еще 8 параметров, плюс сам цвет пикселя, итого простая очистка экрана должна быть медленнее раз в 12 минимум.

Не очень понятно что Вы предлагаете упразднить.
Вышло только так, хотя скорость очистки сократилась раза в 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

Не очень понятно что Вы предлагаете упразднить.

Перед началом работы с любой прямоугольной областью задаешь окно, потом все пиксели выводятся только при помощи твоего
Код:
FMC_BANK1->RAM = rgbe;

Координаты для каждой точки не нужны, адреса и так инкрементятся внутри окна, главное проинитить правильно, потому что направление отрисовки можно любое выбрать. Для заливки не важно, а картинка может вверх ногами получиться, например.

Re: Таймер не работает

Вс дек 15, 2019 20:49:15

Вредный ИАР не дает удалить ни чего кроме стартапа и майна, все проверил.
Думаю, стоит пойти поспать. Ибо не IAR-а это собачье дело что-то не давать удалить. В нём лишь можно выбрать где искать заголовочные файлы. Резберись какую именно копию CMSIS он подключает в проект: через галочку в настройках, в папке проекта или через список директорий инклюда в настройках проекта.

Re: Таймер не работает

Пн дек 16, 2019 11:50:46

Все получилось, спасибо!)

Добавлено after 2 minutes 13 seconds:
Отрисовка не заметна, у меня там на QuardSpi висит 128м флешка, можно на нее залить камнем скажем массив с картинкой, использовать от туда его, чтобы при перепрошивке он не слетал, правильно я понимаю?
Ответить