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

Кто любит RISC в жизни, заходим, не стесняемся.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

dosikus, Спасибо за интересный вариант пригодится.
А что на счёт задержек на

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

 GPIOB->BSRRH = GPIO_Pin_12;

Что не так смотрю? В какую сторону копать?


Mr.Denis,По читайте про DWT.
http://forum.easyelectronics.ru/viewtop ... 31#p271595
GHOST_J_D
Родился
Сообщения: 12
Зарегистрирован: Пт дек 14, 2012 21:07:49
Откуда: Екатеринбург
Контактная информация:

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

Сообщение GHOST_J_D »

Cобрал все как тут (http://makesystem.net/?p=988) описано. Дошел до первой компиляции и выдает такую штуку во вкладке Problems.

Description Resource Path Location Type
make: *** [src/system_stm32f10x.o] Error 1 FIRST2 C/C++ Problem

Эклипсу дан полный доступ в свойствах программ. Что это может быть? :(
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

Сообщение Mr.Denis »

Всем привет!
И так Реализовал два варианта задержки, один на системном таймере и второй на базовом таймере.
Вот что получилось:
СпойлерПервый вариант, на системном таймере

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

#ifndef __DELAY_H
#define __DELAY_H

/*================*/
#define SYSTEM_FREQUENCY SystemCoreClock   // Устанавливаем значение AHB из system_stm32f4xx.c
/*================*/

/******************   Регистеры системного таймера ядра Cortex-M ***********************/
#define STK_CTRL       (*(volatile uint32_t*) 0xE000E010)   
#define STK_LOAD       (*(volatile uint32_t*) 0xE000E014)   
#define STK_VAL       (*(volatile uint32_t*) 0xE000E018)   
#define STK_CALIB    (*(volatile uint32_t*) 0xE000E01C)   
/*****************  Биты для работы с регистром STK_CTRL  *****************/
#define STK_CTRL_ENABLE         ((uint32_t)0x00000001)   // Bit № 0, название бита ENABLE.
#define STK_CTRL_TICKINT      ((uint32_t)0x00000002)   // Bit № 1, название бита TICKINT
#define STK_CTRL_CLKSOURCE   ((uint32_t)0x00000004)   // Bit № 2, название бита CLKSOURCE
#define STK_CTRL_COUNTFLAG   ((uint32_t)0x00010000)   // Bit № 16, название бита COUNTFLAG

void Init_SysTick_delay(void); // Объявление Функция настройки системного таймера
void delay_us(uint32_t us); // Объявление Функция для задержки в микросикундах
void delay_ms(uint32_t ms); // Объявление Функция для задержки в милисекундах

#endif

void Init_SysTick_delay(void){ // Функция настройки системного таймера
  STK_CTRL &=~STK_CTRL_TICKINT;  // Выключить прерывание от SysTick, в bit1 записываем 0
  STK_CTRL |= STK_CTRL_CLKSOURCE; // Тактирование от AHB, в bit2 записываем 1
  }

void delay_us(uint32_t us){
   STK_LOAD  = (SYSTEM_FREQUENCY / 1000000);  // Загружаем значение, в этом случаи равен 168 = 168000000 \ 1000000. (1 us = 168 тактов)
  STK_VAL   = 1; // Как я понял любое число???
   STK_CTRL |= STK_CTRL_ENABLE; // Включаем счетчик, в bit0 записываем 1
  while(us > 0){ // Цикл выполняется до тех пор, пока us больше 0
    while (!(STK_CTRL & STK_CTRL_COUNTFLAG));   // Проверяем бит COUNTFLAG (bit № 16) на еденицу. Цикыл выболняется пока значение != 0
    us--; // С каждым заходом в цикл вычетаем 1 из переменной us
  }
   STK_CTRL &= ~STK_CTRL_ENABLE; // Выключаем счетчик, в bit0 записываем 0
}

void delay_ms(uint32_t ms){
   STK_LOAD  = (SYSTEM_FREQUENCY / 1000);  // Загружаем значение, в этом случаи равен 168 = 168000000 \ 1000. (1 ms = 168000 тактов)
  STK_VAL   = 1; // Как я понял любое число???
   STK_CTRL |= STK_CTRL_ENABLE; // Включаем счетчик, в bit0 записываем 1
  while(ms > 0){ // Цикл выполняется до тех пор, пока us больше 0
    while (!(STK_CTRL & STK_CTRL_COUNTFLAG));   // Проверяем бит COUNTFLAG (bit № 16) на еденицу. Цикыл выболняется пока значение != 0
    ms--; // С каждым заходом в цикл вычетаем 1 из переменной us
  }
   STK_CTRL &= ~STK_CTRL_ENABLE; // Выключаем счетчик, в bit0 записываем 0
}


СпойлерВторой вариант на базовом таймере

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

#ifndef __DELAY_H
#define __DELAY_H

#define AHB1_clock 42000000

void delay_us(uint32_t us);
void delay_ms(uint32_t ms);

#endif /*__DELAY_H*/

void delay_ms(uint32_t ms)
{
     TIM6->PSC = AHB1_clock/1000-1;
     TIM6->ARR = ms;
     TIM6->EGR |= TIM_EGR_UG;
     TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
     while (TIM6->CR1&TIM_CR1_CEN);
}
     
void delay_us(uint32_t us)
{
     TIM6->PSC = AHB1_clock/1000000-1;
     TIM6->ARR = us;
     TIM6->EGR |= TIM_EGR_UG;
     TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
     while (TIM6->CR1 & TIM_CR1_CEN);
}



Все это дело проверил в железе вроде работает нормально.
Единственное во втором варианте есть маленький нюанс, регистр ARR 16-ти битный и поэтому в него не получается записывать значения больше 65535(оно думаю не к чему.).

Проверьте пожалуйста все ли правильно и что можно улучшить.

P.S. Сейчас продумываю функцию задержки которую хочу реализовать на DWT
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Mr.Denis писал(а):
P.S. Сейчас продумываю функцию задержки которую хочу реализовать на DWT


Не выдумывай х..и , это для измерения ...
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

Сообщение Mr.Denis »

Понял, просто выше мне посоветовали этот вариант и я подумал что он имеет место быть. Тем более этот вариант никто не опровергнул, ну и я повелся на это(((

Что скажите про два варианта которые я реализовал?
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Mr.Denis писал(а):Что скажите про два варианта которые я реализовал?


Да все как то страшно, честно говоря .
У тебя поллинг флагов , причем по функциональности мало чем отличающийся задержек с пустыми циклами- пустая молотьба
Можно конечно реализовать все это дело , как писал ранее с прерываниями, изменив загружаемое значение в Systick .
Но прерывания с интервалом 1uS это полный писец.

Кстати а зачем все таки такие точные , да еще мелкие задержки с HD44780 ?
Он сам по себе медленное устройство . Посмотрел свои реализации - самые мелкие задержки 10mS .
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

Сообщение Mr.Denis »

dosikus писал(а):причем по функциональности мало чем отличающийся задержек с пустыми циклами- пустая молотьба

Согласен, но что-то мне подсказывает что на базовом или системном таймере оно намного точнее, или я сильно заблуждаюсь?
dosikus писал(а):Можно конечно реализовать все это дело , как писал ранее с прерываниями

Насколько я понимаю ситуацию то с задержками в us это будет очень хренова, с применением прерывания разве что делать большие задержки.
dosikus писал(а):Кстати а зачем все таки такие точные , да еще мелкие задержки с HD44780 ?

эту информацию почерпнул из даташит на HD44780, хотя мог в спешки перепутать us и ms. Обязательно перепроверю.
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
menzoda
Вымогатель припоя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

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

Сообщение menzoda »

Использовать для коротких задержек таймер - это нерационально. Я за первый вариант - просто цикл.

1. Пишем на ассемблере функцию вида:

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

void delay(uint32_t i)
{
    while(i-- > 0);
}

Если не можешь сам написать - то подсмотри, что генерирует компилятор. Разберись, что там происходит. Посмотри нельзя ли оптимизировать все это дело.

2. Смотрим, за сколько тактов выполняется одна итерация цикла (открываем даташит на ядро и смотрим за сколько тактов выполняется каждая инструкция, затем все суммируем).

3. Считаем, сколько тактов помещается в микросекунде, а потом - сколько в ней же помещается итераций цикла (пусть будет N).

4. Добавляем к функции преобразование из мс в итерации:

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

void delay(uint32_t i)
{
    i *= N;
    while(i-- > 0);
}


5. Профит!

Такой подход позволит задавать более короткие задержки и обеспечит более высокую точность (чем любое решение с таймером). Никаких NOP использовать не надо, только лишние такты потратишь, а чем их меньше - тем больше точность задержки. Запрещать прерывания внутри функции тоже не надо. Если потребуется, то сделай это вне функции.
reidfix
Родился
Сообщения: 4
Зарегистрирован: Пт май 10, 2013 23:09:41

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

Сообщение reidfix »

Да зачем тот LPT, сейчас уже и USB-ишные куда ни плюнь на раз два делаются лутом ... st-link/v2 :)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

reidfix , Вам фантазия, а точней ее отсутствие , не позволяет найти другой способ раскрутки своего блога, кроме как впихивать ссылки на него куда попало ?
Где Вы здесь нашли ЛПТ ?
Где вообще Вы видели прошиватель на STM через ЛПТ ?
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

dosikus писал(а):reidfix , Вам фантазия, а точней ее отсутствие , не позволяет найти другой способ раскрутки своего блога, кроме как впихивать ссылки на него куда попало ?

А че, нормально. Ребята на изиэлектрониксе неслабо так побились головой об STLink, чтоб бутлоадер "утянуть", а теперь все, кому не лень, лепят клонов, даже абсолютно не пониая, как это работает. Была бы совесть - хоть бы ссылочку на форум указал, откуда прошивка появилась.
PS: Фирменный ST-Link V2, $21, что говорит о том, что ST на них практически не наживается.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
rus084
Друг Кота
Сообщения: 3443
Зарегистрирован: Вт июн 28, 2011 12:11:50
Откуда: Россия,Ставропольский край, ст.Бекешевская
Контактная информация:

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

Сообщение rus084 »

плату discovery можно заставить программировать другие контроллеры , стоит она дешевле . зачем тогда покупать программатор?
Меня зовут Димон .
Изображение
Изображение
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

ST-Link упакован в корпус и снабжен защитой от статики. Те это какбэ более надежное устройство. Дискавери можно использовать, но есть риск спалить...
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

coredumped писал(а):ST-Link упакован в корпус и снабжен защитой от статики. Те это какбэ более надежное устройство.

+100500
У STLink транслятор уровня есть, со всеми вытекающими.
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

С Рождеством всех!
Подскажите по вопросу:
Портирую пример использования индикатора RDX0154 от Леонида Ивановича под STM32, столкнулся с небольшой проблемой:

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

//---------- Вывод null-terminated string (в экранную память): ----------

void LCD_PutString(char __flash *s)
{
  while(*s) LCD_PutChar(*s++);
}
В этом коде IAR ругается на переменную _flash, помню вроде где то находил уже подобное......
Пока решил просто объявив эту переменную #define __flash , но хочется узнать как правильно быть в подобной ситуации?
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

amv2000 , __flash это AVR'вский квалификатор для размещения в ROM .
const пользуй....
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

Спасибо записал

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

void LCD_PutString(const uint8_t *s);
работает.
Frogfot
Мучитель микросхем
Сообщения: 443
Зарегистрирован: Ср окт 19, 2011 08:48:27
Откуда: Мать городов русских

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

Сообщение Frogfot »

Народ здарова, подскажте - чё за регистры контроллера прерывания для Cortex-M0+ - Interrupt Set-Pending Register и Interrupt Clear-Pending Register?
Хорошему коту и в декабре - март :)
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

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

Сообщение drakon »

Interrupt Set-Pending Register - вызов прерывания
Interrupt Clear-Pending Register - сброс флага внешнего прерывания
т.к. в stm32 нужно вручную сбрасывать флаги прерывания. например, с использованием SPL:

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

EXTI_ClearITPendingBit(EXTI_Line0);

или без нее:

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

   EXTI->PR |= EXTI_PR_PR15;//сброс флага PR15 перрывания записью единицы
   EXTI->SWIER |= EXTI_SWIER_SWIER15;//установка флага PR15 в регистре EXTI_PR
Ответить

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