ARM STM32 F4 с чего начать?
| |
uwrtey | Дата: Суббота, 07.06.2014, 23:58 | Сообщение # 76 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Ух... Разжевал - СПАСИБО Большущее! ( А я и внимания не обратил что STM32F4 и STM32F10xxxx разные ) мало того что не понял, да еще и запутал сам себя....
да, AVR и рядом с STM32 не стоял....
А еще мне очень нравится, что система тактирования ОЧЕНЬ гибкая... Тот-же таймер может использовать предделитель с любым значением ( от 1 до 65'535 )
полезности: http://www.st.com/st-web-....457.pdf http://www.diary.ru/~teplofizik/p188402343.htm
экселевский файлик ни как не прикрепляется - по этому - вот просто ссылка https://code.google.com/p....?r=1289
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 08.06.2014, 01:18 |
|
| |
ВитГо | Дата: Воскресенье, 08.06.2014, 05:24 | Сообщение # 77 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну да, с тактированием помудрили конкретно.. все таки в stm32 много периферии, поэтому и тактов нужно много и разных..
f1 и f4 отличаются сильно, поэтому перепрыгивать с одного семейства на другое достаточно трудно... опять таки используя SPL удается немного упростить задачу, но все равно нужно тщательно все смотреть, поэтому я пока программирую только f4
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 08.06.2014, 14:41 | Сообщение # 78 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| На f4 мало примеров в сети. На том-же f1 их намного больше. Я зачастую смотрю примеры именно на f1 ( тот же ДиХальт ), а потом в своем мозгу забываю, что F1 отличается от F4 и начинаю жутко тупить...
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 08.06.2014, 18:31 | Сообщение # 79 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| 1) смотри в сторону SPL 2) в поиске когда забиваешь вопрос сразу пиши дописку STM32F4 - сразу будешь получать нужные результаты...
вообще с SPL тебе просто разобраться нужно... эта библиотека очень облегчает написание программ.. в конце концов когда задача работает можно и переписать SPL вызовы на прямую запись в порты.. но поверь, я это проходил, выигрыша особого нет... ни в скорости, ни в размерах программ..
выигрышь появляется когда на асме пишешь.. но асм на STM32 это нечто :-) да и нет ассемблера нормального.. одни затыки :-( большой проект в кокосе на асме не знаю как писать (я пробовал, замучался файлы линковать... не заточен кокос под асм).. да и ассемблер все таки для более простых контроллеров типа AVR эффективен..
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 08.06.2014, 18:53 | Сообщение # 80 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Хотел серву прикошачить к своему ШИМу - не работает и все.. Оказывается питается STM-ка от 3,3 вольт! Придется драйвер собирать...
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 08.06.2014, 19:14 | Сообщение # 81 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну да, для сервы может оказаться критичным напряжение... сделай повторитель на транзисторе... частота то смешная, любой подойдет
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 08.06.2014, 23:55 | Сообщение # 82 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Драйвер сделал из транзистора IRF540N Попробовал управлять им от 5 вольт - все нормально. Прилепил все это к STM32F4Discovery - и не работает... Либо напряжения в 3,3 вольта маловато, либо в коде ошибка...
Код // буду учиться делать шим для сервы...
// на плате дискавери будет интересно наблюдать за плавностью свечения светодиодов // *** тим_4 ченнел_1 ножка_59 зеленый светодиод порт "д"12 (PD12) // или тим_4 ченнел_2 ножка_60 оранжевый светодиод, порт "Д"13 (PD13) // или тим_4 ченнел_3 ножка_61 красный светодиод, порт"Д"14 (PD14) // или тим_4 ченнел_4 ножка_62 голубой светодиод, порт"Д"15 (PD15)
//*************************************************************************************************** //*************************************************************************************************** // Подключаем заголовки //***************************************************************************************************
#include <stm32f4xx.h> #include <stm32f4xx_gpio.h> #include <stm32f4xx_rcc.h> #include <stm32f4xx_tim.h> #include <stm32f4xx_exti.h> #include <misc.h> #include <stm32f4xx_syscfg.h>
#define HSE_VALUE ((unit32_t)8000) // кварц установлен на 8МГц
int main(void) {
SystemInit() ; //настройка тактирования
//*************************************************************************************************** //*************************************************************************************************** // включаем тактирования
// включаем тактирование порта
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; RCC->AHB1ENR |= 0b00000000000000000000000000001000; // (тактируется от 168 МГц)
//---------------------------------------------------------------------------------------------------
// включаем тактирование таймера_4
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE) // RCC->APB1ENR |= RCC_APB1ENR_TIM4EN; RCC->APB1ENR |= 0b00000000000000000000000000000100; // (тактируется от 42 МГц) //---------------------------------------------------------------------------------------------------
//*************************************************************************************************** //*************************************************************************************************** // Настраиваем порты
GPIOD->MODER = 0b10101010000000000000000000000000; // альтернативная функция на 15,14,13,12 пинах ( передаем управление ножками альтернативной функции ) GPIOD->OTYPER = 0b00000000000000000000000000000000; // Двухтактный выход на 15,14,13,12 пинах и на остальных GPIOD->OSPEEDR = 0b11111111000000000000000000000000; // Скорость высокая на 15,14,13,12 пинах GPIOD->PUPDR = 0b00000000000000000000000000000000; // Без подтяжки
// включаем альтернативную функцию // Номер альтернативной функции =2
//GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4); //GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4); //GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4); //GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4);
GPIOD->AFR[1] |= 0b00100010001000100000000000000000;
//*************************************************************************************************** //*************************************************************************************************** // Настраиваем таймер
// TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E); TIM4->CCER |= 0b0001000100010001; // каналы СС1, CC2, CC3 и CC4 настроены как выход, по этому устанавливая единицу мы подключаем их к соответствующей ножке МК //включаем каналы таймера как выходы ( подключаем их к ножкам )
//---------------------------------------------------------------------------------------------------
// TIM4->CCMR1|=(TIM_CCMR1_OC1M_0|TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_2|TIM_CCMR1_OC2M_0|TIM_CCMR1_OC2M_1|TIM_CCMR1_OC2M_2); // TIM4->CCMR2|=(TIM_CCMR2_OC3M_0|TIM_CCMR2_OC3M_1|TIM_CCMR2_OC3M_2|TIM_CCMR2_OC4M_0|TIM_CCMR2_OC4M_1|TIM_CCMR2_OC4M_2); TIM4->CCMR1 |= 0b0110000001100000; // прямой шим на 1 и 2 канале таймера TIM4->CCMR2 |= 0b0110000001100000; // прямой шим на 3 и 4 канале таймера
//---------------------------------------------------------------------------------------------------
TIM4->PSC = 42-1; // ( предделитель = 42 ) таймер работает на частоте 1 МГц // TIM4->PSC = 0b0000000000101001; // предделитель частоты таймера 42-1
//---------------------------------------------------------------------------------------------------
// TIM4->CNT = 0b0000000000000000; // регистр сравнения таймера... -> обнуляем таймер
//---------------------------------------------------------------------------------------------------
TIM4->ARR = 0b0100111000100000; // число до которого тикает таймер ( частота ШИМа ) - по умолчанию тикает до FFFF
// частота 42 МГц, // предделитель таймера = 42 - значит частота таймера = 1МГц ( периуд = 0,000001 сек ) // Частота ШИМа для сервопривода = 50 ГЦ ( периуд 0,02 сек ) значит таймер будет тикать 20000 раз ( 0x4E20 = 0b0100111000100000 )
//---------------------------------------------------------------------------------------------------
// TIM4->CR1 |= TIM_CR1_CEN; TIM4->CR1 |= 0b0000000000000001; // пуск таймера ( таймер начал считать )
//---------------------------------------------------------------------------------------------------
TIM4->CCR1 = 0b0000010111011100; // зеленый. первый канал ШИМа - длина импульса = среднее положение ( крайнее левое положение 0000001111101000 ) ( крайнее правое положение 0000011111010000 ) TIM4->CCR2 = 0b0000001111101000; // оранжевый. второй канал ШИМа - длина импульса TIM4->CCR3 = 0b0000011111010000; // красный. третий канал ШИМа - длина импульса TIM4->CCR4 = 0b0100111000100000; // голубой. четвертый канал ШИМа - длина импульса ( максимум 0b0100111000100000 )
//--------------------------------------------------------------------------------------------------- }
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Понедельник, 09.06.2014, 05:22 | Сообщение # 83 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| у тебя же был осциллограф из звуковой карты.. снимал осциллограммы сигналов ?
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Вторник, 10.06.2014, 01:18 | Сообщение # 84 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Осциллограф есть и по сей день. Но осциллограммы я не снимал - попробую сегодня вечером после работы это сделать. Я думаю, что если и есть ошибка, то она связана с неправильной частотой ШИМа или неправильной длиной импульса... А так-то ШИМ вполне работоспособный - я ведь без всяких проблем регулирую яркость светодиода....
Но все же я больше склоняюсь к тому что мой драйвер управления сервой сделан не правильно.. ( 3,3 вольта не достаточно для полного открытия полевика )
И еще: по идее резистор у такого транзистора должен находится в цепи стока, а не истока как на схеме, так как в таком случае он влияет на время закрытия транзистора!!!, но в таком случае управляющий сигнал нужно инвертировать... ( но в данном случае частота низкая и я пренебрег этим правилом )
Добавлено (09.06.2014, 23:02) --------------------------------------------- Странно на осциллограмме ( осциллограф с закрытым входом ) только включение и выключение.. Как будто я подключаю к источнику постоянного напряжения... Может частота высокая очень..
кстати, что ты мне по осциллографу скажешь ? http://vg.ucoz.ru/forum/19-252-1
Добавлено (10.06.2014, 01:18) --------------------------------------------- Я решил пойти другим путем ( хитрым ) На отладочной плате есть светодиоды, при чем на тех же ножках, которые я к серве подключаю, а значит я могу настроить таймер так что бы оценить мигание светодиодов. Я решил настроить ШИМ на частоту 1Гц с длительностью импульса 0,5 сек ( длительность паузы естественно такая же ) И на мое удивление за 5 реальных секунд я насчитываю 6-7 миганий... как так ?
настройки такие: Частота шины APB1 = 42 МГц Предделитель таймера = 4200 ( Значит частота таймера = 0,01 МГц ( 10 Кило Герц ) частота ШИМа = 1Гц - То-есть таймеру нужно тикнуть 10000 раз. гружу в ARR число 10000 (0x2710) а длительность импульса я указываю 0,5 секунды (0x1388)... Вроде все правильно - днем попрошу помощи в подсчете импульсов у жены...( возможно просчитался )
***
Кстати, а не инверсный ли ШИМ я задал? Код TIM4->CCMR1 |= 0b0110000001100000; // прямой шим на 1 и 2 канале таймера TIM4->CCMR2 |= 0b0110000001100000; // прямой шим на 3 и 4 канале таймера чем, в таком случае, управляет число загруженное в CCRn ( где n номер канала ) импульсом или паузой ? Ах, ну да... вопрос снят... Чем больше число - тем ярче светодиод - значит импульсом.. - все правильно - ШИМ = прямой!
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 01:23 |
|
| |
ВитГо | Дата: Вторник, 10.06.2014, 05:38 | Сообщение # 85 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| предделитель сделай 42 и получишь один тик таймера = 1 мкс
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Вторник, 10.06.2014, 21:59 | Сообщение # 86 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Ну когда я шим для сервы делал ( код выше ) именно так и сделал ( предделитель 42 ).. Я решил сделать мигание светодиода каждую секунду... По этому и сделал такое извращение...Добавлено (10.06.2014, 21:59) --------------------------------------------- Только-что посчитал количество миганий за 10 секунд - и оно равно 20, то-есть в два раза больше нужного. Разбираюсь....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 17:02 |
|
| |
uwrtey | Дата: Вторник, 10.06.2014, 22:25 | Сообщение # 87 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Вот в чем дело! Там еще какой-то умножитель есть Виталий, расскажи пожалуйста что за умножитель там такой?
******************************
П.С. 1) я заставил мигать светодиод каждую секунду. 2) шим для сервы так и не запустил... не пойму в чем дело..
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 23:30 |
|
| |
ВитГо | Дата: Вторник, 10.06.2014, 23:28 | Сообщение # 88 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| а светодиод с какими параметрами запустил ? (чтобы каждую секунду мигал)
нет вроде там больше никакого умножителя, смотри настройки таймера в RM0090 - там все описано....
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Вторник, 10.06.2014, 23:34 | Сообщение # 89 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| предделитель = 8400 ( получил частоту 0,01 МГц = 10000Гц ) число до которого тикает таймер = 10000 ( частота мигания 1 Гц ) длина импульса = 2500 ( 0,25 сек )
как нет умножителя ? а это что тогда? Там же написано: "Если AHB-предделитель равен единице, то умножитель равен единице, иначе умножитель равен двум" В моем случае AHB-прескалер не равен единице, и это значит, что умножитель равен двум...
О-о - я что-то начал понимать?
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 23:47 |
|
| |
ВитГо | Дата: Среда, 11.06.2014, 05:58 | Сообщение # 90 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ааа, ну значит так фиксированный множитель.. но настроек там нет...
Виталий (аka ВитГо)
|
|
| |
|