Форум РадиоКот https://radiokot.ru/forum/ |
|
STM32 новичку в ARM что к чему https://radiokot.ru/forum/viewtopic.php?f=59&t=67578 |
Страница 274 из 423 |
Автор: | afz [ Пт апр 26, 2019 06:52:14 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
isx писал(а): Использую в STM32 часовой кварц. Тут не так давно обсуждалось. Генератор LSE у STM32 рассчитан на кварцы с load capacitance (CL) <=7 пФ. Подробности в даташите на конкретный камень, в разделе External clock source characteristics, во второй половине раздела (в первой идут материалы по HSE). Практически, в продаже встречаются кварцы с CL = 6 пФ, но не так часто, как хотелось бы. Гораздо чаще продаются кварцы с CL = 12 пФ. По внешнему виду их не отличишь - спичка и спичка. Только вот с кварцами, у которых CL > 7 пФ, генератор LSE чипов STM32 работает крайне неустойчиво . Может не запускаться, может врать по частоте... И взятый наугад кварц 32768, скорее всего, не будет 6-пикушечным. Да и китайцы на свои пробные платы тоже, бывает, лепят что попало, особенно на дешевые. На Али 6-пФ кварцы ищутся по <32768 6pF>. Добавлено after 20 minutes 36 seconds: Да, разбираться с периферией STM32 надо не по даташиту, а по Reference manual'у на соответствующую серию камней. |
Автор: | Oxford [ Пт апр 26, 2019 12:47:59 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Где-то видел картинку, на ней была обозначена область ОЗУ, в конце самом стек, а куча лишь часть памяти, которая располагалось перед стеком. Так же тоже стеку некуда расти... Куча не является обязательным для реализации приложения. Она в основном нужна для стандартной библиотеки Си для работы с динамическим распределением памяти типо malloc это обеспечивает переносимость кода. Вы можете убрать ее и сохранить ОЗУ. По стеку тут чтиво: Overview of stack size requirement estimations in Cortex-M based applications https://community.arm.com/developer/ip- ... plications |
Автор: | isx [ Пт апр 26, 2019 15:50:19 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Да, разбираться с периферией STM32 надо не по даташиту, а по Reference manual'у на соответствующую серию камней. Я его и имел ввиду, просто по привычке RM даташитом обозвал За информацию спасибо, проверю обязательно. Добавлено after 1 minute 49 seconds: Тут что-то по этому поводу было Видел, но тут нет описания работы с регистрами (формулы вычисления и т.п). |
Автор: | a5021 [ Вт апр 30, 2019 19:46:28 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Сам конфиг выглядит так на CMSIS, это то что вы напридумывали: Код: GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1; GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1; Крайне дерьмово он у вас выглядит. Нечитабельно. И после компиляции тоже хрень полная: Код: ;GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1; 4B06 ldr r3, =0x40010800 F64A028D movw r2, #0xA88D 601A str r2, [r3] ;GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1; 4B04 ldr r3, =0x40010800 4A04 ldr r2, =0x08800002 605A str r2, [r3, #4] Цитата: Через некоторое время забудете свой код и будете вспоминать как же вы там придумали конфигурировать, Протрите глаза и сравните оба варианта: Код: /* 1. ================ */ GPIOA->CRL = GPIO_CRL_MODE0_0 | GPIO_CRL_CNF0 | GPIO_CRL_CNF1_1 | GPIO_CRL_CNF2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_CNF3_1; GPIOA->CRH = GPIO_CRH_MODE8_1 | GPIO_CRH_CNF13_1 | GPIO_CRH_CNF14_1; /* 2. ================ */ *(uint64_t *) GPIOA = ( PIN_CFG(0, O_AF + O_OD + O_10MHZ) | PIN_CFG(1, I_PULL) | PIN_CFG(2, I_PULL) | PIN_CFG(3, O_AF + O_PP + O_2MHZ) | PIN_CFG(8, O_2MHZ) | PIN_CFG(13, I_PULL) | PIN_CFG(14, I_PULL) ); Если и теперь не понимаете, что нагляднее и понятнее, то я не знаю, чем вам помочь. Цитата: и в сети вас не поймут. Постарайтесь за себя говорить, а то выглядит, будто вы сами сомневаетесь в убедительности своих доводов. Цитата: Вы лучше аппаратуру, OS, драйверы изучайте и пишите хорошо. Книжки почитайте. Не припоминаю, чтобы спрашивал у вас, чего мне лучше поучить и почитать. Держите ваши сверхценные советы при себе. Вам нужнее. |
Автор: | VladislavS [ Ср май 01, 2019 08:05:52 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Желаю слышать критику, чем вышеозначенный подход плох, если он действительно плох. Не буду касаться формы записи. Во-первых, это вкусовщина. Во-вторых, можно и лучше написать. Но я не об этом. Давай по технике.Вот смотри. Твой код даёт. Код: 4A0A ldr r2, =0x40010800 Казалось бы, всё круто. Но давай его сделаем "по классике". На форму записи закрываем глаза пока.F64A038D movw r3, #0xA88D 4C09 ldr r4, =0x08800002 E9C23400 strd r3, r4, [r2, #0] Код: GPIOA->CRL = Получаем PIN_CFG(0, O_AF + O_OD + O_10MHZ) | /* TIM2_CH1 PWM (OUTPUT, OPEN DRAIN, MEDIUM SPEEED) */ PIN_CFG(1, I_PULL) | /* EXTI1 (INPUT, PULL-DOWN) */ PIN_CFG(2, I_PULL) | /* USART2 RX (INPUT, PULL-UP) */ PIN_CFG(3, O_AF + O_2MHZ) | /* USART2 TX (OUTPUT, PUSH-PULL, LOW SPEED) */ PIN_CFG(4, I_ANALOG) | /* - unused - */ PIN_CFG(5, I_ANALOG) | /* - unused - */ PIN_CFG(6, I_ANALOG) | /* - unused - */ PIN_CFG(7, I_ANALOG) ; /* - unused - */ GPIOA->CRH = PIN_CFG(0, O_2MHZ) | /* GPIO (OUTPUT, PUSH-PULL, LOW SPEEED) */ PIN_CFG(1, I_ANALOG) | /* - unused - */ PIN_CFG(2, I_ANALOG) | /* - unused - */ PIN_CFG(3, I_ANALOG) | /* - unused - */ PIN_CFG(4, I_ANALOG) | /* - unused - */ PIN_CFG(5, I_PULL) | /* SWDIO (INPUT, PULL-UP) */ PIN_CFG(6, I_PULL) | /* SWCLK (INPUT, PULL-DOWN) */ PIN_CFG(7, I_ANALOG) ; /* - unused - */ Код: LDR.N R0,??PinCfg1_0 ;; 0x40010800 Размер кода такой же (команда STR 16-битная, а STRD 32-битная). Скорость исполнения по тактам посчитать (с учётом работы конвейера и разных шин) не берусь, но что-то мне подсказывает...LDR.N R2,??PinCfg1_0+0x4 ;; 0x8800002 MOVW R1,#+43149 STR R1,[R0, #+0] STR R2,[R0, #+4] Так что, остаётся только удобство записи. Оно, конечно же, на порядок лучше чем предлагает Oxford, но работать ещё есть над чем |
Автор: | pokk [ Ср май 01, 2019 08:45:41 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Подключаю Wiznet5300 по параллельной шине 16 бит Код: /*-- FSMC Configuration ----------*/ p.FSMC_AddressSetupTime = 3; p.FSMC_AddressHoldTime = 2; p.FSMC_DataSetupTime = 3; p.FSMC_BusTurnAroundDuration = 1; p.FSMC_CLKDivision = 1; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_A; FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //8-bit Wiznet DATA line FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /*!< Enable FSMC Bank1_SRAM Bank */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE); RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE); Чтение заработало (первого регистра с адресом 0) теперь делаю запись Код: #define SHAR_M (0x60000008) *(uint16_t *)SHAR_M = 0xFFFF; Осциллографом смотрю а на линиях данных нули прут , причем одна линия в 1 даже если пишешь туда 0 Адрес выставляется правильно проверил. Что не так делаю ? PS: Железо рабочее, сначала подрыгал пинами отдельно и инициализировал w5300. |
Автор: | VladislavS [ Ср май 01, 2019 08:57:49 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Клоки включать надо раньше чем начинаешь инициализировать периферию. И пины все в альтернативную функцию перевёл? |
Автор: | pokk [ Ср май 01, 2019 10:04:08 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Точно благодарю, так и знал что где-то в элементарном косячу. |
Автор: | a5021 [ Ср май 01, 2019 13:22:52 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Не буду касаться формы записи. Во-первых, это вкусовщина. Во-вторых, можно и лучше написать. Можно подробнее с этого места? Цитата: Код: LDR.N R0,??PinCfg1_0 ;; 0x40010800 Размер кода такой же (команда STR 16-битная, а STRD 32-битная). Скорость исполнения по тактам посчитать (с учётом работы конвейера и разных шин) не берусь, но что-то мне подсказывает...LDR.N R2,??PinCfg1_0+0x4 ;; 0x8800002 MOVW R1,#+43149 STR R1,[R0, #+0] STR R2,[R0, #+4] Я бы на вашем месте не слишком доверял подобным нелокализуемым "подсказкам". У кортекса-м3 обе названных команды 32-битные, где первая выполняется 2 цикла, а вторая 3. |
Автор: | Reflector [ Ср май 01, 2019 13:37:45 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
У кортекса-м3 обе названных команды 32-битные, где первая выполняется 2 цикла, а вторая 3. STR пайплайнятся, STRD - нет, так что скорее всего пара STR тоже выполнится за 3 такта. И, кстати, STRD не атомарна. |
Автор: | a5021 [ Ср май 01, 2019 13:53:43 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Две STR атомарны? К чему это уточнение? |
Автор: | Reflector [ Ср май 01, 2019 14:13:52 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Две STR атомарны? К чему это уточнение? К тому что на прошлой странице ты сам в этой атомарности сомневался. |
Автор: | VladislavS [ Ср май 01, 2019 18:24:07 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Можно подробнее с этого места? Нельзя. Не хочу в очередной раз ссориться на ровном месте. Я бы на вашем месте не слишком доверял подобным нелокализуемым "подсказкам". У кортекса-м3 обе названных команды 32-битные, где первая выполняется 2 цикла, а вторая 3. Нет оснований не доверять компилятору.Вложение: А если учесть, что это одноразовая инициализация, то удобство записи важно, размер кода тоже имеет значение, а вот разница в несколько тактов на 72 МГц это десятки наносекунд. Вообще ни о чём. Частенько наоборот приходится десятки миллисекунд ждать пока вся схема оживёт и закончатся переходные процессы. |
Автор: | a5021 [ Чт май 02, 2019 00:11:30 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Так понял, что возражения если и есть, то касаются они третьестепенных деталей. Это хорошо. В качестве средства для развития алгоритмического воображения, предлагаю определить, что делает нижеследующий алгоритм, будучи запущенным на F103 c частотой 72мгц. Код: void main(void) { RCC->APB1ENR = RCC_APB1ENR_TIM2EN; RCC->APB2ENR = RCC_APB2ENR_IOPCEN; TIM2->ARR = GPIO_ODR_ODR13 * 2; TIM2->PSC = SystemCoreClock / (GPIO_ODR_ODR13 * 2) - 1; TIM2->CR1 = TIM_CR1_CEN; GPIOC->CRH = GPIO_CRH_MODE13_0; for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13); } Что изменится, если цифру 3 везде заменить на 4 ? |
Автор: | VladislavS [ Чт май 02, 2019 08:22:12 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
что делает нижеследующий алгоритм Для начала, лишает автора премии. Затем, если компилятор принципиальный, то Код: Error[Pe144]: a value of type "uint32_t volatile *" cannot be used to initialize an entity of type "int volatile *" И только если уговорить компилятор, то 1 Гц на выходе. В чём вопрос то? Причём тут "алгоритмическое воображение", если тут надо тупо знать регистры конкретного чипа? |
Автор: | a5021 [ Чт май 02, 2019 11:08:11 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
В коде вы смогли разглядеть смысл только меньшей части, а именно инициализацию таймера. Придирку насчет предупреждения компилятора принимаю, но только, как придирку. Ваш вопрос насчет "причем тут" справедлив, но должен быть задан самому себе. В общем, вы не справились. |
Автор: | VladislavS [ Чт май 02, 2019 12:22:45 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Код: for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13); Вот с этой хренью не справился?Код: //for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13); LDR.N R0,??main_0 ;; 0x4001100c LDR.N R1,??main_0+0x4 ;; 0x40000024 ??main_1: LDR R2,[R1, #+0] AND R2,R2,#0x2000 STR R2,[R0, #+0] B.N ??main_1 Ну, да, конечно. Код: for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13; Найди отличие Код: LDR.N R0,??main_0 ;; 0x4001100c
LDR.N R1,??main_0+0x4 ;; 0x40000024 //for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13; ??main_1: LDR R2,[R1, #+0] AND R2,R2,#0x2000 STR R2,[R0, #+0] B.N ??main_1 |
Автор: | a5021 [ Чт май 02, 2019 13:01:01 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Вот с этой хренью не справился? Вообще ни с чем. Конкретный вопрос был задан в самом начале. Вместо ответа на него, вы блистаете азами владения средой разработки. Из исходного кода смогли получить листинг дизасемблера. Ну тоже наверное достижение. |
Автор: | Ярослав555 [ Чт май 02, 2019 13:22:54 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Эй, котаны! https://www.youtube.com/watch?v=JqDCFxEmPIU теперь куб прямо в среду встроен |
Автор: | VladislavS [ Чт май 02, 2019 14:22:07 ] |
Заголовок сообщения: | Re: STM32 новичку в ARM что к чему |
Конкретный вопрос был задан в самом начале. Ну давай почитаем конкретный вопрос.Цитата: В качестве средства для развития алгоритмического воображения, предлагаю определить, что делает нижеследующий алгоритм, будучи запущенным на F103 c частотой 72мгц. И почитаем конкретный ответИ только если уговорить компилятор, то 1 Гц на выходе. Вместо ответа на него, вы блистаете азами владения средой разработки. Из исходного кода смогли получить листинг дизасемблера. Ну тоже наверное достижение. А это чтобы у тебя не было возможности юлить и фантазировать, что там что-то "волшебное" происходит. И что даже эту глупость без ошибки не смог написать. Ну вот объясни, зачем было марать нам мониторы вот этой какашкойКод: for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13); вместо понятного и ошибкоустойчивого Код: for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13; ???
|
Страница 274 из 423 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |