Не стесняйтесь задавать вопросы в комментариях! Вы же не просто так в них зашли, да?)
@СуНаиль5 жыл бұрын
Выкладывал бы ты еще проекты и ссылку в шапке.
@donrumata52995 жыл бұрын
Упс.. Забываю... Скоро исправлю
@СуНаиль5 жыл бұрын
@@donrumata5299 и забыл сказать спасибо.
@donrumata52995 жыл бұрын
Рад стараться)
@donrumata52995 жыл бұрын
Да, если что, исходники есть под каждым видео в описании... теперь
@vitaliy2043 жыл бұрын
Молодець гарно зроблено, підписався провсяк випадок. Звісно є косяки, але блін я ні в кого не бачив таких зрозумілих уроків для новачків як в тебе. Жаль що коли я вчився такого не було. Якщо що відгук від дядька, що займається цим професійно.
@liliansirbu8402 жыл бұрын
запишите пожалуста по больше видео на АЦП в разных режимов под CMSIS, как ДМА, много каналов, итд. пасиб.
@mikitashary55525 жыл бұрын
На вашей платке должна быть микросхема cs43l22, можете показать как ее инициализировать, настраивать и пользовать на cmsis?)
@donrumata52995 жыл бұрын
Это, конечно, всё хорошо, но пока я рассказываю про самые простые периферии контроллера, а для этой микросхемы нужны I2C и I2S Это ещё не скоро...
@ivanrusev22704 жыл бұрын
C ацп всё получилось даже с индуцырованным каналом.А вот в прерывании индуцированного канала только после ресета получаются преобразования?.Изучаю DMA. По ДМА еслиб были уроки.
@donrumata52994 жыл бұрын
С ДМА + АЦП где-то у меня были приеры...
@ivanrusev22704 жыл бұрын
@@donrumata5299 Да я сейчас сам принцип работы ДМА только изучаю.И почему в прерывании ДМА ничего не пишется.?Если можете показать пример покажите.Для STM32f1 там каналы.Для STM32f4 и выше стримы?
@donrumata52994 жыл бұрын
@@ivanrusev2270 Ну.. Одно другому не мешает. Там есть Два DMA, у каждого, кажется, 8 потоков (steam`ов). Причём каждый настраивается отдельно. И настравивается на один из нескольких каналов, кажется, тоже 8-и.
@donrumata52994 жыл бұрын
@@ivanrusev2270 Пример сейчас на ГитХаб выложу.
@donrumata52994 жыл бұрын
@@ivanrusev2270 Если ещё надо, то вот он на гитхабе, там и другие уроки тоже есть github.com/donRumata03/STM32F4-CMSIS-lessons/tree/master/Future/ADC_DMA
@igornaumenko74328 ай бұрын
Для регулярних каналів можна використати DMA і кожен PIN буде складати данні в конкретне місце. ADC можна запускати навіть по таймеру що допоможе синхронізувати данні щей по часу.
@donrumata52998 ай бұрын
Ага, помню такое, спасибо за замечание. Тут видео чисто для демонстрации ADC, для DMA уже думать надо :)
@BasekeTV5 жыл бұрын
Привет, мой юный друг! Меня зовут Берекет! Учусь я в Китае. Меня жутко интересует программирование ٍмикроконтроллеров STM32. Мне нужно быстро освоить это дело и найти стажировку в этой области. Смотрю и рунет и зарубежные сайты. Популярных курсов найти не легко, многие начатые да не завершенные. Зато уроков по ардуино НАВАЛОМ. Вы советуете курсы по STMке Nordic Energy? Дайте советы пожалуйста. Спасибо!
@donrumata52995 жыл бұрын
Ох Интересно Прошу заметить, что он снимает курсы по другому микроконтроллеру того же семейства. (STM32F1). Nordic Energy хорош тем, что записывает уроки на CMSIS, что мне определённо импонирует. Другим - не уверен. Мой курс уникален тем, что рассматривается CMSIS на STM32F4. Если контроллер уже куплен, то одно дело, если нет, то для начала можно выбрать STM32F1
@BasekeTV5 жыл бұрын
don Rumata спасибо. Еще не купил, но собираюсь. Спасибо за информацию!
@donrumata52995 жыл бұрын
Всё для подписчиков)
@СуНаиль5 жыл бұрын
@@donrumata5299 Sappise еще хорошие уроки делал, но забил и бросил. CMSIS хорошая штука, но все эти операции с регистрами такой геморрой. Для понимания работы в любом случае нужно. А Nordic Energy реально хорош и занимается силовой техникой и ЧП. Кстати, Vladimir Medintsev хорошие уроки выкладывает, но без кода. Есть что интересного по регуляторам.
@donrumata52995 жыл бұрын
@@СуНаиль Но тут, правда, такое дело. Я записываю уроки (хотя смотрел Sappise), именно потому что они не на CMSIS :)
@ivanrusev22704 жыл бұрын
Да и ещё инжекторный канал в прерывании работает странно после ресета считывается информация.Если настраиваю в цикле нормально
@donrumata52994 жыл бұрын
А нужны ли Вам прерывания для инжектированных? В том их и суть, что,, скорее всего, не нужны
@ivanrusev22704 жыл бұрын
@@donrumata5299 Так что это их работа в прерываниях? В Кубе тоже самое что на cmsis или же есть какой то бит который не знаю?
@donrumata52994 жыл бұрын
Прерывания не нужны, так как в любой момент, когда потребуется информация о значении АЦП, можно его получить просто обращением в регистр
@ivanrusev22704 жыл бұрын
Я имею ввиду не в прерывании.
@ivanrusev22704 жыл бұрын
а как настроить несколько выводов одного ацп? На авр проще?
@donrumata52994 жыл бұрын
"""Все парни хотят только одного и это просто отвратительно"""... Видимо, не выводов, а вводов. Ну, собственно, если рассматривать регулярные каналы, то нужно действовать ровно так, как я и показал, только обобщить на случай нескольких каналов, то есть ввести кол-во каналов равное не 1, а 2м например и ввести список каналов в соответствующее место.
@donrumata52994 жыл бұрын
На авр, честно говоря, не знаю. Там вообще можно?
@donrumata52994 жыл бұрын
Просто если я правильно понимаю, от на авр АЦП просто жёстко привязан к выводу..
@donrumata52994 жыл бұрын
То есть как бы проще, да но)))
@ivanrusev22704 жыл бұрын
@@donrumata5299 На АВР есть муксы создаётся функция которая производит включение этих муксов с промежутком некоторого времени 10 микросекунд .Настройка Ацп у стм по другому .А меня волнует организация вывода информации? Если можете подскажите.
@ivanrusev22705 жыл бұрын
часть кода пропущено
@donrumata52995 жыл бұрын
Всё исходники на гитхабе и они работают
@ivanrusev22705 жыл бұрын
@@donrumata5299 я не знаю у меня ваш код не работает ни в ацп ни в таймере.Но в прерывании по кнопке работает.Этот код работает таймера в микросхеме stm32 f103c8
@donrumata52995 жыл бұрын
@@ivanrusev2270 Что я точно могу сказать, так это то, что я тестил этот код прямо перед загрузкой на отладочной плате STM32F4-DISCOVERY, причём проект в репозитории кейловский. Так что отличия, то есть Вашу ошибку надо искать либо в плате, либо в отличии кейла от AtolicStudio
@ivanrusev22705 жыл бұрын
@@donrumata5299 я заказал 2 платы такую же только друого производителя и другой процессор cortexm4
@ivanrusev22705 жыл бұрын
@@donrumata5299 STM32F4-DISCOVERY, а в чём отличие дискавери.В Кейле тоже самое.
@ivanrusev22704 жыл бұрын
я запустил таймером в прерывании инжекторный канал заработало.
@donrumata52994 жыл бұрын
Поздравляю!
@ivanrusev22704 жыл бұрын
@@donrumata5299 Спасибо мне до вас далеко. Я сам учусь но вам спасибо.2014 году до 24 декабря понятие не имел о программирование контроллеров.
@tiMer234 жыл бұрын
Чувак, ты жив? Когда уроки?))
@donrumata52994 жыл бұрын
В целом - жив, но со временем беда... Когда оно появится, будут интересные уроки)
@ivanrusev22705 жыл бұрын
Может и все уроки тоже самое неправильная инфа
@donrumata52995 жыл бұрын
Было бы не правильно, ничего бы не работало
@ivanrusev22705 жыл бұрын
@@donrumata5299 с таймером та же история
@donrumata52995 жыл бұрын
Я имею в виду, ничего бы не работало у меня. Я запускаю этот код. АЦП выводит верные числа, таймер - тоже работает Проверьте свой код, название контроллера и т.д.
@ivanrusev22705 жыл бұрын
@@donrumata5299 Код я вам показал два кода .А таймер не работает в этом же контроллере.Проверял регистры на stm32103c8 работает.А на stm32f407ve не работает.Режим internal clock.Посмотрите вы код?
@ivanrusev22705 жыл бұрын
не работает
@donrumata52995 жыл бұрын
А почему у меня работает? Проверьте
@ivanrusev22705 жыл бұрын
@@donrumata5299 * main.h * * Created on: 10 лист. 2019 р. * Author: Ivan */ #include"stm32f4xx.h" #include"stm32f407xx.h" #ifndef CODE_MAIN_H_ #define CODE_MAIN_H_ #endif /* CODE_MAIN_H_ */ #include"main.h" volatile unsigned int adc_data=0; void ADC_IRQHaunler() { if(ADC1->SR & ADC_SR_EOC) { ADC1->SR &= ~ADC_SR_EOC; adc_data |= ADC1->DR; if(adc_data>2045) { GPIOC-> BSRR |=GPIO_BSRR_BS13; } else { GPIOC-> BSRR |=GPIO_BSRR_BR13; } } } void inits_GPIO(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN; // GPIOC->MODER &=~ GPIO_MODER_MODER13; 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; } void init_ADC1(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN; GPIOA->MODER |=GPIO_MODER_MODE1_1; GPIOA->MODER |= GPIO_MODER_MODE1_0; GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR1_1; GPIOA->PUPDR &=~ GPIO_PUPDR_PUPDR1_0; RCC->AHB2ENR |= RCC_APB2ENR_ADC1EN ; ADC->CCR&=~ ADC_CCR_ADCPRE_0; //ADC1->CR2 |=ADC_CR2_CONT; //ADC1->CR2 |=ADC_CR2_EXTEN; // //ADC1->CR2|=ADC_CR2_EXTSEL; /* номер канал */ ADC1->SQR3 |= ADC_SQR3_SQ1_0; //0 IN1 ADC1->SQR3 &= ~ ADC_SQR3_SQ3_1; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_2; //0 ADC1->SQR3 &=~ ADC_SQR3_SQ1_3; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_4;//0 ADC1->SMPR2 &=~ ADC_SMPR2_SMP0_0; //0 скорость выборки каналов 23мс ADC1->SMPR2&=~ADC_SMPR2_SMP0_1; //0 ADC1->SMPR2 &=~ ADC_SMPR2_SMP0_2; //0 ADC1->CR2 |=ADC_CR2_CONT; ADC1->CR1|= ADC_CR1_EOCIE; ADC1->CR2 |= ADC_CR2_ADON; NVIC_EnableIRQ (ADC_IRQn); } int main(void) { inits_GPIO(); init_ADC1(); ADC1->CR2 |= ADC_CR2_SWSTART; while(1) { //GPIOC-> BSRR |=GPIO_BSRR_BS13; } } эта не рабочая моя. А вот эта рабочая но контроллер другой в чём дело не знаю /* * main.c * * Created on: 29 жовт. 2019 р. * Author: Ivan */ #include"main.h" //#include "stm32f103xb.h" //#include "stm32f1xx.h" volatile unsigned int flag=0; volatile unsigned int adc_data=0; void ADC1_2_IRQHandler() { while (!(ADC1->SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится ADC1->SR &=~ ADC_SR_EOC; adc_data = ADC1->DR; if(adc_data > 2024) { GPIOC->BSRR |= GPIO_BSRR_BS13; } else { GPIOC->BSRR |= GPIO_BSRR_BR13; } } void init_ADC1(void) { RCC->APB2ENR|=RCC_APB2ENR_IOPCEN; GPIOC->CRH&=~GPIO_CRH_CNF13; GPIOC->CRH|= GPIO_CRH_MODE13_1; RCC->CFGR &=~ RCC_CFGR_ADCPRE; RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; GPIOA->CRL&=~GPIO_CRL_CNF1; GPIOA->CRL&=~ GPIO_CRL_MODE1; RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2; //подаем тактирование АЦП ADC1->CR2 |= ADC_CR2_RSTCAL; while (!(ADC1->CR2 & ADC_CR2_RSTCAL)) { } ADC1->CR2 |= ADC_CR2_CAL; while (!(ADC1->CR2 & ADC_CR2_RSTCAL)) { } ADC1->CR2 |=ADC_CR2_CONT;//включить АЦП ADC1->CR2 |= ADC_CR2_EXTSEL; ADC1->CR2 |= ADC_CR2_EXTTRIG; 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->SMPR2 &=~ ADC_SMPR2_SMP1_0; //1 ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1 ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1 } int main(void) { //inits_GPIO(); init_ADC1(); ADC1->CR1|= ADC_CR1_EOCIE; ADC1->CR2 |= ADC_CR2_ADON; NVIC_EnableIRQ ( ADC1_2_IRQn); ADC1->CR2 |= ADC_CR2_SWSTART; while(1) { } } Может когда первый раз прошивал перемычек не было .И что то нарушил
@ivanrusev22705 жыл бұрын
@@donrumata5299 /* * main.c * * Created on: 29 жовт. 2019 р. * Author: Ivan */ #include"main.h" //#include "stm32f103xb.h" //#include "stm32f1xx.h" volatile unsigned int flag=0; volatile unsigned int adc_data=0; void ADC1_2_IRQHandler() { while (!(ADC1->SR & ADC_SR_EOC)); //ждем пока первое преобразование завершится ADC1->SR &=~ ADC_SR_EOC; adc_data = ADC1->DR; if(adc_data > 2024) { GPIOC->BSRR |= GPIO_BSRR_BS13; } else { GPIOC->BSRR |= GPIO_BSRR_BR13; } } void init_ADC1(void) { RCC->APB2ENR|=RCC_APB2ENR_IOPCEN; GPIOC->CRH&=~GPIO_CRH_CNF13; GPIOC->CRH|= GPIO_CRH_MODE13_1; RCC->CFGR &=~ RCC_CFGR_ADCPRE; RCC->APB2ENR|=RCC_APB2ENR_IOPAEN; GPIOA->CRL&=~GPIO_CRL_CNF1; GPIOA->CRL&=~ GPIO_CRL_MODE1; RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; RCC->CFGR |= RCC_CFGR_ADCPRE_DIV2; //подаем тактирование АЦП ADC1->CR2 |= ADC_CR2_RSTCAL; while (!(ADC1->CR2 & ADC_CR2_RSTCAL)) { } ADC1->CR2 |= ADC_CR2_CAL; while (!(ADC1->CR2 & ADC_CR2_RSTCAL)) { } ADC1->CR2 |=ADC_CR2_CONT;//включить АЦП ADC1->CR2 |= ADC_CR2_EXTSEL; ADC1->CR2 |= ADC_CR2_EXTTRIG; 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->SMPR2 &=~ ADC_SMPR2_SMP1_0; //1 ADC1->SMPR2&=~ADC_SMPR2_SMP1_1; //1 ADC1->SMPR2 &=~ ADC_SMPR2_SMP1_2; //1 } int main(void) { //inits_GPIO(); init_ADC1(); ADC1->CR1|= ADC_CR1_EOCIE; ADC1->CR2 |= ADC_CR2_ADON; NVIC_EnableIRQ ( ADC1_2_IRQn); ADC1->CR2 |= ADC_CR2_SWSTART; while(1) { } } Это рабочий проект. правда контроллер другой stm32103c8 /* * main.c * * Created on: 10 лист. 2019 р. * Author: Ivan */ #include"main.h" volatile unsigned int adc_data=0; void ADC_IRQHaunler() { if(ADC1->SR & ADC_SR_EOC) { ADC1->SR &= ~ADC_SR_EOC; adc_data |= ADC1->DR; if(adc_data>2045) { GPIOC-> BSRR |=GPIO_BSRR_BS13; } else { GPIOC-> BSRR |=GPIO_BSRR_BR13; } } } void inits_GPIO(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIOCEN; // GPIOC->MODER &=~ GPIO_MODER_MODER13; 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; } void init_ADC1(void) { RCC->AHB1ENR|=RCC_AHB1ENR_GPIOAEN; GPIOA->MODER |=GPIO_MODER_MODE1_1; GPIOA->MODER |= GPIO_MODER_MODE1_0; GPIOA->PUPDR &=~GPIO_PUPDR_PUPDR1_1; GPIOA->PUPDR &=~ GPIO_PUPDR_PUPDR1_0; RCC->AHB2ENR |= RCC_APB2ENR_ADC1EN ; ADC->CCR&=~ ADC_CCR_ADCPRE_0; //ADC1->CR2 |=ADC_CR2_CONT; //ADC1->CR2 |=ADC_CR2_EXTEN; // //ADC1->CR2|=ADC_CR2_EXTSEL; /* номер канал */ ADC1->SQR3 |= ADC_SQR3_SQ1_0; //0 IN1 ADC1->SQR3 &= ~ ADC_SQR3_SQ3_1; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_2; //0 ADC1->SQR3 &=~ ADC_SQR3_SQ1_3; //0 ADC1->SQR3 &= ~ADC_SQR3_SQ1_4;//0 ADC1->SMPR2 &=~ ADC_SMPR2_SMP0_0; //0 скорость выборки каналов 23мс ADC1->SMPR2&=~ADC_SMPR2_SMP0_1; //0 ADC1->SMPR2 &=~ ADC_SMPR2_SMP0_2; //0 ADC1->CR2 |=ADC_CR2_CONT; ADC1->CR1|= ADC_CR1_EOCIE; ADC1->CR2 |= ADC_CR2_ADON; NVIC_EnableIRQ (ADC_IRQn); } int main(void) { inits_GPIO(); init_ADC1(); ADC1->CR2 |= ADC_CR2_SWSTART; while(1) { //GPIOC-> BSRR |=GPIO_BSRR_BS13; } stm32f407ve не работает правда когда сначала прошивал не было перемычек BOOT1 BOOT0 не знаю я чём дело пишу В atolic truestudio проект с нуля пишу.
@donrumata52995 жыл бұрын
Если контроллер серии f1, то там просто другие названия регистров, не удивительно, что не работает
@ivanrusev22705 жыл бұрын
@@donrumata5299 в ADC да а вот таймера всё одинаково только кол-во другое .Регистры на таймерах одинаковые биты один к одному я сверялся не один час.У меня может быть проблема с платой.Я первый раз прошивал без перемычек BOOT0 BOOT1. ВЫ можете посмотреть программу код мой?
@sherstobitov142 жыл бұрын
Прежде чем выкладывать свои видео уроки. Вы их смотрели перед публикацией ? У вас окна не переключаются, соответственно что вы делаете в основном не понятно.
@donrumata52992 жыл бұрын
Угу, есть в середине такая проблема, но в целом код выложен, и в конце IDE нормально видно…