STM32. Урок 14. DMA. Direct Memory Access

  Рет қаралды 12,852

NR.electronics

NR.electronics

Күн бұрын

Пікірлер: 62
@ВикторДухин-п5п
@ВикторДухин-п5п 5 жыл бұрын
Как всегда информативно и доходчиво, большое Вам спасибо. Надеюсь в будущих уроках будет пролит свет на USB интерфейс.
@NRelectronics
@NRelectronics 5 жыл бұрын
Большое спасибо! По USB обязательно будет видео с примерами.
@pavelboboshkin3898
@pavelboboshkin3898 8 ай бұрын
@@NRelectronics, я пытался подключить флешку к контроллеру stm32F105, чтобы обновлять прошивку. Результат посредственный - работает только одна флешка из пяти, что для меня не приемлемо. Поэтому сделал обновление прошивки через SD карту. Не подскажите, в чем может быть проблема? Зато, эксперименты с stm32F407 оказались более успешными - заработали все флешки.
@NRelectronics
@NRelectronics 8 ай бұрын
Если вы говорите о flash-памяти, то они через чур бывают по структуре внутри разные, а если ещё она QSPI, то может множество приколов, типа пнуть в SPI режиме, чтобы просто заработала в QSPI)))
@pavelboboshkin3898
@pavelboboshkin3898 8 ай бұрын
@@NRelectronics , да при чем здесь spi и qspi? Речь про то, что большинство USB флешек не хотят работать с F105. Внутреннее устройство флешек не имеет значения, микроконтроллер подключен только к usbD+, usbD- и питанию. Ничего "пнуть" внутри флешки я не могу. Я хоть и предпочитаю программировать периферию используя только CMSIS, USB - исключение, так как очень сложен. А в драйверах usb host, которые предоставляет CUBEIDE для F105/F107 есть какие то ошибки. Подозреваю, что эти ошибки ST специально не исправляет, чтобы люди переходили на более современные микроконтроллеры.
@NRelectronics
@NRelectronics 8 ай бұрын
Когда не указывают что флешки USBовые, то тогда имеют ввиду SPI/QSPI. Договорённость. Если есть ошибки поправьте их, расскажите нам, я могу помочь рассказать об этом и ролик сделать для всех.
@ваняхилевич
@ваняхилевич 5 жыл бұрын
Спасибо, за интересные уроки)
@NRelectronics
@NRelectronics 5 жыл бұрын
Пожалуйста) Не забывайте про лайки.
@ПетрГуберт
@ПетрГуберт 5 жыл бұрын
На заднем фоне кто-то настойчиво требует внимания)) Урок интересный, спасибо!
@NRelectronics
@NRelectronics 5 жыл бұрын
Спасибо за оценку моей работы, не забывайте про лайки)) На заднем фоне, через стенку, никак не успокоится будущий зритель моего канала ;-)
@openFrimeTv
@openFrimeTv 8 ай бұрын
хотелось бы послушать про DMAMUX. как по мне немного умудрённая штука, пока до конца не разобрался(
@NRelectronics
@NRelectronics 8 ай бұрын
возможно будет, но в ближайшее время точно нет.
@openFrimeTv
@openFrimeTv 8 ай бұрын
@@NRelectronics понял, хорошо
@NRelectronics
@NRelectronics 8 ай бұрын
Почитайте AN5224 от st.
@openFrimeTv
@openFrimeTv 8 ай бұрын
@@NRelectronics та я читал, но там все равно не понятно про генератор запросов. слишком много цепей получается
@NRelectronics
@NRelectronics 6 ай бұрын
Тогда ещё искать инфу. Только так.
@NIKOLAY_PSHONIA
@NIKOLAY_PSHONIA 2 жыл бұрын
Подскажите после передачи данных через DMA - буфер пуст. Так и должно быть? Он опустошает или копирует? Спасибо.
@NRelectronics
@NRelectronics 2 жыл бұрын
он должен очищаться, иначе к какому-то времени произойдет переполнение со всеми вытекающими...
@pavelboboshkin3898
@pavelboboshkin3898 8 ай бұрын
Расскажите про dmamux, который появился в новых микроконтроллерах ST. Вещь приятная - теперь распределение каналов DMA по разной периферии перестало быть квестом. Теперь любой канал DMA можно подключить к любой периферии. Но есть и непонятные моменты: синхронизация и request generatot. Никак не могу придумать, для чего это вообще может понадобиться.
@NRelectronics
@NRelectronics 8 ай бұрын
Это надо где-то к STM32H7. Пока не планирую. Но учту. Спасибо
@NIKOLAY_PSHONIA
@NIKOLAY_PSHONIA 3 жыл бұрын
Добрый день. Запустил DMA на передачу - шлет весь буфер [128] . А как передать из буфера несколько символов а не весь гнать??? Спасибо.
@NRelectronics
@NRelectronics 3 жыл бұрын
Добрый день. Выбор из буфера по адресу элемента ;)
@NIKOLAY_PSHONIA
@NIKOLAY_PSHONIA 3 жыл бұрын
@@NRelectronics в мануале написано что какой размер задали в DMA_BufferSize = 128; // размер буфера столько раз по 8 бит и будет передаваться. Каждый раз задавать размер - сколько символов ??? или есть другой подход??? СПАСИБО.
@NIKOLAY_PSHONIA
@NIKOLAY_PSHONIA 3 жыл бұрын
сделал так мож кому пригодиться void uart1_dma2_TX(uint8_t razmer) // настройка DMA на передачу данных опред. длины { DMA_Cmd(DMA2_Stream7, DISABLE); // Выключаем DMA. DMA2_Stream7->NDTR = razmer; // Устанавливаем размер передаваемого буфера заново. DMA_Cmd(DMA2_Stream7, ENABLE); // Включаем DMA - сразу передаються }
@pavelboboshkin3898
@pavelboboshkin3898 8 ай бұрын
Я использую DMA, запускающийся от таймера для отладки интерфейсов, например, usart или i2c. DMA захватывает состояние GPIOx->IDR и складывает в буфер. Потом, по полученным данным делаю графики. С таким, конечно, и логический анализатор справится. Но логический анализатор не может заглянуть, например, в регистр флагов интерфейса. К сожалению, в контроллерах серий G0 и C0 фирма ST подложила свинью: там DMA не имеет доступа к GPIO.
@NRelectronics
@NRelectronics 8 ай бұрын
Здорово, хорошо.
@serg888fert4
@serg888fert4 3 жыл бұрын
здравствуйте. подскажите, пожалуйста, откуда примеры программ в этом ролике. из апноутов и референсов? ссылки можно на них? по stm32f103. спасибо.
@NRelectronics
@NRelectronics 3 жыл бұрын
Здравствуйте. Сейчас по памяти не подскажу. Извините, но примеры которых нет под видео, доступны только по подписке на моем канал с подпиской - "Полный доступ"
@y_ivan
@y_ivan 4 жыл бұрын
При работе через DMA, как осуществлять контроль отправки данных? Если после функции HAL_UART_Transmit_DMA создать новую функцию HAL_UART_Transmit_DMA с другими данными, то они как правило теряются.
@NRelectronics
@NRelectronics 4 жыл бұрын
Так если сразу создать без контроля флагов то понятно что будет переполнение...
@studentru2767
@studentru2767 5 жыл бұрын
@NR.electronics здравствуйте как можно с вами связаться вк есть ? очень нужно помощь ваши (
@NRelectronics
@NRelectronics 5 жыл бұрын
В описании к каналу есть все необходимые ссылки.
@studentru2767
@studentru2767 5 жыл бұрын
@@NRelectronics +79096828171 пж позвоните )
@studentru2767
@studentru2767 5 жыл бұрын
@@NRelectronics не могу найти ссылки на ваши профиль (
@janedoe6182
@janedoe6182 3 жыл бұрын
22:10 Точно, "алижнмент"? Может "алайнмент"?
@NRelectronics
@NRelectronics 3 жыл бұрын
Точно алайнмент)
@OrlenokV
@OrlenokV 4 жыл бұрын
Спасибо большое за видео! Хотел бы узнать в каких случаях (примерах из жизни) используется прерывание по завершению половины обмена?
@NRelectronics
@NRelectronics 4 жыл бұрын
На приятное обучение) не забывайте про лайки ;-) у меня по половине обмена случаев не было. По окончанию обмена как самый частый вариант.
@Bi-dj3iy
@Bi-dj3iy Жыл бұрын
Боюсь спросить Ваш опыт работы сколько лет?
@NRelectronics
@NRelectronics Жыл бұрын
Фиг его знает, а что?))
@Bi-dj3iy
@Bi-dj3iy Жыл бұрын
@@NRelectronics да просто мне кажется что бы так непринужденно рассказывать про каждый элемент "что куда" нужно перед этим лет 10 практики
@NRelectronics
@NRelectronics Жыл бұрын
Спасибо за приятные слова!
@1975nacgul
@1975nacgul 6 ай бұрын
27:00 7 микросекунд это быстро? при тактах 10 наносекунд?
@NRelectronics
@NRelectronics 6 ай бұрын
А вы хотели чтобы были наносекунды? Их естественно не будет.
@1975nacgul
@1975nacgul 6 ай бұрын
@@NRelectronics это получается 700 тактов при 100 мгц? С какой скоростью идет передача от АЦП в память при циклической передачи? Например мы оцифровываем сигнал.
@NRelectronics
@NRelectronics 6 ай бұрын
Калибровка АЦП, преобразование, предварительное сохранение, подготовка и работа DMA. Вот и набегает.
@1975nacgul
@1975nacgul 6 ай бұрын
@@NRelectronics то чтоту вас в таблице там память - память, ADC-память быстрее должно быть, не ниже скорости шины данных.
@NRelectronics
@NRelectronics 6 ай бұрын
Flash Latency тоже никто не отменял.
@ivanrusev2270
@ivanrusev2270 3 жыл бұрын
Я настроил АЦП и ДМА в прерівании . И записал сбытие Если буфер больше 525 то в порт запись 1 иначе 0.Программа работает ну как то не правильно.Вращаеш резистор нажимаешь ресет.И тогда показует состояние светодиода.Почему так работает?
@NRelectronics
@NRelectronics 3 жыл бұрын
Ну как то непонятно что и как вообще настроено.
@ivanrusev2270
@ivanrusev2270 3 жыл бұрын
@@NRelectronics #include "main.h" volatile unsigned int bufer; volatile unsigned int bufer1; static uint16_t pauza=0; volatile unsigned int adc_data=0; void NMI_Handler(void) { if((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail { RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag } } void DMA2_Stream0_IRQHandler (void) { if(DMA2->LISR &DMA_LISR_TCIF0) { DMA2->LIFCR |= DMA_LIFCR_CTCIF0; bufer1 = ADC1->DR; if(bufer1>595) { GPIOC-> BSRR |=GPIO_BSRR_BS13; } else { GPIOC-> BSRR |=GPIO_BSRR_BR13; } } if(DMA2->LISR &DMA_LISR_TEIF0) { DMA2->LIFCR |= DMA_LIFCR_CTEIF0; } //if( DMA2) } void TIM4_IRQHandler (void) { if(TIM4->SR & TIM_SR_UIF) { TIM4->SR &= ~ TIM_SR_UIF; //IWDG->KR = 0xAAAA; pauza++; if(pauza>20) { //GPIOC->BSRR |= GPIO_BSRR_BS1; //GPIOC-> BSRR |=GPIO_BSRR_BS13; } if(pauza>40) { // GPIOC-> BSRR |=GPIO_BSRR_BR13; // GPIOD->BSRR |= GPIO_BSRR_BR1; pauza=0; } } } void RCC_init(void) { FLASH->ACR |= FLASH_ACR_PRFTEN ; //FLASH->ACR &=~ (FLASH_ACR_LATENCY_2WS) ; FLASH->ACR |= FLASH_ACR_LATENCY_3WS ; //PWR->CR|= PWR_CR_VOS; RCC->CR|=RCC_CR_HSEON; // Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)); RCC->CR|=RCC_CR_CSSON; RCC->PLLCFGR |=RCC_PLLCFGR_PLLSRC_HSE ; RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLM,4); RCC->PLLCFGR |=_VAL2FLD(RCC_PLLCFGR_PLLN,168); RCC->PLLCFGR&=~RCC_PLLCFGR_PLLP_0 ; RCC->PLLCFGR&=~RCC_PLLCFGR_PLLP_1 ; RCC->CFGR |= RCC_CFGR_HPRE_DIV1;// ��������� ���� AHB RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;// ��������� ���� APB1 RCC->CFGR |= RCC_CFGR_PPRE2_DIV2; RCC->CR |= RCC_CR_PLLON; // enable PLL while(!(RCC->CR & RCC_CR_PLLRDY)) { } RCC->CFGR |= RCC_CFGR_SW_PLL; // select source SYSCLK = PLL while(!(RCC->CFGR& RCC_CFGR_SWS_PLL)) { } } void init_IWDGtimer(void) { RCC->CSR|= RCC_CSR_LSION; IWDG->KR = 0x5555; // Access to registers IWDG->PR&= ~(IWDG_PR_PR_0 | IWDG_PR_PR_1 | IWDG_PR_PR_2); // 4096 IWDG->RLR = 2000;//0x7FF; while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set. IWDG->KR = 0xCCCC; // Start count down; } void adc_init(void) { GPIOA->MODER |= GPIO_MODER_MODER1; GPIOA->MODER |= GPIO_MODER_MODER2; RCC->APB2ENR|=RCC_APB2ENR_ADC1EN; ADC1->CR2 &=~ADC_CR2_CONT;//�������� ��� //ADC1->CR2=ADC_CR2_EXTSEL; ADC1->CR2 |=ADC_CR2_EXTEN; ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_0; //1 ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1 ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1 // ADC1->JSQR|=ADC_JSQR_JSQ1_0;; ADC1->SQR3 |=ADC_SQR3_SQ1_0; //1 IN1 ADC1->SQR3 &= ~ ADC_SQR3_SQ1_1; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_2; //0 ADC1->SQR3 &=~ ADC_SQR3_SQ1_3; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_4; ADC1->CR2|=ADC_CR2_DMA; ADC1->CR2 |= ADC_CR2_ADON; //ADC3->CR2|=ADC_CR2_EXTSEL_2 |ADC_CR2_EXTSEL_1; //ADC1->CR2 |= ADC_CR2_SWSTART; } void DMA1_init(void) { RCC->AHB1ENR|= RCC_AHB1ENR_DMA1EN; //DMA1_Stream0->CR = 0; DMA1_Stream0->M0AR |=(uint32_t)& bufer; DMA1_Stream0->PAR |=(uint32_t)&TIM4->CCR1 ; DMA1_Stream0->NDTR = 2; DMA1_Stream0->CR&= ~DMA_SxCR_PINC; DMA1_Stream0->CR&= ~DMA_SxCR_MINC; DMA1_Stream0->CR|= DMA_SxCR_PSIZE_0; DMA1_Stream0->CR|= DMA_SxCR_MSIZE_0; DMA1_Stream0->CR|=DMA_SxCR_CHSEL_0; DMA1_Stream0->CR|= DMA_SxCR_CHSEL_1; DMA1_Stream0->CR&=~ DMA_SxCR_CHSEL_2 ; DMA1_Stream0->CR&=~ DMA_SxCR_PFCTRL;//DMA ma DMA1_Stream0->CR|= DMA_SxCR_PL; //DMA ma DMA1_Stream0->FCR|=DMA_SxFCR_DMDIS;//��������� fIFO DMA1_Stream0->CR|= DMA_SxCR_DIR_0; DMA1_Stream0->CR|= DMA_SxCR_CIRC; DMA1_Stream0->CR|= DMA_SxCR_EN;//�� } void DMA2_init(void) { RCC->AHB1ENR|= RCC_AHB1ENR_DMA2EN; DMA2_Stream0->CR = 0; DMA2_Stream0->PAR |=(uint32_t)& ADC1->DR; DMA2_Stream0->M0AR |=(uint32_t)& bufer1; // TIM4->CCR1= bufer; DMA2_Stream0->NDTR = 1; DMA2_Stream0->CR&= ~DMA_SxCR_PINC; DMA2_Stream0->CR&= ~DMA_SxCR_MINC; DMA2_Stream0->CR|= DMA_SxCR_PSIZE_0; DMA2_Stream0->CR|= DMA_SxCR_MSIZE_0; DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL_0 ; DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL_1; DMA2_Stream0->CR&=~ DMA_SxCR_CHSEL_2 ; DMA2_Stream0->CR&=~ DMA_SxCR_PFCTRL;//DMA ma DMA2_Stream0->CR|= DMA_SxCR_PL; //DMA ma //DMA2_Stream0->FCR|=DMA_SxFCR_DMDIS;//��������� fIFO DMA2_Stream0->CR&=~ DMA_SxCR_DIR; DMA2_Stream0->CR|= DMA_SxCR_CIRC; DMA2_Stream0->CR|=DMA_SxCR_TCIE; DMA2_Stream0->CR|=DMA_SxCR_TEIE; //DMA2_Stream0->CR|=DMA_SxCR_DMEIE; DMA2_Stream0->CR|= DMA_SxCR_EN;//��� DMA2_Stream0 NVIC_EnableIRQ(DMA2_Stream0_IRQn); //ADC1->CR2|=ADC_CR2_DMA; } static void AHB1ER_init(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN; RCC->AHB1ENR|=RCC_AHB1ENR_GPIOBEN; RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN; RCC->AHB1ENR|=RCC_AHB1ENR_GPIODEN; } static void GPIO_init(void) { GPIOC->MODER &=~ GPIO_MODER_MODER13_1; GPIOC->MODER |= GPIO_MODER_MODER13_0; // GPIOC ->OTYPER |=GPIO_OTYPER_OT13; //���0 ���������� �������� ������ GPIO GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_1; //���1 GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR13_0; GPIOC->PUPDR |=GPIO_PUPDR_PUPDR13_1; GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR13_0; GPIOC->MODER &=~ GPIO_MODER_MODER13_1; GPIOC->MODER |= GPIO_MODER_MODER0_0; // GPIOC ->OTYPER |=GPIO_OTYPER_OT13; //���0 ���������� �������� ������ GPIO GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0_1; //���1 GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR0_0; GPIOC->PUPDR |=GPIO_PUPDR_PUPDR0_1; GPIOC->PUPDR &=~ GPIO_PUPDR_PUPDR0_0; } void timer2_init(void) { RCC->APB1ENR |=RCC_APB1ENR_TIM2EN; TIM2->PSC=9; // ����������� �������� ��� ������ ����� 1000 ��� � ������� TIM2->ARR = 7000; TIM2->CR2|=TIM_CR2_MMS_1;//бит управлени ацп TIM2->EGR = TIM_EGR_UG ; TIM2->CR1|= TIM_CR1_CEN; } static void timer4_init(void) { RCC->APB1ENR|=RCC_APB1ENR_TIM4EN; TIM4->PSC=3500-1; TIM4->ARR=100-1; // TIM4->EGR|= TIM_EGR_UG; TIM4->DIER = TIM_DIER_UIE; TIM4->CR1= TIM_CR1_CEN; NVIC_EnableIRQ(TIM4_IRQn); } int main(void) { RCC_init(); AHB1ER_init(); GPIO_init(); timer2_init(); timer4_init(); adc_init(); DMA2_init(); //ADC1->CR2 |= ADC_CR2_SWSTART; ADC1->CR2|=ADC_CR2_EXTSEL_2 |ADC_CR2_EXTSEL_1; while(1) { //ADC1->CR2 |= ADC_CR2_SWSTART; // ADC1->CR2|=ADC_CR2_EXTSEL_2 |ADC_CR2_EXTSEL_1; // while(!(ADC1->SR & ADC_SR_EOC)); // ADC1->SR &=~ ADC_SR_EOC; // adc_data = ADC1->DR; // if(adc_data>595) // { // GPIOC-> BSRR |=GPIO_BSRR_BS13; // } // else // { // GPIOC-> BSRR |=GPIO_BSRR_BR13; // } //GPIOC-> BSRR |=GPIO_BSRR_BS13; } }
@ЧПУ
@ЧПУ 4 жыл бұрын
Для меня DMA чем то напоминает северный мост.
@NRelectronics
@NRelectronics 4 жыл бұрын
Отчасти да)
@АлексПовзун-г6у
@АлексПовзун-г6у 5 жыл бұрын
👍👍👍👍
@NRelectronics
@NRelectronics 4 жыл бұрын
Не забывайте про лайки и конструктивные предложения ;-)
@ваняхилевич
@ваняхилевич 5 жыл бұрын
Будут ли уроки про таймеры и АЦП\ЦАП ?
@NRelectronics
@NRelectronics 5 жыл бұрын
Отдельно по таймерам, в нескольких частях ибо тема большая и их у STM32 куча, отдельно по АЦП и отдельно по ЦАП. Только вот в F103 ЦАПа то нет, тогда на F4 покажу.
@studentru2767
@studentru2767 5 жыл бұрын
@@NRelectronics здравствуйте как можно с вами связаться вк есть ? очень нужно помощь ваши (
@pavelboboshkin3898
@pavelboboshkin3898 8 ай бұрын
@@NRelectronics , ЦАП есть в stm32F103 с объёмом флешь памяти 256к или больше.
@NRelectronics
@NRelectronics 8 ай бұрын
Да, но у меня такого МК нет, поэтому показать никак не могу. Поэтому нет.
@jeffreybelicoff2368
@jeffreybelicoff2368 3 жыл бұрын
ау 19 со на месте,
@NRelectronics
@NRelectronics 3 жыл бұрын
Что имели ввиду?
STM32. Урок 13. USART. STM32F103  CMSIS. Часть 3
34:18
NR.electronics
Рет қаралды 6 М.
STM32. Урок 20. SPI. Serial Peripheral Interface
40:20
NR.electronics
Рет қаралды 9 М.
Worst flight ever
00:55
Adam W
Рет қаралды 54 МЛН
My Daughter's Dumplings Are Filled With Coins #funny #cute #comedy
00:18
Funny daughter's daily life
Рет қаралды 25 МЛН
STM32. Урок 13. USART. Теория. Часть 1
45:45
NR.electronics
Рет қаралды 10 М.
Изучаю STM32!
20:26
Лёша Кластер
Рет қаралды 194 М.
STM32 c чего начать?Быстрый старт с нуля.
34:23
ElectroHobby (BARYS ILKAVETS)
Рет қаралды 198 М.
STM32. Урок 17. Timers. Basic timer - Базовый таймер
31:41
STM - how to fill the firmware
14:16
Home Made
Рет қаралды 72 М.
STM32. Урок 16. Timers. Свойства таймеров в STM32
33:41