STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Проблема решена! я просто думал что внешнее прерывание это переферия,и настроил вход как переферию,убрал - заработало нормально.
Подскажите как сделать чтобы сразуже небыло прерывание как только запускаех прогу,а только при нажатии кнопки.Вроде даже флаг сбрасывал а прерывание есть.
Подскажите как сделать чтобы сразуже небыло прерывание как только запускаех прогу,а только при нажатии кнопки.Вроде даже флаг сбрасывал а прерывание есть.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Собрал туллчейн, при конфигурировании надо было указать ключ --with-float= я указал тип soft. В arm cm3 ведь нет hw поддержки операций с плавающей точкой ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: STM32 новичку в ARM что к чему
где-то на EE.ru был цикл статей по программированию stm32 на асме и си , без перифрал либрари. не могу найти. мб подскажете ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Re: STM32 новичку в ARM что к чему
Лично я никогда не использую библиотеки периферии от производителя. Считаю, что они представляют собой средней паршивости код, предназначенный для средней паршивости пользователя с задачами средней паршивости. Вроде помигать светодиодом стащив пример из интернета и не вдаваясь в подробности.
Если объективно, то они скрывают особенности железа, которые эмбедщику просто необходимо знать, и к тому же они не дают полностью раскрыть его (железа) потенциал. Но это все лирика. Для того, чтобы научиться программированию без этого мусора не нужны никакие статьи! Берете даташит и читаете назначение регистров и принципы работы интересующей периферии, и пробуете, пробуете, пробуете. Если уж совсем ничего не выходит, можно спросить здесь. Таким образом вы точно будете знать как устроена периферия, на что она способна, на что не способна, сможете использовать ее оптимальным, наиболее подходящим для вас образом.
Если объективно, то они скрывают особенности железа, которые эмбедщику просто необходимо знать, и к тому же они не дают полностью раскрыть его (железа) потенциал. Но это все лирика. Для того, чтобы научиться программированию без этого мусора не нужны никакие статьи! Берете даташит и читаете назначение регистров и принципы работы интересующей периферии, и пробуете, пробуете, пробуете. Если уж совсем ничего не выходит, можно спросить здесь. Таким образом вы точно будете знать как устроена периферия, на что она способна, на что не способна, сможете использовать ее оптимальным, наиболее подходящим для вас образом.
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Я не спорю. Но мне надо человечка обучить.
кстате, киньте пример кода без стм'ных библиотек переферии. хоцца посмотреть
кстате, киньте пример кода без стм'ных библиотек переферии. хоцца посмотреть
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics
Re: STM32 новичку в ARM что к чему
Ну вот некоторые выдержки. По моему намного понятнее, компактнее и красивее, чем с библиотеками.
Базовая системная настройка настройка (PLL, частоты AHB и APB, FLASH).
Настройка ЦАП.
Настройка SPI.
Хотел до кучи пару файликов приложить, но что-то не разберусь как тут это работает.
Базовая системная настройка настройка (PLL, частоты AHB и APB, FLASH).
Код: Выделить всё
RCC->CR |= RCC_CR_HSEON;
while (RCC->CR & RCC_CR_HSERDY == 0);
FLASH->ACR |=
FLASH_ACR_LATENCY_0 |
FLASH_ACR_LATENCY_1 |
FLASH_ACR_PRFTEN |
FLASH_ACR_ICEN |
FLASH_ACR_DCEN;
RCC->CFGR |=
RCC_CFGR_PPRE1_0 |
RCC_CFGR_PPRE1_1 |
RCC_CFGR_PPRE2_2;
RCC->PLLCFGR |=
RCC_PLLCFGR_PLLM_3 |
RCC_PLLCFGR_PLLN_3 |
RCC_PLLCFGR_PLLN_4 |
RCC_PLLCFGR_PLLN_5 |
RCC_PLLCFGR_PLLN_6 |
RCC_PLLCFGR_PLLQ_0 |
RCC_PLLCFGR_PLLQ_2 |
RCC_PLLCFGR_PLLSRC;
RCC->CR |= RCC_CR_PLLON;
while (RCC->CR & RCC_CR_PLLRDY == 0);
RCC->CFGR |= RCC_CFGR_SW_0 | RCC_CFGR_SW_1;
while (RCC->CFGR & RCC_CFGR_SWS != RCC_CFGR_SWS);
Настройка ЦАП.
Код: Выделить всё
RCC->APB1ENR |= RCC_APB1ENR_DACEN;
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODER4_0 | GPIO_MODER_MODER4_1;
DAC->CR |= DAC_CR_EN1;
Настройка SPI.
Код: Выделить всё
RCC->AHB1ENR |=
RCC_AHB1ENR_GPIOCEN;
GPIOC->MODER |=
GPIO_MODER_MODER10_1 |
GPIO_MODER_MODER11_1 |
GPIO_MODER_MODER12_1;
GPIOC->AFRH |=
GPIO_AFRH_AFRH10_1 |
GPIO_AFRH_AFRH10_2 |
GPIO_AFRH_AFRH11_1 |
GPIO_AFRH_AFRH11_2 |
GPIO_AFRH_AFRH12_1 |
GPIO_AFRH_AFRH12_2;
GPIOC->OSPEEDR |=
GPIO_OSPEEDER_OSPEEDR10_0 |
GPIO_OSPEEDER_OSPEEDR11_0 |
GPIO_OSPEEDER_OSPEEDR12_0;
GPIOC->PUPDR |=
GPIO_PUPDR_PUPDR10_1 |
//GPIO_PUPDR_PUPDR11_1 |
GPIO_PUPDR_PUPDR12_0;
GPIOC->OTYPER &=
~GPIO_OTYPER_OT_10 &
~GPIO_OTYPER_OT_12;
RCC->APB1ENR |= RCC_APB1ENR_SPI3EN;
SPI3->CR1 |=
SPI_CR1_MSTR |
SPI_CR1_BR_0 |
SPI_CR1_BR_1 |
SPI_CR1_SSM |
SPI_CR1_SSI |
SPI_CR1_DFF |
SPI_CR1_SPE;
Хотел до кучи пару файликов приложить, но что-то не разберусь как тут это работает.
Re: STM32 новичку в ARM что к чему
Если есть пара лишних лет жизни, и еще лет 5 в перспективе - использования этих МК, то подход правильный. А если нужно быстро решить задачку и переключиться на другую - нет.menzoda писал(а):Лично я никогда не использую библиотеки периферии от производителя. Считаю, что они представляют собой средней паршивости код, предназначенный для средней паршивости пользователя с задачами средней паршивости... Берете даташит и читаете назначение регистров и принципы работы интересующей периферии, и пробуете, пробуете, пробуете. Таким образом вы точно будете знать как устроена периферия, на что она способна, на что не способна, сможете использовать ее оптимальным, наиболее подходящим для вас образом.
И если заказчик/начальник в ухо пыхтит - скорее, скорее, срок сдачи такой-то - тоже не будет времени долго рассиживаться и досконально изучать все регистры и периферию.
Всем нужно нужно быстрее и обязательно с положительным результатом и никого не интересует, что на изучение нового МК и среды программирования нужно время.
"Как, ты не знаком с этим МК? Какое такое время на изучение? Не, значит ты хреновый специалист, надо тебе зарплату понизить или взять другого, который все умеет..."
Примерно так.
И, кстати, menzoda, что дает Ваш "красивый и понятный" код по сравнению со стандартными библиотеками? Более компактный и быстрый код? Насколько (если вообще дает)?
И потом, инициализация железа - это такая мелочь при решении задачи, экономию на которой можно вообще не принимать во внимание: на скорость выполнения собственно задачи она никакого влияния не оказывает, здесь гораздо актуальнее правильный, оптимальный алгоритм.
Последний раз редактировалось bolek Чт янв 03, 2013 15:28:58, всего редактировалось 1 раз.
Re: STM32 новичку в ARM что к чему
Выучив периферию одного МК, можно легко освоить периферию другого, благо они все почти одинаково устроены. Взять тот же UART, SPI, ADC. Хотя нет... Какой к черту освоить? Там только по даташиту глазами пробежаться, и чем больше опыта, тем быстрее можно пробегаться. В противоположность этому, выучив периферийную библиотеку одного МК, на другой МК просто так не перейдешь. Другая библиотека может быть (и скорее всего будет) устроена по-другому. Это раз.
Если человек не дурак, имеет технический склад ума и дружит с логикой, то даже с нуля ему будет несложно разобраться с голой периферией. Ну а дальше, как я уже сказал будет только легче. Так что, про какие 2 года свободного времени идет речь, я не понимаю. Это два.
Ну и напоследок. Библиотеки предназначены для решения типичных задач. Реализовать с помощью них что-нибудь сложнее мигания светодиодом и тупой пересылке по UART, будет ощутимо сложнее и костыльнее. Это три.
ПС. Если человек сам не хочет (или не может - ну не технарь он и все) изучать и познавать что-то новое, прилагать умственных усилий, то конечно все сказанное мной выше отменяется.
ППС. Да, в итоге более быстрый, компактный, легкий в понимании другими код.
Если человек не дурак, имеет технический склад ума и дружит с логикой, то даже с нуля ему будет несложно разобраться с голой периферией. Ну а дальше, как я уже сказал будет только легче. Так что, про какие 2 года свободного времени идет речь, я не понимаю. Это два.
Ну и напоследок. Библиотеки предназначены для решения типичных задач. Реализовать с помощью них что-нибудь сложнее мигания светодиодом и тупой пересылке по UART, будет ощутимо сложнее и костыльнее. Это три.
ПС. Если человек сам не хочет (или не может - ну не технарь он и все) изучать и познавать что-то новое, прилагать умственных усилий, то конечно все сказанное мной выше отменяется.
ППС. Да, в итоге более быстрый, компактный, легкий в понимании другими код.
Re: STM32 новичку в ARM что к чему
Ага-ага: для каждого МК нужно самостоятельно написать с нуля RTOS. А готовые библиотеки используют только ламеры, настоящие программеры все пишут сами, потому что другие программеры все чайники и быдлокодеры поголовно.menzoda писал(а):... Библиотеки предназначены для решения типичных задач. Реализовать с помощью них что-нибудь сложнее мигания светодиодом и тупой пересылке по UART, будет ощутимо сложнее и костыльнее....
Концепция не новая.
Re: STM32 новичку в ARM что к чему
Ну давай, тыкни меня носом в то место где я говорил про RTOS. Речь шла о библиотеке периферии. Работа с периферией настолько простая штука, что использование совершенно ненужной библиотеки оправдывается только тонной старого кода, использующего эту библиотеку, и ленью программиста изучать что-то новое. Заметь, я не говорю про ОС, сетевые стеки, графические библиотеки и т.п., потому что это действительно весьма сложные штуки, которые самому писать довольно долго.
Да и вообще, большинство вопросов на форуме касаются различных электронных поделок "для себя". Люди, которые их делают, не отягощены "старым" кодом и не ограничены во времени. Они могут использовать любые доступные технологии, а не только те, которые одобрил начальник. Так почему же не воспользоваться таким замечательным шансом изучить что-то новое? Да в таком случае и RTOS самому можно написать, ведь это отличный опыт!
Ан нет. Давайте всем советовать готовые библиотеки и давать готовые куски кода. Будем растить ардуинщиков, которые просто печатают и копипастят с пустой головой, а потом выкладывают сюда откровенную хрень и спрашивают, почему же у них лампочка не горит.
Еще раз замечу, что это не касается производства: там свои законы. Есть старый код - изволь поддерживать, начальник разрешил использовать только библиотеки - изволь подчиняться.
Да и вообще, большинство вопросов на форуме касаются различных электронных поделок "для себя". Люди, которые их делают, не отягощены "старым" кодом и не ограничены во времени. Они могут использовать любые доступные технологии, а не только те, которые одобрил начальник. Так почему же не воспользоваться таким замечательным шансом изучить что-то новое? Да в таком случае и RTOS самому можно написать, ведь это отличный опыт!
Ан нет. Давайте всем советовать готовые библиотеки и давать готовые куски кода. Будем растить ардуинщиков, которые просто печатают и копипастят с пустой головой, а потом выкладывают сюда откровенную хрень и спрашивают, почему же у них лампочка не горит.
Еще раз замечу, что это не касается производства: там свои законы. Есть старый код - изволь поддерживать, начальник разрешил использовать только библиотеки - изволь подчиняться.
Re: STM32 новичку в ARM что к чему
Помогите написать код одной строчкой, считать с входа в массив 0 или 1
code[cod_bit]=PINA.2; //запсиь в массив это я писал для АВР
cod_bit++;
GPIOA->IDR & GPIO_IDR_IDR0 надо считать GPIO_IDR_IDR0 в массив
что-то типо:
code[cod_bit]= GPIOA->IDR только состояние этой кнопки(GPIO_IDR_IDR0).
cod_bit++;
code[cod_bit]=PINA.2; //запсиь в массив это я писал для АВР
cod_bit++;
GPIOA->IDR & GPIO_IDR_IDR0 надо считать GPIO_IDR_IDR0 в массив
что-то типо:
code[cod_bit]= GPIOA->IDR только состояние этой кнопки(GPIO_IDR_IDR0).
cod_bit++;
Re: STM32 новичку в ARM что к чему
bolek писал(а):И потом, инициализация железа - это такая мелочь при решении задачи, экономию на которой можно вообще не принимать во внимание: на скорость выполнения собственно задачи она никакого влияния не оказывает, здесь гораздо актуальнее правильный, оптимальный алгоритм.
Зависит от задачи...
А вообще... "правильный, оптимальный алгоритм" без знания железа - фикция, блеф, сказки для непосвящённых...
bolek писал(а): А готовые библиотеки используют только ламеры, настоящие программеры все пишут сами, потому что другие программеры все чайники и быдлокодеры поголовно.
100%... с этим не поспоришь...
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32 новичку в ARM что к чему
спящий писал(а):Помогите написать код одной строчкой, считать с входа в массив 0 или 1
Код: Выделить всё
code[cod_bit++]= GPIOA->IDR >> НОМЕР_БИТА & 1Re: STM32 новичку в ARM что к чему
тоесть вот так?:
code[cod_bit]= GPIOC->IDR&GPIO_OTYPER_IDR_0;
cod_bit++;
code[cod_bit]= GPIOC->IDR&GPIO_OTYPER_IDR_0;
cod_bit++;
Re: STM32 новичку в ARM что к чему
Если бит нулевой, то да, но ведь просили в одну строчку
, поэтому:
code[cod_bit++]= GPIOC->IDR&GPIO_OTYPER_IDR_0;
code[cod_bit++]= GPIOC->IDR&GPIO_OTYPER_IDR_0;
- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Где можно почитать про назначение BOOT0 и BOOT1 ? И если в МК есть аппаратный USB, через него можно прошивать? МК STM32F103VCT6.
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Re: STM32 новичку в ARM что к чему
Товарищи! В 99.99% случаев вся информация по МК, которая вам нужна находится в соответствующем документе от производителя. Этот случай не исключение. Раздел 3.4.
Re: STM32 новичку в ARM что к чему
для этого придуман Bit banding (чтение/запись бита одной командой):Помогите написать код одной строчкой, считать с входа в массив 0 или 1
Код: Выделить всё
//ARM Cortex BitBand access macros
#define BITBAND_PERI_REF 0x40000000
#define BITBAND_PERI_BASE 0x42000000
// Convert PERIPHERAL address
#define BITBAND_PERI(addr, bit) ((volatile U8 *)((BITBAND_PERI_BASE + ((U32)(addr)-BITBAND_PERI_REF)*32 + (bit*4))))
#define BITP( addr, bit ) (BITBAND_PERI(addr,bit))
и использование:
Код: Выделить всё
code[cod_bit] = *BITP(&GPIOA->IDR, 1);- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Спасибо 
Опыт растет прямо пропорционально выведенному из строя оборудованию...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
А для чего такие сложности, если можно сделать проще:
?
Код: Выделить всё
code[cod_bit] = (GPIOA->IDR&(1<<5))!=0; // Укладываем значение 5-ого бита в массив