ARM STM32 F4 с чего начать?
| |
ВитГо | Дата: Понедельник, 10.03.2014, 07:29 | Сообщение # 46 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| по крайней мере я так делаю. сначала открываешь описание функции, потом смотришь описание параметров...
получается что многие вещи можно делать не особо поглядывая в описание битовых инструкций и регистров.. все делается практически по наитию.. единственно что нужно знать так это порядок инициализации и необходимые настройки (но это в любом случае нужно знать)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Понедельник, 10.03.2014, 07:43 | Сообщение # 47 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Угу, у меня сложность еще и в том, что СИ не знаю... Сейчас постараюсь уделить больше времени СИ...
По поводу настройки периферии: Ты пользуешься файлом stm32f4xx_dsp_stdperiph_lib_um.chm ??? Или Ты сразу лезешь в библиотеку и ищешь нужный файл с расширением .h ?
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Понедельник, 10.03.2014, 07:45 |
|
| |
ВитГо | Дата: Понедельник, 10.03.2014, 12:52 | Сообщение # 48 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| сразу смотри файлы периферии stm32f4xx_gpio.h и так далее.. а когда интересно станет что делает та или иная функция то stm32f4xx_gpio.c
ну си потихоньку осваивай, там больше всего мороки с форматом передачи данных.. всякие указатели, структуры и прочее - меня это всегда бьет по полной :-)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Среда, 12.03.2014, 15:47 | Сообщение # 49 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Сегодня разобрался с CMSIS. вот пример которым я включил светодиоды:
Код #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h"
int main(void) {
// включаем тактирование порта D
RCC->AHB1ENR |= 0b00000000000000000000000000001000; //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Настраиваем порты
GPIOD->MODER = 0b01010101000000000000000000000000; // направление - выход на 15,14,13,12 пинах GPIOD->OTYPER = 0b0000000000000000; // Двухтактный выход на 15,14,13,12 пинах GPIOD->OSPEEDR = 0b11111111000000000000000000000000; // Скорость самая высокая на 15,14,13,12 пинах GPIOD->PUPDR = 0b00000000000000000000000000000000; // Без подтяжки
GPIOD->ODR=0b1111000000000000; // выводим на светодиоды
}
Понял в чем была проблема раньше: Примеры, которые разбирали авторы, относятся к STM32F1xx. Написание CMSIS STM32F1xx и STM32F4xx несовместимо.
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Среда, 12.03.2014, 19:07 |
|
| |
uwrtey | Дата: Среда, 12.03.2014, 19:41 | Сообщение # 50 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Внимание вопрос: Как я должен узнать какой регистр за что отвечает? В справочном руководстве что-то не шибко расписано.
Например мне нужно включить тактирование порта D. Включается оно через регистр AHB1ENR. Открываем справочное руководство на странице 178. // 6.3.10 RCC AHB1 peripheral clock register (RCC_AHB1ENR) ( и еще эта же информация есть на странице 238. // 7.3.10 RCC AHB1 peripheral clock enable register (RCC_AHB1ENR) - в чем разница - не понял ) Тут мы видим таблицу. вот примечание к ней - Цитата Bit 3 GPIODEN: IO port D clock enable This bit is set and cleared by software. 0: IO port D clock disabled 1: IO port D clock enabled И все - больше ни слова! Хочется побольше про все это узнать.... ( например, как я должен был узнать, что тактирование в обще нужно включать? )
И второй вопрос - кто ни-будь встречал переведенное на Руский язык справочное руководство - RM0090 Reference manual ??? (STM32F405xx/07xx, STM32F415xx/17xx, STM32F42xxx and STM32F43xxx advanced ARM-based 32-bit MCUs)
PS на радиокоте подсказали полезную подсказку по языку СИ
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Пятница, 14.03.2014, 00:19 |
|
| |
uwrtey | Дата: Воскресенье, 04.05.2014, 23:18 | Сообщение # 51 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Виталий, подопни меня пожалуйста в направлении изучения STM.. А то что-то я все ни как не возьмусь.. Дай мне пожалуйста какое ни-будь задание, а я попробую его реализовать.. учебник я читаю, но без практического применения ни-фига не запоминаю... так хоть будет над чем тупить....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 04.05.2014, 23:18 |
|
| |
uwrtey | Дата: Вторник, 06.05.2014, 18:44 | Сообщение # 52 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| SPL это ад какой-то, в котором я горю.. Вот, кое-что нарыл Работа с STM32F10x Standard Peripherals Library http://easyelectronics.ru/rabota-....ry.html
Мне кажется что рано мне заниматься SPL .... Может стоит все понять на более низком уровне ( нет, нет я не про асму... - это будет через чур низко )
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 06.05.2014, 18:52 |
|
| |
ВитГо | Дата: Вторник, 06.05.2014, 19:11 | Сообщение # 53 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| просто ты еще не понял как это использовать !!
на самом деле все достаточно просто (конечно при наличии хотя бы примерного примера :-)))
но чаще всего нужно смотреть .h файл в котором описаны все типы и вызовы... начать с простого - с той же настройки портов ввода/вывода...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Вторник, 06.05.2014, 21:49 | Сообщение # 54 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| согласен, что код получается читабельнее вот пример, который просто включает светодиоды на отладочной плате SPL Код // Подключаем заголовки #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h"
// Функция программной задержки void Soft_Delay(volatile uint32_t number) { while(number--); }
int main(void) { // Следующая строка для нас пока что магическая RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Настраиваем порты GPIO_InitTypeDef ledinit; // создаем структуру
ledinit.GPIO_Mode = GPIO_Mode_OUT; // направление - выход ledinit.GPIO_OType = GPIO_OType_PP; // Двухтактный выход ledinit.GPIO_PuPd = GPIO_PuPd_NOPULL; // Без подтяжки ledinit.GPIO_Speed = GPIO_Speed_2MHz; // Скорость низкая ledinit.GPIO_Pin = (GPIO_Pin_13 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15); // Светодиод LD3 на 12, 13, 14 и 15-ом выводе
GPIO_Init(GPIOD, &ledinit); // Функция, выполняющая настройку портов
// Бесконечный цикл while(1) { // Включаем светодиоды GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); } }
CMSIS Код #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h"
int main(void) {
// включаем тактирование порта
RCC->AHB1ENR |= 0b00000000000000000000000000001000; //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Настраиваем порты
GPIOD->MODER = 0b01010101000000000000000000000000; // направление - выход на 15,14,13,12 пинах GPIOD->OTYPER = 0b0000000000000000; // Двухтактный выход на 15,14,13,12 пинах GPIOD->OSPEEDR = 0b11111111000000000000000000000000; // Скорость высокая на 15,14,13,12 пинах GPIOD->PUPDR = 0b00000000000000000000000000000000; // Без подтяжки
GPIOD->ODR=0b1111000000000000; // включаем светодиоды
}
Но в это-же время код SPL получается намного больше...
И мне не понятно написание кода для SPL Язык вроде тот-же, а понять че к чему я не могу...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 06.05.2014, 22:12 |
|
| |
Sergi | Дата: Вторник, 06.05.2014, 22:07 | Сообщение # 55 |
Подполковник
Группа: Проверенные
Сообщений: 540
Статус: Offline
| Возможно код больше от того что в С нет встроенного типа 0bxxxx. В CMSIS есть более читабельные формы как например GPIOA->CRL &=~GPIO_CRL_MODE0; GPIOA->CRL &=~GPIO_CRL_CNF0; что соответствуют даташиту и программануалу. А многие параметры стоят по умолчанию и код серьезно сокращается, но я стараюсь в инициализации прописать все регистры.
Сообщение отредактировал Sergi - Вторник, 06.05.2014, 22:07 |
|
| |
Sergi | Дата: Вторник, 06.05.2014, 22:17 | Сообщение # 56 |
Подполковник
Группа: Проверенные
Сообщений: 540
Статус: Offline
| Я сейчас делаю 3х канальный лабораторный блок питания с управлением на STM. Так там в основном ногодрыг без особых вычислений. Еще одна тренеровка создания проекта .
Сообщение отредактировал Sergi - Вторник, 06.05.2014, 22:19 |
|
| |
uwrtey | Дата: Вторник, 06.05.2014, 22:27 | Сообщение # 57 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| А еще меня убивают составные операции например |= во первых эта операция выполняется справа налево Во вторых бывают составные операции, которые выполняются слева направо ( например != или <= ) и нужно запомнить ( выучить ) что и как выполняется
--------------------------------------------- Цитата Sergi ( ) Я сейчас делаю 3х канальный лабораторный блок питания с управлением на STM. Так там в основном ногодрыг без особых вычислений. Еще одна тренеровка создания проекта biggrin . если проект открытый, то предлагаю создать тут соответствующую тему.
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Вторник, 06.05.2014, 22:27 |
|
| |
Sergi | Дата: Вторник, 06.05.2014, 22:32 | Сообщение # 58 |
Подполковник
Группа: Проверенные
Сообщений: 540
Статус: Offline
| Может попозже. Сейчас только силовая часть работает, как обычный блок питания. За управление только взялся, делаю плату.
|
|
| |
uwrtey | Дата: Среда, 14.05.2014, 19:07 | Сообщение # 59 |
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Статус: Offline
| Собрался изучать таймеры. Почитал статьи http://easystm32.ru/for-beginners/27-basic-timers и http://easystm32.ru/for-beginners/35-pwm-in-stm32 Вроде все понятно. На практике же оказалось, что ничего не понятно. Я не смог перевести полученные знания для своего МК. Пошел гуглить дальше: 0) простые таймеры http://how2.org.ua/микроко....ry.html
1) ШИМ http://how2.org.ua/микроко....rm.html 2) http://www.st.com/st-web-....534.pdf
Добавлено (14.05.2014, 19:07) --------------------------------------------- пытаюсь запустить ШИМ, но что то не очень пока выходит Код
// Подключаем заголовки
#include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h"
int main(void) {
// включаем тактирование порта
RCC->AHB1ENR |= 0b00000000000000000000000000001000; // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// включаеим тактирование таймера_4
RCC->APB1RSTR |= 0b00000000000000000000000000000100; // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)
// Настраиваем порты
GPIOD->MODER = 0b10101010000000000000000000000000; // альтернативная функция на 15,14,13,12 пинах GPIOD->OTYPER = 0b00000000000000000000000000000000; // Двухтактный выход на 15,14,13,12 пинах GPIOD->OSPEEDR = 0b11111111000000000000000000000000; // Скорость высокая на 15,14,13,12 пинах GPIOD->PUPDR = 0b00000000000000000000000000000000; // Без подтяжки
// Настраиваем таймер
TIM4->CCER = 0b0001000100010001; // включаем каналы таймера как выходы ( подключаем их к ножкам ) // тут надо повнимательнее изучить этот регистр CCER
TIM4->CCMR1 = 0b0110000001100000; // прямой шим на 1 и 2 канале таймера TIM4->CCMR2 = 0b0110000001100000; // прямой шим на 3 и 4 канале таймера
TIM4->PSC = 0b0101110110111111; // предделитель частоты таймера 24000-1
TIM4->CR1 = 0b0000000000000001; // пуск таймера ( таймер начал считать )
TIM4->CNT = 0b0000000000000000; // регистр сравнения таймера... -> обнуляем таймер
//TIM4->ARR = 0b1111111111111111; // число до которого тикает таймер ( частота ШИМа )
TIM4->CCR1 = 0b0001111111111111; // первый канал ШИМа - длина импульса TIM4->CCR2 = 0b0011111111111111; // второй канал ШИМа - длина импульса TIM4->CCR3 = 0b0111111111111111; // третий канал ШИМа - длина импульса TIM4->CCR4 = 0b1111111111111111; // четвертый канал ШИМа - длина импульса
}
попробую еще тут подсмотреть... http://teplofizik.diary.ru/p186675068.htm?oam
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Среда, 14.05.2014, 19:06 |
|
| |
Sergi | Дата: Среда, 14.05.2014, 20:41 | Сообщение # 60 |
Подполковник
Группа: Проверенные
Сообщений: 540
Статус: Offline
| Там где-то есть критический порядок инициализации, что за чем писать. Обычно таймер включают (EN) в самом конце, а ширину шим можно менять на ходу отдельно.
|
|
| |
|