Урок 6. АЦП. STM32F4 на CMSIS. Регулярные каналы. Программирование микроконтроллеров.

  Рет қаралды 3,592

don Rumata (donRumata)

don Rumata (donRumata)

Күн бұрын

Пікірлер: 80
@donrumata5299
@donrumata5299 5 жыл бұрын
Не стесняйтесь задавать вопросы в комментариях! Вы же не просто так в них зашли, да?)
@СуНаиль
@СуНаиль 5 жыл бұрын
Выкладывал бы ты еще проекты и ссылку в шапке.
@donrumata5299
@donrumata5299 5 жыл бұрын
Упс.. Забываю... Скоро исправлю
@СуНаиль
@СуНаиль 5 жыл бұрын
@@donrumata5299 и забыл сказать спасибо.
@donrumata5299
@donrumata5299 5 жыл бұрын
Рад стараться)
@donrumata5299
@donrumata5299 5 жыл бұрын
Да, если что, исходники есть под каждым видео в описании... теперь
@vitaliy204
@vitaliy204 3 жыл бұрын
Молодець гарно зроблено, підписався провсяк випадок. Звісно є косяки, але блін я ні в кого не бачив таких зрозумілих уроків для новачків як в тебе. Жаль що коли я вчився такого не було. Якщо що відгук від дядька, що займається цим професійно.
@liliansirbu840
@liliansirbu840 2 жыл бұрын
запишите пожалуста по больше видео на АЦП в разных режимов под CMSIS, как ДМА, много каналов, итд. пасиб.
@mikitashary5552
@mikitashary5552 5 жыл бұрын
На вашей платке должна быть микросхема cs43l22, можете показать как ее инициализировать, настраивать и пользовать на cmsis?)
@donrumata5299
@donrumata5299 5 жыл бұрын
Это, конечно, всё хорошо, но пока я рассказываю про самые простые периферии контроллера, а для этой микросхемы нужны I2C и I2S Это ещё не скоро...
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
C ацп всё получилось даже с индуцырованным каналом.А вот в прерывании индуцированного канала только после ресета получаются преобразования?.Изучаю DMA. По ДМА еслиб были уроки.
@donrumata5299
@donrumata5299 4 жыл бұрын
С ДМА + АЦП где-то у меня были приеры...
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
@@donrumata5299 Да я сейчас сам принцип работы ДМА только изучаю.И почему в прерывании ДМА ничего не пишется.?Если можете показать пример покажите.Для STM32f1 там каналы.Для STM32f4 и выше стримы?
@donrumata5299
@donrumata5299 4 жыл бұрын
@@ivanrusev2270 Ну.. Одно другому не мешает. Там есть Два DMA, у каждого, кажется, 8 потоков (steam`ов). Причём каждый настраивается отдельно. И настравивается на один из нескольких каналов, кажется, тоже 8-и.
@donrumata5299
@donrumata5299 4 жыл бұрын
@@ivanrusev2270 Пример сейчас на ГитХаб выложу.
@donrumata5299
@donrumata5299 4 жыл бұрын
@@ivanrusev2270 Если ещё надо, то вот он на гитхабе, там и другие уроки тоже есть github.com/donRumata03/STM32F4-CMSIS-lessons/tree/master/Future/ADC_DMA
@igornaumenko7432
@igornaumenko7432 8 ай бұрын
Для регулярних каналів можна використати DMA і кожен PIN буде складати данні в конкретне місце. ADC можна запускати навіть по таймеру що допоможе синхронізувати данні щей по часу.
@donrumata5299
@donrumata5299 8 ай бұрын
Ага, помню такое, спасибо за замечание. Тут видео чисто для демонстрации ADC, для DMA уже думать надо :)
@BasekeTV
@BasekeTV 5 жыл бұрын
Привет, мой юный друг! Меня зовут Берекет! Учусь я в Китае. Меня жутко интересует программирование ٍмикроконтроллеров STM32. Мне нужно быстро освоить это дело и найти стажировку в этой области. Смотрю и рунет и зарубежные сайты. Популярных курсов найти не легко, многие начатые да не завершенные. Зато уроков по ардуино НАВАЛОМ. Вы советуете курсы по STMке Nordic Energy? Дайте советы пожалуйста. Спасибо!
@donrumata5299
@donrumata5299 5 жыл бұрын
Ох Интересно Прошу заметить, что он снимает курсы по другому микроконтроллеру того же семейства. (STM32F1). Nordic Energy хорош тем, что записывает уроки на CMSIS, что мне определённо импонирует. Другим - не уверен. Мой курс уникален тем, что рассматривается CMSIS на STM32F4. Если контроллер уже куплен, то одно дело, если нет, то для начала можно выбрать STM32F1
@BasekeTV
@BasekeTV 5 жыл бұрын
don Rumata спасибо. Еще не купил, но собираюсь. Спасибо за информацию!
@donrumata5299
@donrumata5299 5 жыл бұрын
Всё для подписчиков)
@СуНаиль
@СуНаиль 5 жыл бұрын
@@donrumata5299 Sappise еще хорошие уроки делал, но забил и бросил. CMSIS хорошая штука, но все эти операции с регистрами такой геморрой. Для понимания работы в любом случае нужно. А Nordic Energy реально хорош и занимается силовой техникой и ЧП. Кстати, Vladimir Medintsev хорошие уроки выкладывает, но без кода. Есть что интересного по регуляторам.
@donrumata5299
@donrumata5299 5 жыл бұрын
@@СуНаиль Но тут, правда, такое дело. Я записываю уроки (хотя смотрел Sappise), именно потому что они не на CMSIS :)
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
Да и ещё инжекторный канал в прерывании работает странно после ресета считывается информация.Если настраиваю в цикле нормально
@donrumata5299
@donrumata5299 4 жыл бұрын
А нужны ли Вам прерывания для инжектированных? В том их и суть, что,, скорее всего, не нужны
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
@@donrumata5299 Так что это их работа в прерываниях? В Кубе тоже самое что на cmsis или же есть какой то бит который не знаю?
@donrumata5299
@donrumata5299 4 жыл бұрын
Прерывания не нужны, так как в любой момент, когда потребуется информация о значении АЦП, можно его получить просто обращением в регистр
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
Я имею ввиду не в прерывании.
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
а как настроить несколько выводов одного ацп? На авр проще?
@donrumata5299
@donrumata5299 4 жыл бұрын
"""Все парни хотят только одного и это просто отвратительно"""... Видимо, не выводов, а вводов. Ну, собственно, если рассматривать регулярные каналы, то нужно действовать ровно так, как я и показал, только обобщить на случай нескольких каналов, то есть ввести кол-во каналов равное не 1, а 2м например и ввести список каналов в соответствующее место.
@donrumata5299
@donrumata5299 4 жыл бұрын
На авр, честно говоря, не знаю. Там вообще можно?
@donrumata5299
@donrumata5299 4 жыл бұрын
Просто если я правильно понимаю, от на авр АЦП просто жёстко привязан к выводу..
@donrumata5299
@donrumata5299 4 жыл бұрын
То есть как бы проще, да но)))
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
@@donrumata5299 На АВР есть муксы создаётся функция которая производит включение этих муксов с промежутком некоторого времени 10 микросекунд .Настройка Ацп у стм по другому .А меня волнует организация вывода информации? Если можете подскажите.
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
часть кода пропущено
@donrumata5299
@donrumata5299 5 жыл бұрын
Всё исходники на гитхабе и они работают
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@donrumata5299 я не знаю у меня ваш код не работает ни в ацп ни в таймере.Но в прерывании по кнопке работает.Этот код работает таймера в микросхеме stm32 f103c8
@donrumata5299
@donrumata5299 5 жыл бұрын
@@ivanrusev2270 Что я точно могу сказать, так это то, что я тестил этот код прямо перед загрузкой на отладочной плате STM32F4-DISCOVERY, причём проект в репозитории кейловский. Так что отличия, то есть Вашу ошибку надо искать либо в плате, либо в отличии кейла от AtolicStudio
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@donrumata5299 я заказал 2 платы такую же только друого производителя и другой процессор cortexm4
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@donrumata5299 STM32F4-DISCOVERY, а в чём отличие дискавери.В Кейле тоже самое.
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
я запустил таймером в прерывании инжекторный канал заработало.
@donrumata5299
@donrumata5299 4 жыл бұрын
Поздравляю!
@ivanrusev2270
@ivanrusev2270 4 жыл бұрын
@@donrumata5299 Спасибо мне до вас далеко. Я сам учусь но вам спасибо.2014 году до 24 декабря понятие не имел о программирование контроллеров.
@tiMer23
@tiMer23 4 жыл бұрын
Чувак, ты жив? Когда уроки?))
@donrumata5299
@donrumata5299 4 жыл бұрын
В целом - жив, но со временем беда... Когда оно появится, будут интересные уроки)
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
Может и все уроки тоже самое неправильная инфа
@donrumata5299
@donrumata5299 5 жыл бұрын
Было бы не правильно, ничего бы не работало
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@donrumata5299 с таймером та же история
@donrumata5299
@donrumata5299 5 жыл бұрын
Я имею в виду, ничего бы не работало у меня. Я запускаю этот код. АЦП выводит верные числа, таймер - тоже работает Проверьте свой код, название контроллера и т.д.
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@donrumata5299 Код я вам показал два кода .А таймер не работает в этом же контроллере.Проверял регистры на stm32103c8 работает.А на stm32f407ve не работает.Режим internal clock.Посмотрите вы код?
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
не работает
@donrumata5299
@donrumata5299 5 жыл бұрын
А почему у меня работает? Проверьте
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@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) { } } Может когда первый раз прошивал перемычек не было .И что то нарушил
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@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 проект с нуля пишу.
@donrumata5299
@donrumata5299 5 жыл бұрын
Если контроллер серии f1, то там просто другие названия регистров, не удивительно, что не работает
@ivanrusev2270
@ivanrusev2270 5 жыл бұрын
@@donrumata5299 в ADC да а вот таймера всё одинаково только кол-во другое .Регистры на таймерах одинаковые биты один к одному я сверялся не один час.У меня может быть проблема с платой.Я первый раз прошивал без перемычек BOOT0 BOOT1. ВЫ можете посмотреть программу код мой?
@sherstobitov14
@sherstobitov14 2 жыл бұрын
Прежде чем выкладывать свои видео уроки. Вы их смотрели перед публикацией ? У вас окна не переключаются, соответственно что вы делаете в основном не понятно.
@donrumata5299
@donrumata5299 2 жыл бұрын
Угу, есть в середине такая проблема, но в целом код выложен, и в конце IDE нормально видно…
黑天使只对C罗有感觉#short #angel #clown
00:39
Super Beauty team
Рет қаралды 33 МЛН
To Brawl AND BEYOND!
00:51
Brawl Stars
Рет қаралды 16 МЛН
How Windows Explorer works and how there’s NO POINT in replacing it
13:42
ЧТО СКРЫВАЮТ РАДИОВОЛНЫ?
16:47
Xfyozz
Рет қаралды 275 М.
Программисты-самоучки... Слушайте внимательно.
22:45
Евгений Афанасьев
Рет қаралды 142 М.
Как Лиза Су спасла AMD
18:03
House of NHTi
Рет қаралды 109 М.