Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 – вопросы – проблемы - решения.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
e-serg
Цитата(InsolentS @ Mar 1 2011, 08:39) *
Не пойму, нужно ли выводить ресет на разьем SWD? Или достаточно SWCLK и SWDIO ?

Достаточно, на мелких платах только их и использую.
InsolentS
Цитата(e-serg @ Mar 1 2011, 11:29) *
Достаточно, на мелких платах только их и использую.

Спасибо. А на крупных платах как поступаете? Разводите JTAG?
scifi
Тоже вывожу только SWCLK и SWDIO. Выводить JTAG смысла не вижу: разве JTAG даёт какое-нибудь преимущество над SWD при отладке?
InsolentS
Цитата(scifi @ Mar 1 2011, 17:43) *
Тоже вывожу только SWCLK и SWDIO. Выводить JTAG смысла не вижу: разве JTAG даёт какое-нибудь преимущество над SWD при отладке?

Вроде скорость заливки во FLASH выше.
Я правильно понимаю, что в любой момент времени, если на пинах SWCLK и SWDIO появится определённая последовательность данных, проц перейдёт в режим отладки? Получается потенциально опасная ситуация
scifi
Цитата(InsolentS @ Mar 1 2011, 19:24) *
Я правильно понимаю, что в любой момент времени, если на пинах SWCLK и SWDIO появится определённая последовательность данных, проц перейдёт в режим отладки? Получается потенциально опасная ситуация

Вот что сказано в руководстве по STM32:
Цитата
If the debugger host wants to switch to the SW-DP, it must provide a dedicated JTAG
sequence on TMS/TCK (respectively mapped to SWDIO and SWCLK) which disables the
JTAG-DP and enables the SW-DP. This way it is possible to activate the SWDP using only
the SWCLK and SWDIO pins.
This sequence is:
1. Send more than 50 TCK cycles with TMS (SWDIO) =1
2. Send the 16-bit sequence on TMS (SWDIO) = 0111100111100111 (MSB transmitted first)
3. Send more than 50 TCK cycles with TMS (SWDIO) =1

Я так понимаю, этот танец с бубном сделан таким для того, чтобы он никак не мог произойти при нормальном использовании JTAG. Поэтому можно спать спокойно.
akimych
Цитата
если на пинах SWCLK и SWDIO появится определённая последовательность данных, проц перейдёт в режим отладки? Получается потенциально опасная ситуация

Не проц перейдет в режим отладки, а JTAG переключится в режим SWD.
Резет теоретически может пригодиться на случай, если прошивка переводит мк в режим, когда отладчик не может подключиться.
Но я бы на этот случай подключал boot0 на землю через резистор, чтобы в крайнем случае можно было запустить бутлоадер и потом отладчик.
Ivan Kuznetzov
привет всем! Хочу использовать одновременно IWDG и STOP режим. Как-то это можно обыграть? Я так понимаю, если я войду в спячку, то вачдог сбросит МК.
Murk
Ivan Kuznetzov Дауж врятли, скорее всего вместе с контроллером уснёт и вачдог.
У Renesas_a такое есть.
Ivan Kuznetzov
Проверил: если проц перевести в STOP при включенном IWDG, то последний сбросит МК. Т.е. надо вачдог как-то обновлять во время спячки
InsolentS
Кто-нибудь пробовал применить встроенный CEC интерфейс для чего-нибудь полезного? Например, в качестве дополнительного UART или I-wire (если это вообще возможно) ?
KnightIgor
Цитата(Ivan Kuznetzov @ Mar 2 2011, 17:12) *
Проверил: если проц перевести в STOP при включенном IWDG, то последний сбросит МК. Т.е. надо вачдог как-то обновлять во время спячки

Посмотри DBGMCU тему: если в регистре DBGMCU->CR установить бит DBGMCU_IWDG_STOP (0x100) где-нибудь в процессе инициализации системы, то при отладке IWDG тоже будет стоять. Это имеется ввиду?


Цитата(InsolentS @ Mar 3 2011, 17:26) *
Кто-нибудь пробовал применить встроенный CEC интерфейс для чего-нибудь полезного? Например, в качестве дополнительного UART или I-wire (если это вообще возможно) ?

CEC интерфейса как отдельного железа нет: это библиотечная реализации протокола управления бытовой аппаратурой с использованием существующей "обычной" периферии.
InsolentS
Цитата(KnightIgor @ Mar 9 2011, 14:33) *
Посмотри DBGMCU тему: если в регистре DBGMCU->CR установить бит DBGMCU_IWDG_STOP (0x100) где-нибудь в процессе инициализации системы, то при отладке IWDG тоже будет стоять. Это имеется ввиду?



CEC интерфейса как отдельного железа нет: это библиотечная реализации протокола управления бытовой аппаратурой с использованием существующей "обычной" периферии.

А за что отвечает пин "CEC" (PB8 в stm32f100xx) ?
Serj78
А кто- нибудь заморачивался написанием собственного софта (под PC) для прошивки STM32 через его штатный бутлоадер на производстве?
Сейчас использую ST-шный flash loader demonstrator, но он слишком универсальный по интерфейсу...

Хочется окно с одной кнопкой- прошить- он стирает чип и заливает новую прошивку из hex- файла например..

Есть ли открытые подобные проекты? А то из programing manual не все понятно sm.gif
AHTOXA
stm32flash
Serj78
Спасибо! Пока не разобрался как скачать, "This project currently has no downloads."
AHTOXA
Качать там нужно исходникиsm.gif
Ant.
Кто-нибудь разбирался с изохронным USB?
В документации для STM32F103C8 написано, что максимальный размер пакета для изохронного эндпоинта 512 байт.
Но не понятно, в случае эндпоинта с двумя буферами, получается максимальный размер пакета 256 байт ?

Использую библиотеку STM32_USB-FS-Device_Driver V3.2.1.
При передаче пакетов размером 192 байта с интервалом 1мс работает, а 384 - уже нет...

Еще не совсем понятно, как устанавливать значения ENDP1_BUF0Addr и ENDP1_BUF1Addr в файле usb_conf.h.
Danis
Цитата(Ant. @ Mar 14 2011, 00:00) *
Но не понятно, в случае эндпоинта с двумя буферами, получается максимальный размер пакета 256 байт ?


Вот из даташита.
22.2 USB main features
● USB specification version 2.0 full-speed compliant
● Configurable number of endpoints from 1 to 8
● Cyclic redundancy check (CRC) generation/checking, Non-return-to-zero Inverted
(NRZI) encoding/decoding and bit-stuffing
● Isochronous transfers support
● Double-buffered bulk/isochronous endpoint support
● USB Suspend/Resume operations
● Frame locked clock pulse generation
Note: The USB uses a dedicated 512-byte SRAM memory for data transmission and reception
(only the USB accesses this SRAM).


У меня так и получилось. MAx размер пакета 256 байт.


Fry__
Подскажите - как правильно организовать работу DMA с группой введеных каналов ADC1 и ADC2, или введеные каналы только в прерывании надо обслуживать?
akimych
Цитата из даташита
Цитата
Only the end of conversion of a regular channel generates a DMA request ...


Danis
Цитата(Fry__ @ Mar 14 2011, 17:20) *
Подскажите - как правильно организовать работу DMA с группой введеных каналов ADC1 и ADC2, или введеные каналы только в прерывании надо обслуживать?


Чето вопрос не совсем понял. Переформулируйте. А вообще разве ADC2 можно на DMA посадить?

Reference manual STM32_rev11
Note: Only ADC1 and ADC3 have this DMA capability. ADC2-converted data can be transferred in
dual ADC mode using DMA thanks to master ADC1.
Fry__
Цитата(akimych @ Mar 14 2011, 21:42) *
Цитата из даташита: Only the end of conversion of a regular channel generates a DMA request ...

Ясно, спасибо.

Цитата(Danis @ Mar 14 2011, 22:00) *
Чето вопрос не совсем понял. Переформулируйте. А вообще разве ADC2 можно на DMA посадить?

Reference manual STM32_rev11
Note: Only ADC1 and ADC3 have this DMA capability. ADC2-converted data can be transferred in
dual ADC mode using DMA thanks to master ADC1.

Да, да - я знаю. Я имел ввиду работу ADC1&2 в Dual режиме.
Просто есть восемь входных аналоговых сигналов, я подумал сформировать введеные группы на первом и втором АЦП. Хотелось использовать смещение, для регулярных каналов оно не поддерживается.
Danis
Возникло затруднение при выборе в IAR языка С++. Хочу часть программы перенести с «большой машины» на контроллер STM32, там она ООП вся, на Си переписывать нет времени.
Все компилиться и зашивается как и при использовании языка Си, но программа не отлаживается J-Link-ом, вернее начинает отлаживаться и затыкается. Использую периферийную библиотеку STM32 version V3.4.0.
Все нормально инициализируется, но после инициализации NVIC, программа затыкается так (см. скриншот). В чем косяк? Предполагаю, что не видит обработчик прерывания?
AHTOXA
extern "C" TIM2_IRQHandler()
...
Danis
Цитата(AHTOXA @ Mar 22 2011, 19:51) *
extern "C" TIM2_IRQHandler()
...

СПАСИБО, так работает!
Alechin
А как-нибудь сделать обработчик членом класса можно? Имя то будет уже другим. "В лоб" не получилось.
Например самый простой вариант - SysTick таймер.
akimych
Цитата
А как-нибудь сделать обработчик членом класса можно?

Подозреваю, что это не очень хорошая мысль. Вызываться-то он будет, как обычная процедура.
Такое прокатит разве что со статическим методом. Но видимо придется в стартапе прописать реальное имя этого метода.
Тогда уж проще из обычного обработчика вызывать метод класса.

Кто использует RTC у STM32, нормально часы работают?
Просто я в ветке про "LPC1768 и RTC" наткнулся на фразу
Цитата
Означает, что RTC в первых ревизиях уходят более чем на 1с. за сутки на краях рабочих температур.

Т.е. 1с в сутки это много. А у меня на стм32 при комнатной температуре уход часов на неск. секунд в сутки обычное дело.
IgorKossak
Цитата(akimych @ Mar 25 2011, 15:30) *
Кто использует RTC у STM32, нормально часы работают?

Замечательно работают. Естественно, какой-то уход всегда будет, но не 1 с в сутки, это точно.
akimych
Цитата
Замечательно работают. Естественно, какой-то уход всегда будет, но не 1 с в сутки, это точно.

А какие кварцы используете?
IgorKossak
Цитата(akimych @ Mar 26 2011, 02:15) *
А какие кварцы используете?

Да самые, что ни есть, обычные.
NC38 Кварцевый резонатор часовой (32.768 кГц, +/-20 ppm, C=12.5pF, -20 to +60C), корпус цилиндрический d=3mm, h=8.3mm
Теоретически, при +/-20 ppm они могут уходить и больше, чем на секунду в сутки, но на практике получается секунда за трое суток - неделю. Может я везучий?
Ах да, может это важно, я не беру комплектующие на радиорынке, только у проверенных поставщиков.
akimych
Цитата
NC38 Кварцевый резонатор часовой (32.768 кГц, +/-20 ppm, C=12.5pF, -20 to +60C), корпус цилиндрический d=3mm, h=8.3mm

Вот интересно, в даташите на стм32 есть фраза
Цитата
To avoid exceeding the maximum value of CL1 and CL2 (15 pF) it is strongly recommended to use a resonator
with a load capacitance CL < 7 pF. Never use a resonator with a load capacitance of 12.5 pF.

Получается, зря пугают?

А кварцы у меня в таком же корпусе, правда вроде бы не NC38, а DT38. Куплены не на рынке, серийное изделие все-таки.


uu5jkb
Добрый вечер всем.
Поставил себе Keil uVision 4.20, открыл первый попавшийся пример, подключил плату STM32VLDiscovery, прошил, дебаггером погулял, порадовался. Далее пытаюсь написать что-то самостоятельно, и, чтобы не гонять контроллер, пытаюсь дебажить программу симулятором. Для тренировки опять открыл проект из примеров, ничего не поганил в нем. Запускаю дебаггер, в окне дизассемблера указатель на адресе 0х00000000 с командой mov r0, r0. Жму F10, указатель остается на месте, в SP появляется какое-то немыслимое число 0xFFFFFFF8 или около того. Ни на main, ни на Reset Handler указатель не перескакивает, до брейк-пойнтов после нажатия на Run не идет. В окне Command пишут "Error 65. access violation at 0x00000000: no 'read' permission". В MAP Memory разрешаю отладчику делать с этим участком памяти все, ситуацию не спасает. Зашел на сайт Keil, там предложили как один из вариантов писать в Debug Command Window $=0x0800000. После этой команды указатель переходит в начало функции main, но дальше все равно по шагам не идет. Настройки памяти в Options не трогал, начальные адреса нормальные. Расскажите, пожалуйста, где и почему я дурак. Пробовал открывать проекты других контроллеров (LPC, Atmel etc) - дебаггер прекрасно работает
akimych
Цитата
пытаюсь дебажить программу симулятором

Не поддерживает симулятор кейла полноценно серию STM32F100, только ядро.
Выбирайте F101 и симулируйте. Это самый простой способ.
Или можно прописать DLL-ки от F101 в опциях симулятора/отладчика.

Сколько уже народу на эти грабли наступило...

uu5jkb
Цитата(akimych @ Mar 29 2011, 02:20) *
Не поддерживает симулятор кейла полноценно серию STM32F100, только ядро.
Выбирайте F101 и симулируйте. Это самый простой способ.
Или можно прописать DLL-ки от F101 в опциях симулятора/отладчика.

Сколько уже народу на эти грабли наступило...


Большое спасибо, помогло. А как, интересно, сам Keil комментирует такую ситуацию...
Про грабли - это верно, зато не пропустил опыт. Еще раз спасибо
Картофель-фри
Всем привет

Хотел сказать что есть такая интересная статья по всем преимуществам STM32 против AVR, Stellaris, LPC krapula.gif .

http://www.compeljournal.ru/enews/2011/2/3

Особенно интересный график под конец! STM32 рулит disco.gif !
KSN
Помогите выйти из 3-х сосен: проц STM32F103RBT6. Программирую порты PA0-PA3 как Floating input. К этим выводам подключены джамперы, которыми устанавливаю "0", либо "1". При включении платы PA0 постоянно "0", после сброса по NRST состояние PA0 определяется джампером.
Уже замучился искать, где ошибся. Какие настройки можно глянуть?
Danis
Цитата(KSN @ Mar 30 2011, 11:10) *
Помогите выйти из 3-х сосен: проц STM32F103RBT6. Программирую порты PA0-PA3 как Floating input. К этим выводам подключены джамперы, которыми устанавливаю "0", либо "1". При включении платы PA0 постоянно "0", после сброса по NRST состояние PA0 определяется джампером.
Уже замучился искать, где ошибся. Какие настройки можно глянуть?


Выложите свой исходник инициализации порта, гляну.
Юрийюрич
Парочка хинтов.
Некоторое время назад пришлось поработать с STM32 с многими используемым замечательным скриптом stm32loader.py. Если в компьютере есть последовательный порт, скрипт замечательно с ним работает. Но компьютеры с таким портом уже давно редкость, приходится использовать USB-переходники (FTDI, Prolific). При использовании их заливка прошивки идёт раза в два медленнее. Дело в том, что скрипт высылает данные побайтно, а драйвер для каждого байта отправляет по USB целый блок и получает подтверждение. Оверхед налицо!
Проблема лечится в методе cmdWriteMemory: собираем весь блок (до 256 байт) данных в стринг, затем вываливаем его драйверу одним махом. Вот так:
CODE
def cmdWriteMemory(self, addr, data):
assert(len(data) <= 256)
strwr = '' #Data will be collected to this bytestring
if self.cmdGeneric(0x31):
mdebug(10, "*** Write memory command")
self.sp.write(self._encode_addr(addr))
self._wait_for_ask("0x31 address failed")
#map(lambda c: hex(ord( c )), data)
lng = (len(data)-1) & 0xFF
mdebug(10, " %s bytes to write" % [lng+1]);
strwr += chr(lng)
crc = 0xFF
for c in data:
crc = crc ^ c
strwr += chr( c )
strwr += chr(crc)
self.sp.write(strwr) #Write the whole collected bytestring
self._wait_for_ask("0x31 programming failed")
mdebug(10, " Write memory done")
else:
raise CmdException("Write memory (0x31) failed")

И ещё одна проблема наблюдалась. Скрипт открывает файл не используя бинарный режим явно, что под Windows иногда приводит к заливке прошивки неполностью.
Лечится в мэйне:
CODE
if (conf['write'] or conf['verify']):
data = map(lambda c: ord( c ), file(args[0], 'rb').read())
print 'File', args[0], ':', len(data), 'bytes'

Также порекомендую в конце скрипта включить команду на запуск программы, чтобы она сразу начинала работать без необходимости вручную выключать режим бутлодера и делать сброс:
CODE
cmd.cmdGo(0x08000000)
finally:
cmd.releaseChip()
KSN
Цитата(Danis @ Mar 30 2011, 19:50) *
Выложите свой исходник инициализации порта, гляну.

Решил проблему. После инициализации портов перед операцией чтения вставил небольшую задержку. Спасибо за предложение помощи.
Mos
Интересная проблемка с реализацией USB CDC на STM32F103 и usbser.sys (WinXP).
Был взят пример Usb Virtual Serial Port и переделан по-людски, версия Usb - библиотеки: STM32 USB-FS-Device Driver 3.2.1;
Режим работы таков: после подключения и инициализации, хост передаёт девайсу некоторый объём данных (~1 Кб) для инициализации; в процессе работы хост практически всегда молчит.
Девайс непрерывно передаёт хосту данные (накопленные в FIFO) со скоростью 100 Кб/с. Если на момент опроса у девайса нет данных для передачи, то он отвечает ZLP.

Всё работает просто чудно!

Но почему-то через примерно 300, либо примерно 980, либо примерно 1800 секунд на девайсе перестаёт вызываться Callback на TX sad.gif

Вероятность ошибки в "пользовательском" коде невелика (ибо он очень прост). Подозрение падает на usbser.sys

Вот.
Sergey_vn
А кто-нибудь в курсе, когда STM обещает начать массовое производство и выпуск серии STM32F2xx?
topkin
Цитата(Sergey_vn @ Apr 1 2011, 05:41) *
А кто-нибудь в курсе, когда STM обещает начать массовое производство и выпуск серии STM32F2xx?

По слухам с апреля, до нас с вами докатится не раньше мая...
10199
Всем привет. Планируем использовать CORTEХ-M3 контроллер STM32F103C8 совместно с эмулятором J-Link ARM ( http://jtag.su/index.php?option=com_conten...7&Itemid=1) в IAR. Т.к. опыта работы с такими контроллерами нету, то вопрос таков - будет ли это все работать? :D
Danis
Цитата(10199 @ Apr 4 2011, 15:12) *
Всем привет. Планируем использовать CORTEХ-M3 контроллер STM32F103C8 совместно с эмулятором J-Link ARM ( http://jtag.su/index.php?option=com_conten...7&Itemid=1) в IAR. Т.к. опыта работы с такими контроллерами нету, то вопрос таков - будет ли это все работать? :D


Будет, только ссылка Ваша на китайский клон, стоит он около 600руб.
http://www.aliexpress.com/product-fm/37417...holesalers.html
10199
Начали разбираться с stm32 контроллером, чтобы не создавать новую тему - так как вопросов будет много - буду спрашивать их здесь.
В модуле GPIO есть регистры AFIO, чтобы назначать REMAP и указывать ножку для внешнего прерывания. С этим вроде все ясно. Но еще там есть один магический регистр Event control register (AFIO_EVCR), который назначает ножку и порт для некого "EVENTOUT Cortex output". Поиск в даташите на ядро и в референсе ничего не дали. В гугле толком тоже нету. Что это такое?
demiurg_spb
Тоже есть вопросик про GPIO они что не предусмотрели регистр для атомарного XOR'а порта вывода?
BSSR и BRR - это конечно хорошо но мало...

Как народ делает атомарно инверсию пина?
Неужели через if !!!!
Или через ремап для побитовой адресации?

PS: Я тут макросами имени Аскольда под STM озадачился, всё красиво получилось кроме pin_toggle(PIN)...
AHTOXA
Цитата(demiurg_spb @ Apr 8 2011, 11:54) *
PS: Я тут макросами имени Аскольда под STM озадачился, всё красиво получилось кроме pin_toggle(PIN)...

Посмотрите вот это, может пригодится.
demiurg_spb
Цитата(AHTOXA @ Apr 8 2011, 12:59) *
Посмотрите вот это, может пригодится.

Код
void Cpl()
{
      *(volatile uint32_t *)ODR_BB_ADDR = ~*(volatile uint32_t *)ODR_BB_ADDR;
}
Посмотрел. Выглядит симпатично. А во что это компилиться?
Я всё же больше на Си...
ViKo
Цитата(demiurg_spb @ Apr 8 2011, 12:21) *
Посмотрел. Во что это компилиться?

И компилится, и атомарная операция. Через бит-бэнд регион обращается к отдельному биту регистра ODR.
Т.е. доступ к одному биту в bit-band alias области, как к целому слову в bit-band области.
Только смысла в ней немного.
Проще через BSRR и BRR, и по скорости, и по коду.
Код
void LED_Blink(void) {
  while (1) {
    GPIOB->BSRR = 0x0002;
//    __nop(), __nop(), __nop;
    GPIOB->BRR = 0x0002;
  }
}
demiurg_spb
Цитата(ViKo @ Apr 8 2011, 13:26) *
Проще через BSRR и BRR, и по скорости, и по коду.
И компилится, и атомарная операция. Через бит-бэнд регион обращается к отдельному биту регистра ODR.
Т.е. доступ к одному биту в bit-band alias области, как к целому слову в bit-band области.
Только смысла в ней немного.

Т.е. так вполне сносно будет?
Код
...
#define _PIN_SET(   XPORT, XPIN, XMODE, XSPEED)  do {GPIO##XPORT->BSRR = (1UL << (XPIN)); } while (0)  // Atomic operation
#define _PIN_CLR(   XPORT, XPIN, XMODE, XSPEED)  do {GPIO##XPORT->BRR  = (1UL << (XPIN)); } while (0)  // Atomic operation

#define _PIN_TEST(  XPORT, XPIN, XMODE, XSPEED)   ( (GPIO##XPORT->IDR  & (1UL << (XPIN))) != 0UL )

#define _PIN_TOGGLE(XPORT, XPIN, XMODE, XSPEED)                                        \
do                                                                                     \
{                                                                                      \
    if (_PIN_TEST(XPORT, XPIN, XMODE, XSPEED))  _PIN_CLR(XPORT, XPIN, XMODE, XSPEED);  \
    else                                        _PIN_SET(XPORT, XPIN, XMODE, XSPEED);  \
} while (0)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.