Суббота, 07.12.2024, 20:48
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | ARM STM32 F4 с чего начать? - Страница 5 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
ARM STM32 F4 с чего начать?
uwrteyДата: Четверг, 15.05.2014, 22:55 | Сообщение # 61
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
ок. Понял. щас попробую....

Добавлено (14.05.2014, 20:58)
---------------------------------------------
проверил, не помогло

Добавлено (15.05.2014, 22:55)
---------------------------------------------
Ура! Я запустил ШИМ на СТМ32Ф4
код

Код

// буду учиться делать шим для сервы...

// на плате дискавери будет интересно наблюдать за разной яркостью свечения светодиодов
// *** тим_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>

int main(void)
{

//***************************************************************************************************
//***************************************************************************************************
// включаем тактирования

// включаем тактирование порта

// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
RCC->AHB1ENR |= 0b00000000000000000000000000001000;

//---------------------------------------------------------------------------------------------------

// включаем тактирование таймера_4

// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)
// RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
RCC->APB1ENR |= 0b00000000000000000000000000000100;

//***************************************************************************************************
//***************************************************************************************************
// Настраиваем порты

GPIOD->MODER = 0b10101010000000000000000000000000;  // альтернативная функция на 15,14,13,12 пинах ( передаем управление ножками альтернативной функции )
GPIOD->OTYPER = 0b00000000000000000000000000000000;  // Двухтактный выход на 15,14,13,12 пинах
GPIOD->OSPEEDR = 0b11111111000000000000000000000000;  // Скорость высокая на 15,14,13,12 пинах
GPIOD->PUPDR = 0b00000000000000000000000000000000;  // Без подтяжки

// включаем альтернативную функцию

//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;    // включаем каналы таймера как выходы ( подключаем каналы таймера к ножкам )

//---------------------------------------------------------------------------------------------------

// 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 = 24000 - 1;
// TIM4->PSC = 0b0101110110111111;  // предделитель частоты таймера 24000-1

//---------------------------------------------------------------------------------------------------

// TIM4->CNT = 0b0000000000000000;    // регистр сравнения таймера... -> обнуляем таймер

//---------------------------------------------------------------------------------------------------

// TIM4->ARR = 0b1111111111111111;  // число до которого тикает таймер ( частота ШИМа ) - по умолчанию тикает до FFFF

//---------------------------------------------------------------------------------------------------

// TIM4->CR1 |= TIM_CR1_CEN;
TIM4->CR1 |= 0b0000000000000001;    // пуск таймера ( таймер начал считать )

//---------------------------------------------------------------------------------------------------

TIM4->CCR1 = 0b0001000000000000;    // первый канал ШИМа - длина импульса
TIM4->CCR2 = 0b0011111111111111;    // второй канал ШИМа - длина импульса
TIM4->CCR3 = 0b0111111111111111;    // третий канал ШИМа - длина импульса
TIM4->CCR4 = 0b1111111111111111;    // четвертый канал ШИМа - длина импульса

//---------------------------------------------------------------------------------------------------
}



не успеваю за своими мыслями......
 
uwrteyДата: Пятница, 16.05.2014, 22:14 | Сообщение # 62
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Как мне узнать на какой частоте работает таймер, при условии, что не установлен предделитель таймера и установлен кварц на 8 МГц ?
Куда нужно смотреть ?


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Пятница, 16.05.2014, 22:14
 
ВитГоДата: Пятница, 16.05.2014, 22:15 | Сообщение # 63
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
нужно смотреть на схему тактирования.. что за таймер на чем сидит, какие делители/множители перед ним...

Виталий (аka ВитГо)
 
uwrteyДата: Четверг, 05.06.2014, 17:52 | Сообщение # 64
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
раздел reset and clock control - в справочном руководстве?
пойду сюда, почитаю...

Добавлено (04.06.2014, 22:49)
---------------------------------------------
че то я забросил это дело... Надо заняться..

Добавлено (05.06.2014, 17:52)
---------------------------------------------
Про тактирование я так ни чего и не понял. Как то сложно тут организовано.
Я так понимаю МК заводится на внутреннем генераторе = 8 МГц, потом переключается на внешний источник - в данном случае кварцевый резонатор = 8 МГц. А дальше танцы с бубном.. Не пойму как тактируется таймер - куда смотреть то?
Как я понял из статьи ДиХальта практически все блоки микроконтроллера затактовываются от линии SYSCLK...
На блок схеме на линии SYSCLK 72 МГц. От куда там столько? Там всегда такая частота? Или эта частота задается умножением частоты с кварца?

Далее идет предделитель ( AHB Prescaler ) потом еще один предделитель ( APB1 Prescaler )
каким из них я управляю командой TIM4->PSC ?

В общем в голове каша пока... sad


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Суббота, 17.05.2014, 00:59
 
ВитГоДата: Четверг, 05.06.2014, 21:29 | Сообщение # 65
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
попробуй с этого генератора, там видно что после чего идет и чем включается...

правда это для f10x контроллеров, но после того как поймешь в f4xx разбираться проще...

для f4 у st.com есть экселевский файлик конфигурации.. тоже все очень наглядно...
Прикрепления: STM32generator.zip (425.6 Kb)


Виталий (аka ВитГо)
 
uwrteyДата: Пятница, 06.06.2014, 01:00 | Сообщение # 66
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Прикольная штуковина! Спасибо!

Осталось понять куда нужно сунуть сгенерированный код... ( где лежит код по дефолту ? )


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Пятница, 06.06.2014, 01:20
 
ВитГоДата: Пятница, 06.06.2014, 06:31 | Сообщение # 67
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
а фиг его знает, я обычно пользуюсь настроечным файлом coocox... эта схема нужна лишь по началу - для понимания процесса вообще..
а потом просто вызываешь инициализацию и все...


Виталий (аka ВитГо)
 
uwrteyДата: Пятница, 06.06.2014, 07:58 | Сообщение # 68
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Это что за файл такой? Я просто так и не смог понять какие настройки тактирования по умолчанию задает кокос.

не успеваю за своими мыслями......
 
ВитГоДата: Пятница, 06.06.2014, 09:17 | Сообщение # 69
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата uwrtey ()
Это что за файл такой? Я просто так и не смог понять какие настройки тактирования по умолчанию задает кокос.


писал же раньше: STM32: Настройка тактирования контроллера в среде CooCox


Виталий (аka ВитГо)
 
uwrteyДата: Пятница, 06.06.2014, 10:09 | Сообщение # 70
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
shy ой, точно же... Видел краем глаза..

не успеваю за своими мыслями......
 
ВитГоДата: Пятница, 06.06.2014, 19:03 | Сообщение # 71
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
там в конфиге и формула есть по которой sysclk рассчитывается

Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 07.06.2014, 00:43 | Сообщение # 72
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Формулу я не нашел ( если честно не особо то и искал )

Статья хорошая. Вроде разобрался.
Написал код, который должен сервой шевелить. Днем буду пробовать серву подключать...

Появилось несколько вопросов:

1) Если я правильно понял из вышеупомянутой статьи, то в system_stm32f4xx.c изменяем параметр делителя ( AHB Preskaler ) командой #define PLL_M 8 ( или речь про какой-то другой делитель? )
Но тут что-то не сходится... Я ведь изменяю параметр PLL_M, который вроде за умножение отвечает !?, а AHB Preskaler - это уже другой параметр??? Тут что-то туплю...

2) Как МК узнает от какого источника тактового сигнала нужно тактироваться ( где и как настраивается это параметр? )

3) Предделитель таймера ( TIM4->PSC ) это и есть APB_Prescaler ? Или я опять туплю ?
wacko


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Суббота, 07.06.2014, 01:00
 
ВитГоДата: Суббота, 07.06.2014, 03:00 | Сообщение # 73
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
гм, формула сразу после PLL Parameters



по первому вопросу:
смотри даташит по тактированию, это RM0090, Reference manual на контроллер, раздел 5. Reset and clock control (RCC), подраздел 5.2 Clock...
частота идет следующим образом (смотри внимательно, немного неудачно я цвета выбрал..)


сначала частоту внешнего кварца ты делишь, потом получившуюся частоту подаешь на умножитель, после которого опять делишь :-)

получается что частоту 8 мгц делишь на 8 (это делитель PLL_M), получаешь 1 мгц..

потом умножителем увеличиваешь частоту до 336 мгц (умножаешь на 336 - это параметр PLL_N)

потом делишь на 2 (параметр PLL_P) и получаешь sysclk в 168 мгц..

при этом для USB нужна частота 48 мгц - а она получается путем деления 336 мгц на 7 (параметр PLL_Q)

все параметры PLL_x - это параметры блока умножителя...

после умножителя частота идет на переключатель, на котором можно выбрать источник частоты (в нашем случае источник PLL (умножитель)), и потом попадает на AHB Preskaler это делитель для получения частоты на шинах AHB/APB (смотри на картинку!!):
AHB 168 мгц (это исходная частота PLLCLK)
APB1 делитель 4 - 42 мгц
APB2 делитель 2 - 84 мгц

дальше идем в файл stm32f4xx.h и находим что сидит:

на шинах AHBx (такт как написано выше sysclk, в нашем случае 168 мгц):
Код
/*!< AHB1 peripherals */
#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)
#define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400)
#define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800)
#define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00)
#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000)
#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)
#define GPIOG_BASE            (AHB1PERIPH_BASE + 0x1800)
#define GPIOH_BASE            (AHB1PERIPH_BASE + 0x1C00)
#define GPIOI_BASE            (AHB1PERIPH_BASE + 0x2000)
#define CRC_BASE              (AHB1PERIPH_BASE + 0x3000)
#define RCC_BASE              (AHB1PERIPH_BASE + 0x3800)
#define FLASH_R_BASE          (AHB1PERIPH_BASE + 0x3C00)
#define DMA1_BASE             (AHB1PERIPH_BASE + 0x6000)
#define DMA1_Stream0_BASE     (DMA1_BASE + 0x010)
#define DMA1_Stream1_BASE     (DMA1_BASE + 0x028)
#define DMA1_Stream2_BASE     (DMA1_BASE + 0x040)
#define DMA1_Stream3_BASE     (DMA1_BASE + 0x058)
#define DMA1_Stream4_BASE     (DMA1_BASE + 0x070)
#define DMA1_Stream5_BASE     (DMA1_BASE + 0x088)
#define DMA1_Stream6_BASE     (DMA1_BASE + 0x0A0)
#define DMA1_Stream7_BASE     (DMA1_BASE + 0x0B8)
#define DMA2_BASE             (AHB1PERIPH_BASE + 0x6400)
#define DMA2_Stream0_BASE     (DMA2_BASE + 0x010)
#define DMA2_Stream1_BASE     (DMA2_BASE + 0x028)
#define DMA2_Stream2_BASE     (DMA2_BASE + 0x040)
#define DMA2_Stream3_BASE     (DMA2_BASE + 0x058)
#define DMA2_Stream4_BASE     (DMA2_BASE + 0x070)
#define DMA2_Stream5_BASE     (DMA2_BASE + 0x088)
#define DMA2_Stream6_BASE     (DMA2_BASE + 0x0A0)
#define DMA2_Stream7_BASE     (DMA2_BASE + 0x0B8)
#define ETH_BASE              (AHB1PERIPH_BASE + 0x8000)
#define ETH_MAC_BASE          (ETH_BASE)
#define ETH_MMC_BASE          (ETH_BASE + 0x0100)
#define ETH_PTP_BASE          (ETH_BASE + 0x0700)
#define ETH_DMA_BASE          (ETH_BASE + 0x1000)

/*!< AHB2 peripherals */
#define DCMI_BASE             (AHB2PERIPH_BASE + 0x50000)
#define CRYP_BASE             (AHB2PERIPH_BASE + 0x60000)
#define HASH_BASE             (AHB2PERIPH_BASE + 0x60400)
#define RNG_BASE              (AHB2PERIPH_BASE + 0x60800)


на APB1 (такт sysclk/4 или 42 мгц):
Код
/*!< APB1 peripherals */
#define TIM2_BASE             (APB1PERIPH_BASE + 0x0000)
#define TIM3_BASE             (APB1PERIPH_BASE + 0x0400)
#define TIM4_BASE             (APB1PERIPH_BASE + 0x0800)
#define TIM5_BASE             (APB1PERIPH_BASE + 0x0C00)
#define TIM6_BASE             (APB1PERIPH_BASE + 0x1000)
#define TIM7_BASE             (APB1PERIPH_BASE + 0x1400)
#define TIM12_BASE            (APB1PERIPH_BASE + 0x1800)
#define TIM13_BASE            (APB1PERIPH_BASE + 0x1C00)
#define TIM14_BASE            (APB1PERIPH_BASE + 0x2000)
#define RTC_BASE              (APB1PERIPH_BASE + 0x2800)
#define WWDG_BASE             (APB1PERIPH_BASE + 0x2C00)
#define IWDG_BASE             (APB1PERIPH_BASE + 0x3000)
#define I2S2ext_BASE          (APB1PERIPH_BASE + 0x3400)
#define SPI2_BASE             (APB1PERIPH_BASE + 0x3800)
#define SPI3_BASE             (APB1PERIPH_BASE + 0x3C00)
#define I2S3ext_BASE          (APB1PERIPH_BASE + 0x4000)
#define USART2_BASE           (APB1PERIPH_BASE + 0x4400)
#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)
#define UART4_BASE            (APB1PERIPH_BASE + 0x4C00)
#define UART5_BASE            (APB1PERIPH_BASE + 0x5000)
#define I2C1_BASE             (APB1PERIPH_BASE + 0x5400)
#define I2C2_BASE             (APB1PERIPH_BASE + 0x5800)
#define I2C3_BASE             (APB1PERIPH_BASE + 0x5C00)
#define CAN1_BASE             (APB1PERIPH_BASE + 0x6400)
#define CAN2_BASE             (APB1PERIPH_BASE + 0x6800)
#define PWR_BASE              (APB1PERIPH_BASE + 0x7000)
#define DAC_BASE              (APB1PERIPH_BASE + 0x7400)


и на шине APB2 (такт sysclk/2 или 84 мгц):
Код
/*!< APB2 peripherals */
#define TIM1_BASE             (APB2PERIPH_BASE + 0x0000)
#define TIM8_BASE             (APB2PERIPH_BASE + 0x0400)
#define USART1_BASE           (APB2PERIPH_BASE + 0x1000)
#define USART6_BASE           (APB2PERIPH_BASE + 0x1400)
#define ADC1_BASE             (APB2PERIPH_BASE + 0x2000)
#define ADC2_BASE             (APB2PERIPH_BASE + 0x2100)
#define ADC3_BASE             (APB2PERIPH_BASE + 0x2200)
#define ADC_BASE              (APB2PERIPH_BASE + 0x2300)
#define SDIO_BASE             (APB2PERIPH_BASE + 0x2C00)
#define SPI1_BASE             (APB2PERIPH_BASE + 0x3000)
#define SYSCFG_BASE           (APB2PERIPH_BASE + 0x3800)
#define EXTI_BASE             (APB2PERIPH_BASE + 0x3C00)
#define TIM9_BASE             (APB2PERIPH_BASE + 0x4000)
#define TIM10_BASE            (APB2PERIPH_BASE + 0x4400)
#define TIM11_BASE            (APB2PERIPH_BASE + 0x4800)


Виталий (аka ВитГо)
 
ВитГоДата: Суббота, 07.06.2014, 03:29 | Сообщение # 74
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата uwrtey ()
2) Как МК узнает от какого источника тактового сигнала нужно тактироваться ( где и как настраивается это параметр? )


а вот это как раз файл system_stm32f4xx.c
ты вызываешь вначале программы его процедуру SystemInit(); (кстати ты помнишь о том что нужно вызывать SystemInit() прямо в начале процедуры main() ? )


обещанная процедура SetSysClock() так же проста как слеза, и настраивает все по схеме которую я рисовал в прошлом сообщении


вот кратенько так это и происходит..

если не заморачиваться то можно просто задать значение делителя частоты PLL_M таким чтобы на выходе был 1 мгц и вызвать SystemInit() для настройки тактирования...

если заморачиваться (и подогнать делители/множители) то можно разогнать проц.. я гнал до 240 мгц с сохранением работы USB :-) но это пожалуй позже..

p.s. как вспомню i8080 c его 2 мгц такта или z80 с тактом в 3.5 мгц..... эххх.. а сейчас 168 мгц такта, и еще мало, biggrin , разгоняем до 240 мгц wacko


Виталий (аka ВитГо)
 
ВитГоДата: Суббота, 07.06.2014, 03:33 | Сообщение # 75
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата uwrtey ()
3) Предделитель таймера ( TIM4->PSC ) это и есть APB_Prescaler ? Или я опять туплю ?


нет, предделитель таймера это предделитель таймера :-) смотреть раздел 14. General-purpose timers (TIM2 to TIM5) в Reference manual (RM0090)

шина на которой сидит таймер - APB1 (смотреть в stm32f4xx.h) - эта шина имеет такт 42 мгц - вот с ней и работает предделитель.
Следовательно если предделитель таймера будет равен 1 - то 42 мгц это максимальная частота тактирующая таймер.

уффф.. и про тактирование это еще не все.. как видишь на схеме из сообщений выше - еще есть куча модулей которые тактируются той или иной частотой..
например сигналы MCOx - на них можно отдавать частоту с разных источников (HSE, HSI, LSE, PLL) и еще предварительно ее можно делить прескалером от 1 до 5.. я таким образом достаю частоту в 84 мгц из микроконтроллера для работы АЦП..


Виталий (аka ВитГо)
 
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz