Да, можно. И пины будут работать правильно.IRF840 писал(а): имеется ,hex для STM32F100C8. Можно ли его залить в STM32F100RBT6B и будут ли совпадать после этого одноименные пины?
STM32 новичку в ARM что к чему
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: STM32 новичку в ARM что к чему
Все будет только лучше, в крайнем случае - хуже.
- Реклама
Re: STM32 новичку в ARM что к чему
coredumped, есть пользовательский и привилегированный режимы.
Код: Выделить всё
void Write_Config(uint8_t page){ //Один пакет - 8байт
uint32_t address;
uint32_t data;
//Разблокировка
flash_unlock();
address = FLASH_BASE + 1024 * page; //Начальный адресс поиска - начало страници
//Находим первый пустой пакет
while((*(__IO uint32_t*) address) != 0xFFFFFFFF){ //Если пакет записан
address += 8; //Шагаем на 8 ячеек (1 пакет)
if(address == FLASH_BASE + 1024 * (page+1) -8){ //Если дошли до граници страници
flash_erase_page(address); //Стираем страницу
break;
}
}
FLASH->CR |= FLASH_CR_PG; //Разрешаем программирование флеша
while(!flash_ready()); //Ожидаем готовности флеша к записи
*(__IO uint16_t*)address = (uint16_t)config.u16a; //Пишем младшие 2 бата
while(!flash_ready());
address+=2;
*(__IO uint16_t*)address = (uint16_t)config.u16b; //Пишем следующие 2 байта
while(!flash_ready());
address+=2;
data = config.u8c;
data = data <<8;
data |= config.u8d;
*(__IO uint16_t*)address = (uint16_t)data; //Пишем следующие 2 байта
while(!flash_ready());
address+=2;
*(__IO uint16_t*)address = (uint16_t)config.u16e; //Пишем старшие 2 байта
while(!flash_ready());
flash_lock(); //Запрещаем программирование флеша
}Re: STM32 новичку в ARM что к чему
Еще один вопрос - в схеме заведено питание от двух разных стабилизаторов на VDD и VDDA, я хочу приспособить Дискавери для этой схемы, но VDDA (VSSA тоже) там не выведены. Нужно ли подпаиваться к этим пинам?
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: STM32 новичку в ARM что к чему
VDDA/VSSA - (аналоговые питатие и земля) отдельно запитывают для повышения точности работы ЦАП и АЦП. Обычно, достаточно фильтра по питанию (LC). Discovery запитана по упрощенному варианту - все подключено напрямую. Если Вам высокая точность ADC не нужна, то можете не заморачиваться с подключением отдельного питания к VDDA.
Вот код, который использую я:
Процессор STM32F051
Функции стандартные, из либ ST.
В обработчике прерывания не проверял, но могу попробовать на выходных, если хотите. Чтоб эксперимент был точным, скажите какой у Вас контроллер,
я могу проверить на STM32F051, F417, F103
Можете ссылку дать на документ? Что-то я такого нигде не встречал. Кмк Вы путаете с режимом работы процессора.drakon писал(а):coredumped, есть пользовательский и привилегированный режимы.
Вот код, который использую я:
Код: Выделить всё
#include "stm32f0xx_it.h"
#define SYSCONF_FLASH_ADDRESS (uint32_t)0x0800FC00
uint32_t conf_data;
//skip
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
FLASH_ErasePage(SYSCONF_FLASH_ADDRESS);
FLASH_ProgramWord(SYSCONF_FLASH_ADDRESS, conf_data);
FLASH_Lock();
Функции стандартные, из либ ST.
В обработчике прерывания не проверял, но могу попробовать на выходных, если хотите. Чтоб эксперимент был точным, скажите какой у Вас контроллер,
я могу проверить на STM32F051, F417, F103
Последний раз редактировалось coredumped Чт окт 10, 2013 07:00:48, всего редактировалось 1 раз.
Все будет только лучше, в крайнем случае - хуже.
Re: STM32 новичку в ARM что к чему
coredumped, да, режим работы ядра.
вопрос снимается. разбил процедуру на 2части: 1) вычисление внутреннего адреса и, если нужно, стирание страници (подготовка). 2) собственно запись, которая вызывается из обработчика прерывания от PVD.
вопрос снимается. разбил процедуру на 2части: 1) вычисление внутреннего адреса и, если нужно, стирание страници (подготовка). 2) собственно запись, которая вызывается из обработчика прерывания от PVD.
- Реклама
Re: STM32 новичку в ARM что к чему
в stm32f1хх можно стирать целый сектор (1..2..4К в зависимости от чипа), зато писать можно побайтно, или, для ускорения, по 4-байтному слову.В stm32f4 что бы записать 1 байт надо весь сектор что ли стереть ???
если количество данных небольшое, выделите последний сектор и пишите как в кольцевой буфер - каждый раз на новый адрес. По достижении конца страницы - полное стирание.
так время жизни памяти намного увеличивается, даже может пережить по циклам ту же 24хх
Re: STM32 новичку в ARM что к чему
Такой принцип реализован в EEPROM emulation от ST. Только они там используют 2 страницы, что обеспечивает сохранность данных, если при стирании страницы произойдет, например, сбой по питанию.
http://www.st.com/web/en/catalog/tools/PF257902
http://www.st.com/web/en/catalog/tools/PF258153
http://www.st.com/web/en/catalog/tools/PF257902
http://www.st.com/web/en/catalog/tools/PF258153
Иван Сусанин - первый полупроводник 
Re: STM32 новичку в ARM что к чему
можно и так. Я писал свой велосипед, т.к. особых требований по надежности не было, и в работе пропадание питания не мешает.
-
GHOST_J_D
- Родился
- Сообщения: 12
- Зарегистрирован: Пт дек 14, 2012 21:07:49
- Откуда: Екатеринбург
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Среда IDE эклипс с примочками собраная как написано тут http://kazus.ru/forums/showthread.php?t=105029 "Изучаем ARM. Собираем свою IDE для ARM.pdf."
Дошел до методы "Изучаем ARM. Отладка ARM приложений в Eclipse IDE.pdf" (http://kazus.ru/forums/showthread.php?t=105029 ) там автор прикручивает клон JLINK
Вопросы
1) Имеется плата DISCO f3 с отладчиком stlink v2 на борту, стоит ли заказывать клон JLINK V8 с алиэкспреса, или можно обойтися встроеным stlink v2 (который вроде как чем то урезан).
2) Если заказывать то какой клон JLINK поддерживающий семейства кортекс M0, M1, M2, M3, M4 выбрать на илиэкспрессе ?
http://www.aliexpress.com/wholesale?Sea ... 1013035819
Дошел до методы "Изучаем ARM. Отладка ARM приложений в Eclipse IDE.pdf" (http://kazus.ru/forums/showthread.php?t=105029 ) там автор прикручивает клон JLINK
Вопросы
1) Имеется плата DISCO f3 с отладчиком stlink v2 на борту, стоит ли заказывать клон JLINK V8 с алиэкспреса, или можно обойтися встроеным stlink v2 (который вроде как чем то урезан).
2) Если заказывать то какой клон JLINK поддерживающий семейства кортекс M0, M1, M2, M3, M4 выбрать на илиэкспрессе ?
http://www.aliexpress.com/wholesale?Sea ... 1013035819
- coredumped
- Опытный кот
- Сообщения: 838
- Зарегистрирован: Вт апр 12, 2011 18:38:19
- Откуда: с Земли
Re: STM32 новичку в ARM что к чему
Если будете отлаживать процы от ST (STM32), кроме ST-LINK ничего не нужно. И все эти мифы о его "урезанности" можете не слушать. Те ST-LINKи, что ставят на всякие девборды, обычно имеют только SWD. "Полный" имеет еще и JTAG. Однако это не проблема, тк нет никаких ограничений в отладке по SWD в сравнении с JTAG.
J-Link хорош своей "всеядностью" - те он умеет практически все ARM-ы. Если думаете осваивать ARMы, например от NXP или TI, тогда есть смысл прикупить J-Link. Если надумаете, берите J-Link Pro (тот, что с Ethernet). Очень удобно делать удаленную отладку.
J-Link хорош своей "всеядностью" - те он умеет практически все ARM-ы. Если думаете осваивать ARMы, например от NXP или TI, тогда есть смысл прикупить J-Link. Если надумаете, берите J-Link Pro (тот, что с Ethernet). Очень удобно делать удаленную отладку.
Все будет только лучше, в крайнем случае - хуже.
Re: STM32 новичку в ARM что к чему
Дело то не в JTAG, JTAG как таковой и на не упал . Полный STLink имеет согласование уровней и имеет SWIM.coredumped писал(а): И все эти мифы о его "урезанности" можете не слушать. Те ST-LINKи, что ставят на всякие девборды, обычно имеют только SWD. "Полный" имеет еще и JTAG.
А вот JLink имеет еще и SWO.
Так что не надо свои надумки приводить...
-
GHOST_J_D
- Родился
- Сообщения: 12
- Зарегистрирован: Пт дек 14, 2012 21:07:49
- Откуда: Екатеринбург
- Контактная информация:
Re: STM32 новичку в ARM что к чему
http://www.aliexpress.com/item/Free-Shi ... 07502.html Если его перешить то будет STM32 F0 (Cortex M0)семейство шить? Или этот http://www.aliexpress.com/item/V8-emula ... 18871.html заказать лучше под Сortex M0 ?
Re: STM32 новичку в ARM что к чему
GHOST_J_D, это одно и то же .
Возможно у второго плата качественней , да и то не факт .
STM32F0x есть поддержка вплоть до STM32F03x на новых дровах от Segger - 4.78.
Для сравнения фото платы моего .

Возможно у второго плата качественней , да и то не факт .
STM32F0x есть поддержка вплоть до STM32F03x на новых дровах от Segger - 4.78.
Для сравнения фото платы моего .

- black_lizard
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вс сен 23, 2012 05:51:35
Re: STM32 новичку в ARM что к чему
Здравствуйте, хочу задать вопрос про DMA.
Плата STM32VLDISCOVERY на stm32f100rb.
Хочу прикрутить к ней видеовывод на телевизор.
Делаю следующим образом:
Вывод одной строки занимает 64 мкс. Создаю массив на 64 байта, в котором байт задаёт выводы на GPIO порта, на котором через резисторы подключён RCA вывод.
Настраиваю DMA на циклический вывод, раз в мкс менять этот самый байт.
Заполняю массив информацией, запускаю, работает, на экране телевизора появляются ровные белые полосы там, где я задал вывод белого цвета в массиве.
Увеличиваю точность до 128, то есть сигнал меняется два раза в 1 мкс(2 мгц по сути, скорость смены сигнала на GPIO).
Линии тоньше, ровные, работает.
И вот тут начинаются проблемы. Если увеличиваю точность ещё выше, то изображение выходит прыгающее, бегающее и вообще не стабильное. Даже не зубчики на линиях, как бывает при неправильных таймингах, а просто мельтешение белыми строками. Пробовал править тайминги, но для телевизора по сути важна только предельная одинаковость сигнала синхронизации. Ему достаточно этого, чтобы строчки выводились ровно.
DMA управляется таймером, который срабатывает каждые 24 такта(24 мгц камень, то есть один мкс это 24 000 000 / 1 000 000 тактов). 12 тактов тоже работает. Четырёхкратная точность это обращение к DMA каждые 6 тактов. Мне нужна 6-кратная точность, то есть чтобы DMA срабатывало каждые 4 такта.
Единственное, что мне пришло в голову - проблема в аппаратной части
подскажите, в какую сторону копать? GPIO пробовал настраивать на 10 и 50 мгц, но это ничего не изменило. Может быть дело в DMA?
Для генерации сигнала используется DMA1, 5 канал и 15 таймер.
Инициализируются так:
Плата STM32VLDISCOVERY на stm32f100rb.
Хочу прикрутить к ней видеовывод на телевизор.
Делаю следующим образом:
Вывод одной строки занимает 64 мкс. Создаю массив на 64 байта, в котором байт задаёт выводы на GPIO порта, на котором через резисторы подключён RCA вывод.
Настраиваю DMA на циклический вывод, раз в мкс менять этот самый байт.
Заполняю массив информацией, запускаю, работает, на экране телевизора появляются ровные белые полосы там, где я задал вывод белого цвета в массиве.
Увеличиваю точность до 128, то есть сигнал меняется два раза в 1 мкс(2 мгц по сути, скорость смены сигнала на GPIO).
Линии тоньше, ровные, работает.
И вот тут начинаются проблемы. Если увеличиваю точность ещё выше, то изображение выходит прыгающее, бегающее и вообще не стабильное. Даже не зубчики на линиях, как бывает при неправильных таймингах, а просто мельтешение белыми строками. Пробовал править тайминги, но для телевизора по сути важна только предельная одинаковость сигнала синхронизации. Ему достаточно этого, чтобы строчки выводились ровно.
DMA управляется таймером, который срабатывает каждые 24 такта(24 мгц камень, то есть один мкс это 24 000 000 / 1 000 000 тактов). 12 тактов тоже работает. Четырёхкратная точность это обращение к DMA каждые 6 тактов. Мне нужна 6-кратная точность, то есть чтобы DMA срабатывало каждые 4 такта.
Единственное, что мне пришло в голову - проблема в аппаратной части
Для генерации сигнала используется DMA1, 5 канал и 15 таймер.
Инициализируются так:
Код: Выделить всё
#define CLK_SPEED 24000000
#define PRECISION 2
#define US_FROM_CLK CLK_SPEED / (1000000 * PRECISION)
unsigned char dmaVideoBytes[64*PRECISION];
...
RCC->APB2ENR |= RCC_APB2ENR_TIM15EN;
TIM15->ARR = US_FROM_CLK-1;
TIM15->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
TIM15->CCER = TIM_CCER_CC1E;
TIM15->BDTR = TIM_BDTR_MOE;
TIM15->DIER = TIM_DIER_CC1DE;
TIM15->CR1 = TIM_CR1_CEN | TIM_CR1_ARPE;
DMA1_Channel5->CPAR = (uint32_t) & GPIOA->ODR;
DMA1_Channel5->CMAR = (uint32_t) & dmaVideoBytes[0];
DMA1_Channel5->CNDTR = (64*PRECISION)-PRECISION;
DMA1_Channel5->CCR = DMA_CCR1_MINC | DMA_CCR1_CIRC | DMA_CCR1_DIR
| DMA_CCR1_EN;Собираю самопальный мини-компьютер
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: STM32 новичку в ARM что к чему
Попробуйте формировать видеопоток через SPI(у него должны быть более точные тайминги). А в SPI уже грузить с DMA.
У вас похоже композитный выход. Я надеюсь вы помните что там нужен трёхуровневый сигнал?
У вас похоже композитный выход. Я надеюсь вы помните что там нужен трёхуровневый сигнал?
Re: STM32 новичку в ARM что к чему
black_lizard, разгоняй до 48MHz.
- black_lizard
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вс сен 23, 2012 05:51:35
Re: STM32 новичку в ARM что к чему
Спасибо за ответы, дело пошло вперёд.
Не совсем понял, что вы имеете ввиду. Не могли бы вы пояснить?Попробуйте формировать видеопоток через SPI(у него должны быть более точные тайминги). А в SPI уже грузить с DMA.
Синхросигнал - 0в, 0.3 - 1.0в это цвет. Это учитывается, первые 12 байт массива нули, так и формируется синхросигнал.У вас похоже композитный выход. Я надеюсь вы помните что там нужен трёхуровневый сигнал?
Проблема и правда решается разгоном и тут я встретил несколько новых проблем. HSE режим внешнего тактирования включается без проблем. А вот PLL не перенастраивается и продолжает работать в режиме умножения частоты на три. Я поменял кварц на плате на 12MHZ и получил 36 MHZ, в котором удалось менять сигнал на GPIO 3 раза за 1мкс(раз в 12 тактов). Выше не работает. Подскажите, что я делаю не правильно в инициализации PLL, 60 мгц были бы очень кстати, но умножитель просто не переключается:black_lizard, разгоняй до 48MHz.
Код: Выделить всё
void initPLL(){
uint32_t StartUpCounter = 0, HSEStatus = 0;
/* enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/* wait until HSE will work */
do{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
}while( (HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));
if ( (RCC->CR & RCC_CR_HSERDY) != RESET)
HSEStatus = (uint32_t)0x01;
else
HSEStatus = (uint32_t)0x00;
/* If HSE started */
if ( HSEStatus == (uint32_t)0x01){
/* configure FLASH for good work */
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_1;
RCC->CR &= ~RCC_CR_PLLON;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/* PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL5);
/* Init PLL */
RCC->CR |= RCC_CR_PLLON;
/* wait until PLL will work */
while((RCC->CR & RCC_CR_PLLRDY) == 0);
/* configure PLL as system clock */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* wait, until PLL will work*/
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08);
}else
while(1);
}
Последний раз редактировалось black_lizard Вт окт 15, 2013 20:09:29, всего редактировалось 1 раз.
Собираю самопальный мини-компьютер
-
The_D
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Пт июл 06, 2012 14:28:17
- Откуда: Россия. г.Смоленск
Re: STM32 новичку в ARM что к чему
Простите что вы имеете ввиду? (_/\_) или (_/\_/\_/\_)удалось менять сигнал на GPIO 3 раза за 1мкс
Длительность 1 импульса сколько в нс?
- black_lizard
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вс сен 23, 2012 05:51:35
Re: STM32 новичку в ARM что к чему
Обращение к регистру GPIOA->ODR; Он меняется 3 раза в мкс максимум, то есть 333 нс импульс, как я понимаю.The_D писал(а):Простите что вы имеете ввиду? (_/\_) или (_/\_/\_/\_)удалось менять сигнал на GPIO 3 раза за 1мкс
Длительность 1 импульса сколько в нс?
Говоря проще есть DMA. Есть массив. DMA читает байт из этого массива и записывает его в GPIOA порт каждые 12 тактов, по таймеру. Но выше 12 тактов он этого не делает почему-то. И потому здесь либо нужно как-то аппаратно решить проблему, либо разогнать проц.
Собираю самопальный мини-компьютер
- black_lizard
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вс сен 23, 2012 05:51:35
Re: STM32 новичку в ARM что к чему
UPD
Проблема решена. Порылся в настройках камня в кукоксе, исправил ошибки в дефайнах и настроил PLL на семикратное умножение(модифицировал режим 48mhz). На данной частоте без проблем можно менять сигнал на GPIO 5 раз в мкс. Судя по всему это предел для этого чипа..
Проблема решена. Порылся в настройках камня в кукоксе, исправил ошибки в дефайнах и настроил PLL на семикратное умножение(модифицировал режим 48mhz). На данной частоте без проблем можно менять сигнал на GPIO 5 раз в мкс. Судя по всему это предел для этого чипа..
Собираю самопальный мини-компьютер


