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

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

Сообщение VladislavS »

[uquote="uldemir",url="/forum/viewtopic.php?p=3410020#p3410020"]когда считывать регистр RTC_CNT.[/uquote]
А зачем его считывать? Его состояние и так известно.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

Скачал тут IAR 8.30 для ARMов. Открыл проект, который в 8.22 компилился, вроде. А тут - подключение <string> вызывает Error[Pe1061]: declaration of enum "std::align_val_t" is incompatible with a declaration in another translation unit C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.1\arm\inc\cpp\new 137
У меня включен компилятор С++ принудительно, не экстендет бейсед.
В общем проблема не в проекте - сгенерил кубом чистый проект, как только подключаю стринг - ошибка.
Экспериментальным путем обнаружил что снятая галочка мультифайловой компиляции решает проблему. Ну ок, не суть. Но, внезапно, из мейна перестал быть виден инклюд в другой папке, пр итом что в список источников эта папка добавлена. Указание полного пути тоже не решает проблему :facepalm: :facepalm:
В общем файлы перенес файлы в общую папку, благо их только два, и проект собрался. Уже сил нет дальше ковырять, тем более создавать бесплатную пробную учетку и делать реквест в сапорт (с АВР я так делал - прокатило :))) ). Если есть идеи куда посмотреть-потыкать буду благодарен.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

IAR шлак, KEIL рулит
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ярослав555, Первое подтверждаю. Конкретнее в <new>. Для C++17 пилят overaligned allocation. Ну ничего, подождём, допилят. Второе не подтверждаю, всё подключается из списка директорий.

Oxford, когда в Keil C++17 завезут - приходи, похоливарим :)
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3412784#p3412784"]Первое подтверждаю.
Второе не подтверждаю, всё подключается из списка директорий.[/uquote]
По первому - ок, ждем обновы. Пока что проблему поборол.
По второму - у меня мейн лежит в папке срц, инклюды в папке инк. А вот системный таймер лежал со своим инклюдом в отдельной папочке, и эта папка была добавлена в источники. При этом из мейна хидер таймера был в упор не виден. Ну ладно, не суть может глюк какой-то. Тоже поборол. Ждем обнову.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

еще один "бажик" нового иара - открываю проект, снимаю птичку мультифайловой компиляции, сохраняю, закрываю среду. Запускаю по новой - птичка стоит. Не знаю - баг самого проекта от предыдущей версии, или баг среды, или оно эту птичку само выставляет потому что по каким то причинам считает это нужным.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Приветствую, уважаемые. Есть тривиальная задача подключения 7 сегментного индикатора. Для экономии ног будет использован отдельный bcd в 7 сегмент дешифратор. Вопрос в следующем какие есть варианты передачи на сам дешифратор? Сам пока вижу следующее - ширина 4бит следовательно используется 4 ноги (для примера P1 - P4):
Спойлер

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

#define DIG0      ~(GPIO_ODR_1 | GPIO_ODR_2 | GPIO_ODR_3 | GPIO_ODR_4)
#define DIG1      GPIO_ODR_1
...
#define DIG9      (GPIO_ODR_1 | GPIO_ODR_3)

int main(void){

/* тактирование и инициализация портов */

uint8_t digits[] {DIG0, DIG1 ... DIG9);

for (uint8_t i = 0; i < 9; i++){
   GPIOA->ODR |= digits[i]
   relay();
}
На сколько коряво такое решение и как правильнее решить эту задачу?
Последний раз редактировалось pavell Ср июл 11, 2018 21:11:19, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

pavell, самое правильное решение - то, которое работает как задумывалось.
А как оно выполнено - по большому счёту, фиолетово.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

pavell , оптимальное -аппаратная динамическая индикация на таймере и дма.
Есть вариант на внешних сдвиговых регистрах, здесь эмуляция многоканального SPI опять таки же на таймере и дма...
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

Сообщение alexf58 »

Если необходимо экономить ножки до такой степени что хочется вставить внешний чип, то лучше не дешифратор, а сдвиговый регистр. Всего 2 ноги на управление. Можно SPI, а можно и ногодрыжеством, поскольку скорости много не надо. Так проще. В прерывании по таймеру. Если больше одной цифры, можно либо использовать еще сколько то ножек для динамической индикации. Скажем 4 знака. Если осталось 4 ноги процессора, то прямо управлять ключами. Если нет - 2 ножки и дешифратор.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

alexf58 , если приходится экономить что либо -выбор камня сделан не верно, и это подход кулибина-наколенника.
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Спасибо за советы, посмотрю на сдвиговые регистры, реализация как мне кажется более изящная + экономия ног. К слову МК будет использоваться в корпусе TSSOP-20 т.е. ног не много. Ну и сегодня попытался реализовать описанное мою выше , понял что даже там можно упростить. Вот так глядишь и научусь чему-нибудь ))

[uquote="dosikus",url="/forum/viewtopic.php?p=3418319#p3418319"]alexf58 , если приходится экономить что либо -выбор камня сделан не верно, и это подход кулибина-наколенника.[/uquote]
Ну я собственно им и являюсь, чоуж. А выбор сделан в соответствии со своими возможностями, под 48 ногий корпус мне ни платы не изготовить, ни МК запаять.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Все ваялось "на коленке" - лутЪ, и жало "топор" 900m-t-k

Изображение

Изображение

Изображение

Изображение
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

Сообщение alexf58 »

[uquote="dosikus",url="/forum/viewtopic.php?p=3418319#p3418319"]alexf58 , если приходится экономить что либо -выбор камня сделан не верно, и это подход кулибина-наколенника.[/uquote]

Естественно В ОБЩЕМ СЛУЧАЕ лучше всего выбрать чип где всего хватает. Но вопрос был не об этом. Более того, в отдельных случаях дополнительный корпус полезен, например если нужно 5 В на выходе, или больше ток чем может дать сам процессор. Но главное, что на вопрос "как вытащить Жигули из лужи", ответ "ездить на Джипе" может и правильный, но не очень полезный.

P.S. В наше время китайцы делают небольшие двухсторонние платы с маской и надписями примерно по $1 штука. Если не надо прямо сегодня, зачем лутовское наколенное кулибинство?
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Добрый вечер столкнулся с необъяснимым для себя. Имеется таймер с прерыванием по переполнению, который работает при дефолтных настройках тактирования (HSI 8Мгц). Добавляю в функцию SystemInit() файла system_stm32f0xx.c, сразу после сброса предделителей, делитель шины APB1EHR и либо таймер, либо прерывание перестают работать (а может и оба сразу). Мануал каких то особых рекомендаций и условий установки предделителя не дает. Я обескуражен :dont_know:

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

 /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */
 RCC->CFGR &= (uint32_t)0xF8FFB80CU;
 RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV16;    //добавленная строка
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="pavell",url="/forum/viewtopic.php?p=3421216#p3421216"]сразу после сброса предделителей, делитель шины APB1EHR и либо таймер, либо прерывание перестают работать (а может и оба сразу).[/uquote]
Уверен, что таймер именно перестает работать, а не работает в 16 раз медленнее?
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Уверен, так как меняю значения прескейл с 7999 на 999, даже если бы я этого не сделал, то работал бы он только в 8 раз медленнее, т.к. на эти таймеры после делителя идет "железный" множитель на 2

UPD. Не знаю на сколько можно верить отладчику, но он показывает, что таймер таки работает и по крайней мере значение счетчика растет. Смею предположить, что дело в прерывании.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="pavell",url="/forum/viewtopic.php?p=3421224#p3421224"]Уверен, так как меняю значения прескейл с 7999 на 999, даже если бы я этого не сделал, то работал бы он только в 8 раз медленнее, т.к. на эти таймеры после делителя идет "железный" множитель на 2[/uquote]
Точно, в 8 раз, но это сам таймер будет в 8 раз медленнее, а шина в 16 раз и через эту шину идет доступ к регистрам таймера. В начале обработчика прерывания обычно сбрасываются флаги, но из-за делителя это произойдет с опозданием и если обработчик небольшой, то сразу после выхода в него сразу попадем снова. Чтобы удостоверится, что флаги сброшены достаточно прочесть регистр TIMx->SR...
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="Reflector",url="/forum/viewtopic.php?p=3421254#p3421254"]но из-за делителя это произойдет с опозданием и если обработчик небольшой, то сразу после выхода в него сразу попадем снова.[/uquote]
Спасибо, все так и было. Поставил в обработчик цикл задержки и появились признаки правильной работы. Это что получается - использование отдельных делителей шин AHB, APB зло?
Встал на лапы
Аватара пользователя
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Сообщение bezzabotna »

Здравствуйте!. Помогите разобраться с FSMC.
Пишу программу для управления дисплеем на ST7735R (8 бит, параллельный интерфейс). https://cdn-shop.adafruit.com/datasheet ... R_V0.2.pdf
Весь даташит прочитала, но всего, что мне надо не нашла.

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

#define COM_ADR  		*(uint16_t*)0x60000000
#define DAT_ADR		*(uint16_t*)0x60080000
//---------------------------------------------------------------------------------------//
void LCD_Write_Com(uint16_t com,uint16_t data ){
	COM_ADR	= com;
	DAT_ADR	=	data;
}
//---------------------------------------------------------------------------------------//
void LCD_Write_Data(uint16_t data ){
	DAT_ADR	=	data;
}
FSMC настраивался с помощью Cube.
Теперь мне надо инициализировать дисплей.
Тут в статье нашла что-то похожее для AVR:

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

void Send(unsigned char DATA, unsigned char DC);
void disp_init()
{
	Send(SWRESET,0);	//программный ресет
	_delay_ms(120);

	Send(SLPOUT,0);		//будим после ресета
	_delay_ms(120);

	Send(DISPON,0);		//включаем экран

	Send(MADCTL,0);		//меняем вывод цветов с GBR на RGB
	Send(0b00001000,1);

	Send(COLMOD,0);		//меняем кодировку цветопередачи на 2-байтную (64К цветов)
	Send(5,1);
	
}
То есть человек просто отправляет данные и флаг команда/данные.
А мне получается надо в функции LCD_Write_Com отправлять данные по одному адресу, а команду по другому. То есть data =SWRESET, например. Флаг данных/команды тоже выставляется там где #define. А соm где найти? И я не очень понимаю откуда эти адреса брать. В документации показаны только данные, адресов нет. Во вложении показано как выглядит описание команд. Есть еще одна статья, но там тоже не объясняется откуда это все берется и как искать https://microtechnics.ru/stm32-i-disple ... anie-fsmc/.
Как это искать? Или я что-то неправильно понимаю.

Или может быть этот подход для других дисплеев, а мне нужны функции с одним аргументом?

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

void LCD_Write_Com(uint16_t com);
void LCD_Write_Data(uint16_t data );
Вложения
3.png
список команд ч3
(119 КБ) 448 скачиваний
2.png
список команд ч2
(111.75 КБ) 248 скачиваний
1.png
список команд ч1
(91.21 КБ) 458 скачиваний
Я конечно все понимаю, но этого я не понимаю.
Ответить

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