DeniDoman
Aug 8 2011, 21:53
Только что нашел небольшую подборку простых примеров по STM32W:
http://www.promelec.ru/company/news/667/ . Для профи смотреть нечего, для новичков вроде меня - самое оно

Ну и чтобы окончательно подтвердить свой статус новичка, задам простой вопрос - как мне залить программу в свой STM32W?
То есть, у меня есть (пока еще нет, только в планах) плата, на которой размещен элемент питания, сам ST32W и датчик температуры, подключенный к GPIO-ногам моего МК. Спаял, но теперь внутрь нужно как-то засунуть мой софт. Неужели надо выводить ноги и паять UART (он поддерживается) интерфейс? Это как-то не спортивно, учитывая, что в МК встроен РФ-чип.
Среди документов на сайте ST я нарыл вот такой вот:
AN3262: Using the over-the-air bootloader with STM32W108 devices. В нем рассказывается о способности чипов STM32W получать бутлоадер "по воздуху".
Вот и вопрос - можно ли с помощью этой штуки (которая, по словам ST, заменяет USART) засунуть в чип мою программу, не используя программатор? Кто-нибудь пробовал? Ведь фитча более чем интересная!
А с I2C master кто-то возился? забустить прерывание не идет в моем случаи, нету гарантии, что обработка события пройдет раньше, чем нужно...
DMA тоже не всегда катит, скажем, если надо 1 байт принять..
I2C и I2S самые что ни есть глючные в этих камнях...
http://www.st.com/internet/com/TECHNICAL_R.../CD00238166.pdf
Вообще ерунда какая-то с этим i2c.
Принимаю 1 байт по методу2, как написано в errata - RxNE не появляется и в DR ничего подобного на нужный байт нету.
Когда STOP не далаю, вопреки тому,что написано в errata и rm:
Цитата
EV6_3: ADDR = 1, program ACK = 0, clear ADDR by reading SR1 register followed by reading SR2 register, programSTOP =1 just after ADDR is cleared.Note: The EV6_3 software sequence must complete before the current byte end of transfer.
EV7: RxNE =1, cleared by reading DR register
ES:
a) ADDR=1

Program ACK=0
c) Configure SCL I/O as GPIO open-drain output low
d) Clear ADDR by reading SR1 register followed by reading SR3
e) Program STOP=1
f) Configure SCL I/O as Alternate Function open drain
RxNE устанавливается, делаю STOP, читаю DR - байт приходит нормально...
wedmeed
Aug 16 2011, 11:29
Цитата(akimych @ Apr 18 2011, 16:40)

Сомневаюсюь, что вообще планируют. F217 уже вроде как добавили, а он позже появился. Так же как и F100 уже давно могли бы добавить, там же различий почти нет с F101.
Забавно, что кейл почему-то думает, что у них симулятор поддерживает частично F107. На сайте написано и в настройках симулятора именно F107 выставляется, если его выбрать. С F100 честно пишут, что не поддерживается и в настройках симулятора сразу прописывается симулятор ядра.
Появилась проблема - пишу для STM32F100, так симулятор вообще ни под каким видом работать не хочет, хоть бабой ягой девайс в таргетах обзови. Увижн 4.2. Что делать?
И вообще, я в даташитах описания толкового не нашел - как получается в реальных камнях так, что они на 0х08000000 перепрыгивают? И зачем? Почему не как обычно - с нуля таблица векторов прерываний, а где-нить вдалеке все бутлоадеры и прочее?
И еще, я правильно понимаю - в железяке процу всегда видно два куска одинаковой памяти - с 0х08000000 и ее отображение начиная с 0х00000000
Цитата(wedmeed @ Aug 16 2011, 15:29)

И еще, я правильно понимаю - в железяке процу всегда видно два куска одинаковой памяти - с 0х08000000 и ее отображение начиная с 0х00000000
Правильно. Правда, не всегда: в режиме boot from system memory на адрес 0 отображается код встроенного загрузчика.
С учётом этого знания предыдущие вопросы должны отпасть сами собой.
vlad_new
Aug 16 2011, 20:46
Цитата(wedmeed @ Aug 16 2011, 15:29)

Появилась проблема - пишу для STM32F100, так симулятор вообще ни под каким видом работать не хочет, хоть бабой ягой девайс в таргетах обзови. Увижн 4.2. Что делать?
И вообще, я в даташитах описания толкового не нашел - как получается в реальных камнях так, что они на 0х08000000 перепрыгивают? И зачем? Почему не как обычно - с нуля таблица векторов прерываний, а где-нить вдалеке все бутлоадеры и прочее?
И еще, я правильно понимаю - в железяке процу всегда видно два куска одинаковой памяти - с 0х08000000 и ее отображение начиная с 0х00000000
Тут уже намек был, что надо ставить не 100, а 101 или 103 камень. Сотки KEIL в дебагере не поддерживает.
Хотя STM32F1XXC4T6 любой не поддерживает. Так что всегда ставь STM32F103RET6 - этот точно везде заработает.
Опять же "не поддерживает" - это не совсем верно, поскольку в окне view ( в режиме дебагера ) Sistem viewer появляется вся вся перефирия. Правда родные KEIL-овские гуда приятнее.
Что касаемо запуска, то, таблица векторов устроена так: Первые 4 байта всегда являются адресом стека. Вторые 4 байта адресом запуска.
То что ты видиш в 0 и в 08000000H одно и то же - так и должно быть. Область Flash "подставляется" в 0 адрес или подставляется загрузчик по COM1 (BOOT Loader). Собственно ты и сам уже догадался.
wedmeed
Aug 16 2011, 20:54
scifi и vlad_new огромное спасибо!
STM32F103RET6 - с этим работает)
vlad_new
Aug 16 2011, 20:55
Цитата(wedmeed @ Aug 17 2011, 00:54)

scifi и vlad_new огромное спасибо!
STM32F103RET6 - с этим работает)
wedmeed
Aug 26 2011, 07:41
Форумчане, еще вопрос.
Во-первых, правильно ли я понимаю - Open-drain режим - это режим подтягивания. То есть к ноге через резистор подтягиваю какое-то напряжение, и при подаче значения 0 эта нога со стороны контроллера висит в воздухе, т.е. выход ноги - это то самое подвешенное напряжение через резистор. При подаче значения 1 на ногу, она коммутируется на землю, и выход ноги - земля. Так ли это?
Во-вторых, никак не могу найти ограничений на подвешиваемое питание. Ноги 5в-совместимые, т.е. до пяти вольт можно вешать спокойно. Но на рисунке в даташите этот режим показан полевыми транзисторами. Т.е. по идее можно повесить и 12в и 24в. Какие на самом деле ограничения?
Ну и к тому же вообще ничего не сказано о максимальном входном токе в этом режиме (в обычных режимах вроде 25мА терпит). Какой брать резистор?
Цитата(wedmeed @ Aug 26 2011, 11:41)

Во-первых, правильно ли я понимаю - Open-drain режим - это режим подтягивания.
"Режим подтягивания"? Зачем выдумывать свои термины, когда есть общепринятые? Это называется "открытый сток". Это практически то же самое, что и "открытый коллектор" (
Open collector).
Цитата(wedmeed @ Aug 26 2011, 11:41)

и при подаче значения 0 эта нога со стороны контроллера висит в воздухе, т.е. выход ноги - это то самое подвешенное напряжение через резистор. При подаче значения 1 на ногу, она коммутируется на землю, и выход ноги - земля. Так ли это?
Наоборот. "0" коммутирует на землю, "1" - отпускает.
Цитата(wedmeed @ Aug 26 2011, 11:41)

Т.е. по идее можно повесить и 12в и 24в. Какие на самом деле ограничения?
Ограничения - в даташите. Превышать 5В не положено. На входах стоят стабилитроны для защиты от статики.
Цитата(wedmeed @ Aug 26 2011, 11:41)

Ну и к тому же вообще ничего не сказано о максимальном входном токе в этом режиме (в обычных режимах вроде 25мА терпит). Какой брать резистор?
Здрассте. Всё сказано. 25 мА на ножку. Внимательнее читайте даташит.
wedmeed
Aug 26 2011, 09:22
Цитата(scifi @ Aug 26 2011, 12:29)

Превышать 5В не положено.
25 мА на ножку.
Спасибо. Просто надеялся что есть еще на свете халява...
Играюсь с ADC и DMA на STM32f103RBT6
Возникла неприятность!
Под отладчиком все работает на ура! Но когда устройство запускается без житага, ни АЦП ни ДМА не желают работать(((
По адресам нули и все...
В чем косяк? Может кто сталкивался! Уже и в дебаге и в релизе компилил, с оптимизацией и без... ничего не помогает(
Вот код инициализации:
CODE
#define ADC1_DR_Address ((uint32_t)0x4001244C)
RCC_ADCCLKConfig(RCC_PCLK2_Div8); // Enable DMA1 clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// Enable ADC1 and TIM1 Periph clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// Configure ADC Channel14 as analog input
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// DMA1 Channel configuration
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
// ADC1 configuration
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC1->CR2 |=((uint32_t)0x00800000);
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_71Cycles5);
ADC_InjectedSequencerLengthConfig(ADC1, 1); // Set injected sequencer length
ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5); // ADC1 injected channel Configuration
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None); // ADC1 injected external trigger configuration
ADC_AutoInjectedConvCmd(ADC1, ENABLE); // Enable automatic injected conversion start after regular one
ADC_DMACmd(ADC1, ENABLE); // Enable ADC1 DMA
ADC_ExternalTrigConvCmd(ADC1, ENABLE); // Enable ADC1 external trigger
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE); // Enable JEOC interupt
ADC_Cmd(ADC1, ENABLE); // Enable ADC1
ADC_ResetCalibration(ADC1); // Enable ADC1 reset calibaration register
while(ADC_GetResetCalibrationStatus(ADC1)); // Check the end of ADC1 reset calibration register
ADC_StartCalibration(ADC1); // Start ADC1 calibaration
while(ADC_GetCalibrationStatus(ADC1)); // Check the end of ADC1 calibration
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // Start ADC1 conversion
Всем спасибо. Нашел косяк)
Цитата(Gambit @ Sep 5 2011, 16:35)

Всем спасибо. Нашел косяк)
Как вы считаете, а сам "косяк" озвучить в данной теме не будет ли соответствовать хорошим манерам?
Кто-то же вчитывался в ваш код, искал "косяк". Оказывается, всё зря?
Будет.
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
+ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
- ADC_ExternalTrigConvCmd(ADC1, ENABLE);
Столкнулся с траблом, Eclipse выдаёт :
Warn : Error: start and end sectors must be on a 2 sector boundary
Error: failed setting protection for areas 0 to 4 (-901)
и далее не прошивается STM32F107 через JTAG. Помогите решить проблемку.
StAlexy
Oct 21 2011, 13:10
Здравствуйте, коллеги!
Столкнулся со следующей проблемой:
STM32F107 стоит на плате преобразователя (мостовой инвертор). Через оптроны отвязан от силовой земли. На Viper формирую кучу питаний, в том числе и отдельное-изолированное для микроконтроллера. Для контроллера стабилизатор, куча емкостей (в том числе и около самого процессора - все как надо по даташиту и феншую!!).
Хаотично, фиг знает в зависимости от каких параметров, но он периодически сгорает - коза питание-земля внутри процессора. Питание модуля АЦП остается целым.
Раза четыре сгорал во время работы, один раз сгорел при включении!
Разводка впринципе правильная - старшие товарищи посмотрели.
Может кто сталкивался с таким... Или ваши соображения по данному поводу - в студию!!
StAlexy Схемку бы глянуть.
Цитата(StAlexy @ Oct 21 2011, 16:10)

Здравствуйте, коллеги!
Столкнулся со следующей проблемой:
STM32F107 стоит на плате преобразователя (мостовой инвертор). Через оптроны отвязан от силовой земли. На Viper формирую кучу питаний, в том числе и отдельное-изолированное для микроконтроллера. Для контроллера стабилизатор, куча емкостей (в том числе и около самого процессора - все как надо по даташиту и феншую!!).
Хаотично, фиг знает в зависимости от каких параметров, но он периодически сгорает - коза питание-земля внутри процессора. Питание модуля АЦП остается целым.
Раза четыре сгорал во время работы, один раз сгорел при включении!
Разводка впринципе правильная - старшие товарищи посмотрели.
Может кто сталкивался с таким... Или ваши соображения по данному поводу - в студию!!
Флайбэк, очевидно, если куча питаний?
А стабилизация по какому питанию?
Если не по контроллерному, то можно предположить, что проблема в этом. При изменении нагрузки на стабилизированом питании на остальных начинаются переходные процессы и если там потребление в данный момент небольшое, то вполне может быть превышение в несколько раз от номинала. Однонаправленный сапрессор не помешал бы для ограничения максимального уровня.
Ну и, если плата силовая, не нужно забывать о емкостной связи между обмотками . ХЗ как там у вас трансформатор намотан и есть ли экранирующие обмотки. Т.е. через емкостную связь обмоток транса мощные микросекундные импульсы могут пролезть на контроллерную обмотку и далее через стабилизатор и кучу емкостей на МК. Опять таки не помешал бы TVS на выходе контроллерной обмотки (после диода параллельно кондерам) и LC-фильтр после него. Последовательно с L неплохо бы поставить силовой SMD-феррит. Что-то типа BLM18PG471SN1.
KnightIgor
Oct 23 2011, 12:04
Цитата(StAlexy @ Oct 21 2011, 15:10)

Здравствуйте, коллеги!
...
Столкнулся со следующей проблемой:
...
Может кто сталкивался с таким... Или ваши соображения по данному поводу - в студию!!
Как Dir и предложил, на питание процессора - TVS. Если нет под рукой "правильного" TVS для 3.3V питания, отлично поработает Z-диод помощнее (1,3W и выше) где-нибудь на 3,9V, еще лучше (но реже имеются) на 3,6V. Проверено, отлично спасает: иногда сам умирает, но делает КЗ по питанию и глушит на себя регуляторы напряжения, а проц остается целехонек.
StAlexy
Oct 24 2011, 02:47
Цитата
Флайбэк, очевидно, если куча питаний?
Да, верно - обратноходовик на Viper12.
Цитата
А стабилизация по какому питанию?
Если не по контроллерному, то можно предположить, что проблема в этом. При изменении нагрузки на стабилизированом питании на остальных начинаются переходные процессы и если там потребление в данный момент небольшое, то вполне может быть превышение в несколько раз от номинала. Однонаправленный сапрессор не помешал бы для ограничения максимального уровня.
Стабилизация не по питанию процессора, по другому. У меня на обмотка процессора на 12В намотана. Стабилизатор DC-DC работает от 4 до 24В. Випер на 100% выброс не даст... К тому же у меня всегда почти ХХ - 2-2,5Вт потребление.
А вот стабилитрон по питанию (до стабилизатора) - это идея!! Стабилитрон сгорит - а процессор целый!!
Спасибо за ответы, коллеги! Буду в новом направлении копать))
StAlexy
Oct 27 2011, 06:08
Ну вот, прошло 3 дня, теперь можно сказать о результатах.
Обнаружилась точная проблема в разводке - после випера идет диод, потом стабилизатор, и только потом конденсатор!
т.е. стабилизатор сидел на ВЧ переменке (50-60кГц) с хорошей амплитудой - вольт до 30. Как следствие на выходе стабилизатора могло проскакивать все что угодно, что и сжигало процессор. Конечно все это как-то сглаживалось, поэтому процессор горел не сразу, а при каких-то там условиях.
Очевидное решение - кондер сразу после диода и, обязательно, до стабилизатора.
Плата большая, не заметил вот и развел, как "красивше"))
Не повторяйте моих ошибок!
Всем спасибо за ответы!
Здравствуйте.
Следующая проблема -
1. Проц stm32L151CB
2. Плата доморощенная.
3. у меня кварц 14745600. От него работает проц. И мне надо, чтобы работало от него.
4. Я хочу прикрутить USB-Serial. Для этого, наверное, можно использовать внутренний генератор и внутреннюю ФАПЧ.
Я пытался прикрутить USB из примера от ST (конфигурил HSE - он работает), но там что-то не так - при старте проца на некотором этапе все виснет - проц начинает что-то читать/писать и выполнять команды по несуществующим адресам (смотрю в отладчике Keil'a).
Вопрос - возможно ли это?
Нет ли у кого простого примера USB для означенного проца, который бы точно работал?
banton
Oct 31 2011, 06:58
diwil
В datasheet (см. стр. 23, п. 3.15.4) написано, что для USB необходима частота 48МГц которую можно получить на PPL только используя HSE, т.е. только внешний кварц.
ELEKTROS
Oct 31 2011, 07:06
скажите а stm32L серия это вообще кортекс ядро или хотябы ARM?
banton
Oct 31 2011, 07:28
Цитата(ELEKTROS @ Oct 31 2011, 14:06)

скажите а stm32L серия это вообще кортекс ядро или хотябы ARM?
ARM 32-bit Cortex™-M3 CPU
ELEKTROS
Oct 31 2011, 07:36
а в чём отличие от серии stm32f? энергопотребление меньше основное отличие ?
Цитата(banton @ Oct 31 2011, 09:58)

В datasheet (см. стр. 23, п. 3.15.4) написано, что для USB необходима частота 48МГц которую можно получить на PPL только используя HSE, т.е. только внешний кварц.
да. пасиб. пропустил.
Warlockwolf
Oct 31 2011, 16:01
подскажите где почитать про - CCM (core coupled memory). эта штука стоит в F4, написано что 64 килобайта с доступом через ядро. гугл не помогает. Или не там искал.
edit/
в одной их пдф присутствует TCM Data sram 64k. вобщем как я понял это оно и есть.
тогда здорово. можно запустить 3 независимые задачи. одновременно - чтото считать процессором, одним дма из какого нить порта набивать 1 область памяти, вторым дма выдавать из другой области в какой нибудь порт. без дележа шин.
Ok,
перепаял кварц (теперь 16MHz) и попробовал запустить пример от ST STM32_USB-FS-Device_Lib_V3.3.0.
Поставил драйверы от ST (Win 7, x64).
Проект компиляется. В отладчике вижу, что USB включается.
Однако винда не находит девайса.
Я "записал" момент втыкания USB кабеля в комп (log2). Может кто сможет подсказать в чем дело?
Цитата(diwil @ Oct 31 2011, 20:21)

Однако винда не находит девайса.
фантастика - перепаял кондеры на кварце. заработало.
Вопрос - насколько сложно сделать так, чтобы драйвер виртуального ком порта был не от ST Micro, а типа custom? И еще хорошо бы чтобы его было видно и под линуксом.
KnightIgor
Nov 2 2011, 08:32
Цитата(diwil @ Nov 1 2011, 18:33)

фантастика - перепаял кондеры на кварце. заработало.
Вопрос - насколько сложно сделать так, чтобы драйвер виртуального ком порта был не от ST Micro, а типа custom? И еще хорошо бы чтобы его было видно и под линуксом.
Гляньте прикрепленный файл.
Замените в нем:
1. <yourname> на краткое название вашей конторы, типа ROGA_KOPYTA
2. <USB_DISPLAY_NAME> на типа R_AND_K
3. <your_enterprise> на полное название драйвера и конторы
4. согласуйте VID_xxxx&PID_yyyy с таковыми в проекте (xxxx и yyyy - это unsigned short idVendor и idProduct в дескрипторе устройства CDC).
Цитата(KnightIgor @ Nov 2 2011, 12:32)

Гляньте прикрепленный файл.
Замените в нем:
1. <yourname> на краткое название вашей конторы, типа ROGA_KOPYTA
2. <USB_DISPLAY_NAME> на типа R_AND_K
3. <your_enterprise> на полное название драйвера и конторы
4. согласуйте VID_xxxx&PID_yyyy с таковыми в проекте (xxxx и yyyy - это unsigned short idVendor и idProduct в дескрипторе устройства CDC).
спасиб большое.
попробовал - не работает.
При установке говорит, что инф файл не поддерживает выбранного метода установки
(вин 7, х64)
чо делать?
или так - где прочитать про драйверы эти?
KnightIgor
Nov 2 2011, 22:02
Цитата(diwil @ Nov 2 2011, 18:18)

спасиб большое.
попробовал - не работает.
При установке говорит, что инф файл не поддерживает выбранного метода установки
(вин 7, х64)
чо делать?
или так - где прочитать про драйверы эти?
Вы "правой мышкой" на нем щелкали, а затем "Установить"? Попробуйте, подключив USB устройство, выбрать диалог ручной установки драйвера, которому и "скормить" указаный файл. Этот inf файл написан моим коллегой, который разбирался с проблемами и, найдя путь, успешно протестировал результат на нескольких компах с разными Win-осями, в том числе Win 7 x64.
Еще раз: в строках
[<yourname>.ntx86]
%<USB_DISPLAY_NAME>% = <USB_DISPLAY_NAME>, USB\VID_b0c0&PID_0020&MI_00
[<yourname>.ntamd64]
%<USB_DISPLAY_NAME>% = <USB_DISPLAY_NAME>, USB\VID_b0c0&PID_0020&MI_00
надо заменить <b0c0> для VID_ и <0020> для PID на ваши значения из дескриптора, например VID_a55a и PID_0033
Специального драйвера для CDC устройства не нужно: за него работает системный usbser.sys. Надо только, по словам коллеги, сделать вид, что этот файл надо переустановить.
Цитата(KnightIgor @ Nov 3 2011, 02:02)

Вы "правой мышкой" на нем щелкали, а затем "Установить"? Попробуйте, подключив USB устройство, выбрать диалог ручной установки драйвера, которому и "скормить" указаный файл. Этот inf файл написан моим коллегой, который разбирался с проблемами и, найдя путь, успешно протестировал результат на нескольких компах с разными Win-осями, в том числе Win 7 x64.
Еще раз: в строках
[<yourname>.ntx86]
%<USB_DISPLAY_NAME>% = <USB_DISPLAY_NAME>, USB\VID_b0c0&PID_0020&MI_00
[<yourname>.ntamd64]
%<USB_DISPLAY_NAME>% = <USB_DISPLAY_NAME>, USB\VID_b0c0&PID_0020&MI_00
надо заменить <b0c0> для VID_ и <0020> для PID на ваши значения из дескриптора, например VID_a55a и PID_0033
Специального драйвера для CDC устройства не нужно: за него работает системный usbser.sys. Надо только, по словам коллеги, сделать вид, что этот файл надо переустановить.
Правой мышкой тоже не получалось.
оказалось нужно было поменять:
USB\VID_b0c0&PID_0020&MI_00
- на -
USB\VID_b0c0&PID_0020&REV_0200
и все встало (ну проблемы у меня с виндой

...). правда винда ругалась на производителя, но это уже ее проблемы...
спасибо еще раз большое.
KnightIgor
Nov 3 2011, 08:42
Цитата(diwil @ Nov 3 2011, 09:29)

Правой мышкой тоже не получалось.
оказалось нужно было поменять:
USB\VID_b0c0&PID_0020&MI_00
- на -
USB\VID_b0c0&PID_0020&REV_0200
и все встало (ну проблемы у меня с виндой

...). правда винда ругалась на производителя, но это уже ее проблемы...
спасибо еще раз большое.
Был рад помочь!
Да, Вы правы: я спросил коллегу, оказалось, что &MI_00 - это наше композитное устройство, Вы верно замену сделали.
Вот тут
ссылка на информацию по теме от гуру в области USB - господина Тсунео (Tsuneo).
KnightIgor
Nov 5 2011, 12:18
Для информации.
Вожусь с I2C (STM32F103).
Что этот интерфейс в камне есть совершенно непролазные дебри, уже всем известно. Я в свое время вроде хорошо разобрался с ним, даже с DMA он у меня качает туда-сюда. И тут вдруг при запуске чтения или записи натыкаюсь на занятость шины (в моих функциях-обертках доступа в начале идет проверка на занятость шины на случай многомастерной коммуникации).
Обнаружилось: уже после выдачи STOP в конце предыдущей операции по I2C бит BUSY еще стоит какое-то время, а процессор такой шустрый, что если вскорости вызвать очередную операцию по I2C, можно на этот бит и нарваться! Решение - типа недолгое ожидание (по эксперименту в районе времени передачи двух байт, на всякий случай с таймаутом на основе DWT), пока BUSY не уйдет.
Вторая заморочка: пока тестировал на 400kHz, не встречался, а опустил до 100kHz, наткнулся на прерывание по состоянию I2C_EVENT_MASTER_BYTE_TRANSMITTING. Я работал по I2C_EVENT_MASTER_BYTE_TRANSMITTED, т.к. это более удобно для особых случаев приема 1-го или 2-х байтов, а тут проскакивает _TRANSMITTING. Решение: приходится еще дожидаться в прерывании бита BTF, т.к. если просто вывалиться из прерывания, то I2C_EVENT_MASTER_BYTE_TRANSMITTED (то есть, установка бита BTF) его больше не вызывает, и машина приема виснет.
Может кому будет полезно.
rockmp4
Nov 10 2011, 07:57
.
rockmp4
Nov 10 2011, 07:57
Подскажите пожалуйста где взять все ПДФки с описанием всех настроек stm32f1xx (описание регистров, битов для настройки). А то на сайте ST нифига найти не могу, тока app notes, user manuals, а кокретно по настройке ничего.
Пытаюсь на них перелезть с tms320f28335, где все для людей: по АЦП, таймерам и т.д. отдельные даташиты с полным описанием и всеми регистрами.
Цитата(rockmp4 @ Nov 10 2011, 09:57)

А то на сайте ST нифига найти не могу, тока app notes, user manuals, а кокретно по настройке ничего.
Reference Manual, там же, на сайте ST.
rockmp4
Nov 10 2011, 08:22
Цитата(ViKo @ Nov 10 2011, 15:12)

Reference Manual, там же, на сайте ST.
Спасибо, попробую поковырять.
Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то! И в основной цикл не возвращается. Может кто знает в чем дело?
CODE
#include "stm32f10x.h"
int main()
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
GPIOC->CRH |= GPIO_CRH_MODE9;
GPIOC->CRH &=~ GPIO_CRH_CNF9;
GPIOA->CRL |= GPIO_CRL_MODE0;
GPIOA->CRL &=~ GPIO_CRL_CNF0_0;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
EXTI->IMR |= EXTI_IMR_MR0;
EXTI->EMR |= EXTI_EMR_MR0;
EXTI->RTSR |= EXTI_RTSR_TR0;
NVIC_SetPriority(EXTI0_IRQn, 7);
NVIC_EnableIRQ(EXTI0_IRQn);
__enable_irq ();
while (1)
{
GPIOC->BSRR |= GPIO_BSRR_BS8;
for (volatile int x=0; x<100000; x++){}
GPIOC->BRR |= GPIO_BRR_BR8;
for (volatile int x=0; x<100000; x++){}
}
}
//Сам обработчик прерывания
void EXTI0_IRQHandler(void)
{
if ((EXTI->PR & EXTI_PR_PR0)==0)
{
GPIOC->BSRR |= GPIO_BSRR_BS9;
EXTI->PR |= EXTI_PR_PR0;
}
}
Цитата(IDL @ Dec 8 2011, 15:51)

Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то! И в основной цикл не возвращается. Может кто знает в чем дело?
Не оно?
Цитата(=F8= @ Dec 8 2011, 18:10)

Спасибо, но не помогло
Aleksandr Baranov
Dec 8 2011, 16:00
А где размещен переход на EXTI0_IRQHandler?
Цитата(Aleksandr Baranov @ Dec 8 2011, 19:00)

А где размещен переход на EXTI0_IRQHandler?
В startup_stm32f10x_md_vl.s
Цитата(IDL @ Dec 8 2011, 18:51)

Помогите пожалуйста с внешним прерыванием! Проблема в том, что при возникновении внешнего прерывания процессор на него реагирует, но не переходит в обработчик прерываний, а зависает где то!
Если у вас обработчик расположен в *.cpp файле, то его надо объявить как extern "C":
Код
extern "C" void EXTI0_IRQHandler(void)
{
...
Цитата(AHTOXA @ Dec 8 2011, 19:56)

Если у вас обработчик расположен в *.cpp файле, то его надо объявить как extern "C":
Код
extern "C" void EXTI0_IRQHandler(void)
{
...
Спасибо большое, но все равно не помогло

Наверное дело в чем то другом! Будем думать!
ELEKTROS
Dec 8 2011, 19:04
Как правильно запустить ШИМ на базе TIM1 в STM32f, а то перепробывал кучу разных вариантов даже готовые какието кем то деланные, но всёравно не работает.
Цитата(ELEKTROS @ Dec 9 2011, 01:04)

Как правильно запустить ШИМ на базе TIM1 в STM32f, а то перепробывал кучу разных вариантов даже готовые какието кем то деланные, но всёравно не работает.
Вот ШИМ на TIM1_CH2:
CODE
void pwm_init()
{
// Включаем тактирование порта A и альтернативных функций:
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;
// Тактирование таймера:
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
// Настраиваем ногу TIM1_CH2 как альтернативный выход:
Pin<'A', 9>::Direct(ALT_OUTPUT);
// Настраиваем таймер:
TIM1->CR1 = TIM_CR1_ARPE; // Счёт вверх, без делителя
TIM1->CR2 = 0;
TIM1->ARR = timer_period; // Период
TIM1->PSC = timer_prescaler; // Прескалер
TIM1->RCR = 0;
TIM1->EGR = TIM_EGR_UG; // Генерим событие для немедленного обновления прескалера
// Настраиваем канал OC2 (output compare 2)
TIM1->CCER &= ~(TIM_CCER_CC2E | TIM_CCER_CC2P | TIM_CCER_CC2NE); // Отключаем выход
TIM1->CCR2 = 0; // Период
TIM1->CCMR1 =
(TIM1->CCMR1 & ~(TIM_CCMR1_OC2M | TIM_CCMR1_CC2S | TIM_CCMR1_OC2M)) |
TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | // PWM 1 (0x6000),
TIM_CCMR1_OC2PE; //;
TIM1->CCER |= TIM_CCER_CC2E; // Включаем выход
TIM1->CR1 |= TIM_CR1_CEN; // Запускаем таймер
TIM1->BDTR |= TIM_BDTR_MOE; // Специальная фишка у T1 и T8 - Main Output Enable
}
void pwm_set(uint16_t value)
{
TIM1->CCR2 = value;
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.