Всем доброго времени суток!
По необходимости перешел на макетку китайскую STM32F407VET с общепризнанной STM32F103C8T6. Понадобилась Triple mode ADC1…3.
Работаю на IDE 1.8.19 с ядром Кларка, обновляю вручную по ссылке -
последнее обновление от сентября 2023.
На плате STM32F103C8T6 весь мой код на этом ядре компилится и отлично работает. Для управления периферией использую объекты созданные в библиотеке Кларка.
Вот для примера привожу код работы с таймером, который для разных плат выбираемых в IDE “Generic STM32F103C series” и “Generic STM32F407V series” компилится без ошибок, но на STM32F103 он работает и на нужном пине я вижу меандр, а на STM32F407V тишина.
#define STM32F103C 0 // 0 = STM32F407V
#if (STM32F103C)
#define pinOut PA7 // свободный остался после подключение LCD2004
#else
#define pinOut PA4
#endif
void setup()
{
pinMode(pinOut, OUTPUT);
Timer2.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE); // устанавливаем режим работы канала 1 на сравнение
Timer2.pause(); // останавливаем таймер перед настройкой
#if (STM32F103C)
Timer2.setPrescaleFactor(720); // устанавливаем делитель === F = 72 000 000 / 720 = 100 000 Hz
#else
Timer2.setPrescaleFactor(840);
#endif
Timer2.setOverflow(1000); // переполнение \ считать в таймере до установленного числа и обнулить === F = 100 000 / 1000 = 100 Hz - Период
Timer2.setCompare(TIMER_CH1, 200); // сравнение \ считать до числа сравнения и вызвать прерывание канала === F = 100 000 => 10 mkS * 200 = 2 mlS - Ширина импульса
Timer2.attachInterrupt(TIMER_UPDATE_INTERRUPT, func_UPDATE); // активируем прерывание
//Timer2.attachInterrupt(TIMER_CH1, func_COMP); // активируем прерывание через указание канала
Timer2.attachInterrupt(TIMER_CC1_INTERRUPT, func_COMP); // можно также активировать через общую переменную прерывания TIMER_CC1...4
Timer2.refresh(); // обнулить таймер
Timer2.resume(); // запускаем таймер
}
void loop() { }
void func_UPDATE() // обработчик прерывания на переполнение
{
digitalWrite(pinOut, HIGH);
}
void func_COMP() // обработчик прерывания на сравненеи
{
digitalWrite(pinOut, LOW); //
}
Думал плата эта кривая китайская STM32F407V, но к счастью управление через регистры прекрасно работает и на этой плате. Меандр появляется на нужном пине и на этой плате.
#define STM32F103C 0 // 0 = STM32F407V
#if (STM32F103C)
#define pinOut PA7 // свободный остался после подключение LCD2004
#else
#define pinOut PA4
#endif
void setup() {
pinMode(pinOut, OUTPUT);
timer_attach_interrupt(TIMER2, TIMER_UPDATE_INTERRUPT, led1); // прерывание по переполнению
timer_attach_interrupt(TIMER2, TIMER_CC1_INTERRUPT, led); // прерывание по сравнению 1
#if (STM32F103C)
RCC_BASE->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2EN > включить тактирование tim_2 \ можно убрать это , Арду сама уже запустила все таймеры
#else
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // TIM2EN > включить тактирование tim_2
#endif
TIMER2_BASE->CR1 &= ~TIMER_CR1_CEN; // TIMx_CR1_CEN > стоп таймер
#if (STM32F103C)
TIMER2_BASE->PSC = 720-1; // TIMx_PSC > значение пред делителя -1 === F = 72 000 000 / 720 = 100000 Hz
#else
TIMER2_BASE->PSC = 840-1; // на STM32F407V шина APB1ENR работает на половине системной частоты 168МГц/2=84МГц
// TIMx_PSC > значение пред делителя -1 === F = 84 000 000 / 840 = 100000 Hz
#endif
TIMER2_BASE->ARR = 100-1; // TIMx_ARR > считать до установленного числа и обнулить === F = 100000 / 100 = 1 kHz | T = 1 mls
TIMER2_BASE->CCR1 = 25-1; // TIMx_CCR1 > регистр сравнения канала 1 === F = 100000 / 25 = 4 kHz | T = 0.25 mls ширина импульса
TIMER2_BASE->DIER |= TIMER_DIER_UIE; // TIMx_DIER_UIE > разрешить прерывание по переполнению
TIMER2_BASE->DIER |= TIMER_DIER_CC1IE; // TIMx_DIER_CC1IE > разрешить прерывание по сравнению 1
TIMER2_BASE->CR1 |= TIMER_CR1_CEN; // TIMx_CR1_CEN > старт таймер
}
void loop() {
}
void led1(){
digitalWrite(pinOut, HIGH);
TIMER2_BASE->SR &=~ TIMER_SR_UIF; // TIMx_SR_UIF > сбрасываем флаг прерывания
}
void led(){ //обработчик прерывания
digitalWrite(pinOut, LOW);
TIMER2_BASE->SR &=~ TIMER_SR_UIF; // TIMx_SR_UIF > сбрасываем флаг прерывания
}
Сталкивался кто с такой проблемой управления через объекты на STM32 именно серии STM32F4xx?
Конечно можно переделать весь свой проект на управление через регистры, но МК F407 немного отличается от F103 по регистрам и особенно в ADC и DMA , где у меня основной функционал. Надо будет углубляться в мануал (((