STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Пару раз из-за кривого кабеля слетала прошивка .
А так же обновление прошивки при обновлении дров от Segger(родителя Jlink) может залочить Jlink.
Jlink тупо становиться кирпичом - на подключение винда не реагирует, светодиоды на Jlink молчат.
Как восстановить в архиве , на русском .
Дрова обновить крайне рекомендуется .
На сегодня пользуюсь 4.90 .
На сайте свежие 4.92 https://www.segger.com/jlink-software.html
Завтра попробую -отпишусь...
Реклама
Родился
Сообщения: 10
Зарегистрирован: Пт сен 19, 2014 19:20:10

Сообщение Zashibis »

Хочу тут серву запустить на STM32f4Discovery.
Нашел статейку в сети правда там для f10. http://easystm32.ru/useful-things/34-ho ... -the-stm32
Чутка подправил вначале ибо кокос ругался, но серва так и не запустилась. Серву питал от отделбного источника на 5.38 вольт, а выход подключил к желтому проводу. Косяк где-то на строке включения порта был и возможно на включении таймера.
Подскажите что не так в коде и что подправить надо?

Код: Выделить всё

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#define SERVO_180 8200
#define SERVO_0 1800
// Функция устанавливает позицию вала (в градусах)
void set_pos(uint8_t pos) {
uint32_t tmp=(SERVO_180 - SERVO_0) /180 ;
TIM2->CCR2 = SERVO_0 + tmp * pos;
}
// Функция задержки
void delay(void) {
volatile uint32_t i;
for (i=1; i != 0xFFFF; i++)
;
}
int main()
{
//Включем порт А
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA , ENABLE);
//Включаем Таймер 2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
GPIO_InitTypeDef PORT;
// Настроим ногу (PA1) к которой подключен сервопривод
PORT.GPIO_Pin = (GPIO_Pin_1);
//Будем использовать альтернативный режим а не обычный GPIO
PORT.GPIO_Mode = GPIO_Mode_AF;
PORT.GPIO_OType = GPIO_OType_PP;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &PORT);
//Разрешаем таймеру использовать ногу PA1 для ШИМа
TIM2->CCER |= (TIM_CCER_CC2E);
TIM2->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);
//Настраиваем предделитель чтоб частота ШИМа была в районе 50 Гц
TIM2->PSC = 3;
//Запускаем таймер
TIM2->CR1 |= TIM_CR1_CEN;
uint8_t i;
//Начинаем крутить сервой от 0 до 180 градусов.
while(1)
{
for (i=0;i<=180;i++) {
delay();
set_pos(i);
}
}

}
Еще кокос ругался на вот это :

Код: Выделить всё

PORT.GPIO_Mode = GPIO_Mode_AF_PP;
Я как мог понять заменил вот так

Код: Выделить всё

PORT.GPIO_Mode = GPIO_Mode_AF;
PORT.GPIO_OType = GPIO_OType_PP;
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Бездумное юзанье SPL отягощенное кухаркиными статьями.
Даташит читать один хрен придется ...

Изображение
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

Zashibis, надо еще вставить настройку альтернативной функции:

Код: Выделить всё

GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

Сообщение Frogfot »

Народ, подскажите, плиз, какой минимальный МК - необходим для подключение USB Flash - какой объём Flash/RAM необходим.

Также может кто встречал готовые проекты - ткните носом в ссылку, плиз.
Хорошему коту и в декабре - март :)
Реклама
Родился
Сообщения: 10
Зарегистрирован: Пт сен 19, 2014 19:20:10

Сообщение Zashibis »

BorisSPB писал(а):Zashibis, надо еще вставить настройку альтернативной функции:

Код: Выделить всё

GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
Вставил после строки

Код: Выделить всё

GPIO_Init(GPIOA, &PORT);
Не работает.
Реклама
Родился
Сообщения: 10
Зарегистрирован: Пт сен 19, 2014 19:20:10

Сообщение Zashibis »

dosikus писал(а):Бездумное юзанье SPL отягощенное кухаркиными статьями.
Даташит читать один хрен придется ...

Изображение
Даташит я читал, правда до этой таблицы не добрался. Нормальных статей в нете не нашел. Не могли бы вы не просто показать но объяснить что к чему или где глянуть и что в коде подправить.
Встал на лапы
Сообщения: 145
Зарегистрирован: Ср фев 01, 2012 10:55:53

Сообщение BorisSPB »

Zashibis,прошу извинить меня, написал чушь...
Последний раз редактировалось BorisSPB Пт окт 10, 2014 07:51:59, всего редактировалось 1 раз.
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Подскажите, можно ли в компиляторе IAR сделать примерно как вот тут только для массива (что бы в окне WATCH вместо цифр отражалось осмысленное название ячейки массива )
короче как-то так:
Изображение

Для чего мне это? Просто мне понравился вот такой способ создания временных переменных.

Код: Выделить всё

#define KEY_TIMERS  0
#define LED_TIMERS  1
#define LED_TIMERS1 2
#define LED_TIMERS2 3

#define MAX_TIMERS 4

volatile unsigned int Timir[MAX_TIMERS];

void SysTick_Handler(void)
{
unsigned char i=0;
              for (i=0; i<MAX_TIMERS; i++) {
			Timir[i]++;
		}
}
и работаешь дальше с Timir[KEY_TIMERS],Timir[LED_TIMERS] как с переменными
а когда понадобится ещё одна переменная просто меняешь MAX_TIMERS и всё
Так вот было бы отлично если бы ещё в отладчике массив Timir показывался с дефайнами(Timir[KEY_TIMERS]), а не просто Timir[0].
Пока таких переменных не сильно много то всё терпимо, а вот потом...
Вложения
IAR.png
(8.97 КБ) 274 скачивания
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

В статье немного не то, там создаётся свой тип данных с помощью перечислений (enum), а у Вас тип - unsigned int.
А имена элементов массива задать свои, как Вы хотите, нельзя.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Сообщение slavokhire5 »

Frogfot писал(а):Народ, подскажите, плиз, какой минимальный МК - необходим для подключение USB Flash - какой объём Flash/RAM необходим.
Также может кто встречал готовые проекты - ткните носом в ссылку, плиз.
Вам нужен контроллер, который будет поддерживать USB-HOST. Контроллер нужно брать где-то от 32кБ RAM, сам USB затянет 10-15 кБ, остальное - на ваш код и про запас. Есть опыт работы только с STM32. Из их серии F1 самый дешевый контроллер, который поддерживает USB - это STM32f103. Еще рекомендую обратить внимание на серию stm32F0. Эти контроллеры позволяют использовать USB без внешнего кварца, что удешевляет проект. Какой именно МК из F0 поддерживает USB - это вам уже нужно глянуть на сайте st.com
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Все работает и без кухаркиных статей и SPL'ни ...
При верной настройке тактирования.
Спойлер

Код: Выделить всё

#include "stm32f4xx.h"

#define SERVO_180 8200
#define SERVO_0 1800

static volatile uint32_t TimingDelay;


/* Delay & timers */
void SysTick_Handler(void) {
			if (TimingDelay) {
				TimingDelay--;
			}
			
			
		}

		
		void Delay_mS(uint32_t nTime) {
			TimingDelay = nTime;

			while (TimingDelay);
		}
		
		
void set_pos(uint8_t pos) {
uint32_t tmp=(SERVO_180 - SERVO_0) /180 ;
TIM2->CCR2 = SERVO_0 + tmp * pos;
}




 int main (void)
 {
	 uint8_t i;
	 SysTick_Config(SystemCoreClock /1000);
	 
	 RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN ;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN ; 
    GPIOA->MODER &=~                     
                  (
                  GPIO_MODER_MODER1   )
                                   ;
       GPIOA->MODER|= 
             
              (
              GPIO_MODER_MODER1_1)
                                  ;
 	GPIOA->AFR[0] |= (1<<4); 
	 
	 
TIM2->CCER |= (TIM_CCER_CC2E);
TIM2->CCMR1|= (TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2|TIM_CCMR1_OC2FE);

TIM2->PSC = 168-1;
TIM2->ARR = 8200-1;
TIM2->CR1 |= TIM_CR1_CEN;


	 
while(1)
{
for (i=0;i<=180;i++) {
Delay_mS(100);
set_pos(i);
}
}

	return 0 ;
 }
Изображение
Изображение





Код: Выделить всё

Update_event = TIM_CLK/((PSC + 1)*(ARR + 1)*(RCR + 1))

Код: Выделить всё

Period = ARR 
Pause = CCR1
Pulse_Output = ARR - CCR1
Родился
Сообщения: 10
Зарегистрирован: Пт сен 19, 2014 19:20:10

Сообщение Zashibis »

dosikus писал(а):Все работает и без кухаркиных статей и SPL'ни ...
Попробовал ваш код. Импульсы вроде как какие-то идут(осцилографа нету) чисто тестером, но по факту серва не крутится. Серва хоть как-то задвигалась когда поставил пример из кокоса. Возможно циклы иные. Серва китайская как в примере из статьи ссылку на которую давал.
Правильно ли я понимаю что серва не может крутиться постоянно в одну сторону или это зависит от типа сервы?
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Zashibis надо сперва тактовую настроить .
Для этого нужно править system_init и stm32f4xx.h .
http://kazus.ru/forums/showpost.php?p=6 ... stcount=37

Но кактус для работы с STM - пустая трата времени !
Родился
Сообщения: 10
Зарегистрирован: Пт сен 19, 2014 19:20:10

Сообщение Zashibis »

Спасибо попробую. Возможно вы и правы про кокос, но когда вообще нифига не работает руки просто опускаются. Кокос хоть надежду дает, что не все так уж плохо. Так планирую осваивать keil.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Что за прикол:
Если делаю по первому варианту, то программа после перепрошивки не стартует, стартует только после сброса...
Если делаю по второму варианту, то программа стартует сразу после перепрошивки :shock:
Спойлервар1

Код: Выделить всё

//------------------------------------------------------------------------------
#include "stm32f10x.h"
void Delay (uint32_t Val);
 
 
//------------------------------------------------------------------------------
int main(void) 
{
	RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;    //разрешить тактирование GPIOB
	GPIOB->CRH   &= ~GPIO_CRH_MODE11;      //очистить разряды MODE
	GPIOB->CRH   &= ~GPIO_CRH_CNF11;       //общего назначения, симетричный  
	GPIOB->CRH   |=  GPIO_CRH_MODE11_0;    //выход, 10MHz

	while(1) 
	{
		// Set PB.11 bit
		GPIOB->BSRR = GPIO_BSRR_BS11;
		Delay(1000000);

		// Reset PB.11 bit
		GPIOB->BSRR = GPIO_BSRR_BR11;
		Delay(1000000);
	}
}
 

//------------------------------------------------------------------------------
void Delay (uint32_t Val) 
{
	for(; Val; Val--) __NOP();
}


//------------------------------------------------------------------------------
вар2

Код: Выделить всё

//------------------------------------------------------------------------------
#include "stm32f10x.h"
void Delay(uint32_t Val);
 
 
//------------------------------------------------------------------------------
int main(void) 
{
   	GPIO_InitTypeDef GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);		// Enable PORTB Periph clock  
  	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;				// Configure PC.11 as Push Pull output at max 10Mhz
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  	GPIO_Init( GPIOB, &GPIO_InitStructure);
 
  	while(1) 
	{
		GPIO_SetBits( GPIOB, GPIO_Pin_11);
		Delay(100000);
	 
		GPIO_ResetBits( GPIOB, GPIO_Pin_11);
		Delay(100000);
  	}
 }
 
 
//------------------------------------------------------------------------------
void Delay(uint32_t Val) 
{
  	for(; Val; Val--) __NOP();
}
	
	
//------------------------------------------------------------------------------

И еще в догонку...
Че за прикол, вот так нельзя делать...

Код: Выделить всё

for(uint16_t i=1000; i; i--) 
Нужно обязательно переменную объявлять в начале функции?
Я уже привык в WinAVR - где нужно, там и объявляю...


И кстати, как сделать чтобы uint8_t и прочие - подсвечивались в KEIL?


Ну и ишо... не могу писать русские коменты... хотя те что вставляю копипастом - отображаются нормально... де потыкать нужно?
Последний раз редактировалось shads Сб окт 11, 2014 10:48:42, всего редактировалось 1 раз.
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

shads писал(а):И еще в догонку...
В ANSI С переменные объявляются только в начале функции. В C99 можно объявлять в любом месте, возможно и в цикле. Попробуй поставить в опциях компилятора C99 Mode и посмотри можно будет или нет, если нет - то выходит ни один стандарт не разрешает объявлять переменные в цикле. А WinAVR и ему подобные, где стандарты интерпретируются как попало, нужно забыть.
shads писал(а):И кстати, как сделать чтобы uint8_t и прочие - подсвечивались в KEIL?
Edit -> Configuration -> User Keywords
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

shads писал(а):
Ну и ишо... не могу писать русские коменты... хотя те что вставляю копипастом - отображаются нормально... де потыкать нужно?
Если качал, как я советовал, с рутрекера - там есть как руссифицировать.
Хоть и "камменты" на кириллице еще то зло...

А вменяемая реализация задержек - шестью постами выше ...
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

shads писал(а):Что за прикол:
Разобрался...
Это были разные проекты, и во втором почему то не стояла галочка тут: (а в первом почему то стояла :) )

Изображение


menzoda писал(а):Попробуй поставить в опциях компилятора C99 Mode и посмотри можно будет или нет
А де такая настройка в KEIL?
menzoda писал(а):А WinAVR и ему подобные, где стандарты интерпретируются как попало, нужно забыть.
Если говорить именно о WinAVR, то это ты здря...
menzoda писал(а):
shads писал(а):И кстати, как сделать чтобы uint8_t и прочие - подсвечивались в KEIL?
Edit -> Configuration -> User Keywords
Спасибки...
dosikus писал(а):Если качал, как я советовал, с рутрекера - там есть как руссифицировать.
Откуда качал не помню, но щя гляну...
dosikus писал(а):А вменяемая реализация задержек - шестью постами выше ...
Ок... я просто еще только мигаю разными реализациями, до вменяемых задержек пока не успел добраться... пока по примерчикам отсюда разбираюсь: http://radiokot.ru/articles/43/
Вложения
pg1.png
(18.54 КБ) 842 скачивания
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Project -> Options for Target -> C/C++ -> C99 Mode

Если у тебя вместо кириллицы печатается ерунда, попробуй
Edit -> Configuration -> Editor -> Encoding -> Encode in UTF-8 without signature

Ну и шрифт должен быть нормальный. Умолчальный Courier New вроде работает, но лично я везде пользуюсь Consolas.
Последний раз редактировалось menzoda Сб окт 11, 2014 11:23:39, всего редактировалось 2 раза.
Ответить

Вернуться в «ARM»