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

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

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

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

dosikus писал(а):Ну дык включен пуллап , а проверяшь пин на 1 .
При нажатой кнопке ловится 0.
Не знал((
dosikus писал(а):И желательно биты портов всегда конфигурировать явно , не надеясь на умолчания ...

Вы имеете в виду про настройку PORT A, pin 0 как выход? Так он вроде и так сконфигурирован по умолчанию!?
Если да, то вариант который я придумал это так:

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

GPIOA ->MODER |= ((uint32_t)0x00000000);

Или второй вариант в файле STM32F4xx.h создать свой хейдер.
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Mr.Denis писал(а): Так он вроде и так сконфигурирован по умолчанию!?
Если да, то вариант который я придумал это так:

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

GPIOA ->MODER |= ((uint32_t)0x00000000);



А вот и не все, см. даташит . Да и возможна ситуация когда приспичит переконфигурировать лапу на ходу , а ты и не знаешь как.

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

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

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

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

dosikus писал(а):А вот и не все, см. даташит . Да и возможна ситуация когда приспичит переконфигурировать лапу на ходу , а ты и не знаешь как.

Ты наверное меня не совсем понял, я имел в виду что я в файле STM32F4xx.h не нашел строчку типа GPIO_MODER_MODER0_00 которая прописывает в регистр 0x00.
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Mr.Denis писал(а):наверное меня не совсем понял, я имел в виду что я в файле STM32F4xx.h не нашел строчку типа GPIO_MODER_MODER0_00 которая прописывает в регистр 0x00.


Это ты не понял "физику" процесса .
Все что нужно в хэдере есть :

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

/******************************************************************************/
/*                                                                            */
/*                            General Purpose I/O                             */
/*                                                                            */
/******************************************************************************/
/******************  Bits definition for GPIO_MODER register  *****************/
#define GPIO_MODER_MODER0                    ((uint32_t)0x00000003)
#define GPIO_MODER_MODER0_0                  ((uint32_t)0x00000001)
#define GPIO_MODER_MODER0_1                  ((uint32_t)0x00000002)


А именно битовые маски . Можешь почитать здесь http://eugenemcu.ru/publ/2-1-0-53
А пока на пальцах .
За конфигурацию каждого пина отвечает пара бит регистра MODER ,
конкретно для PA0 биты 0 и 1.

СпойлерИзображение


Для установки обоих бит используется конструкция :

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

GPIOA->MODER |=GPIO_MODER_MODER0;


раскроем именованную константу GPIO_MODER_MODER0

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

GPIOA->MODER |=0x00000003;

или

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

GPIOA->MODER =GPIOA->MODER | 0x00000003;

Для сброса обоих бит :

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

GPIOA->MODER &= ~GPIO_MODER_MODER0;


раскрываем

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

GPIOA->MODER &= ~ 0x00000003;

раскрываем далее

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

GPIOA->MODER &= 0xFFFF FFFC;

и далее

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

GPIOA->MODER =GPIOA->MODER & 0xFFFF FFFC;
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

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

Вроде понял, но сегодня вечером еще почитаю и постараюсь более детально вникнуть в эту тему, так как это очень важно понять.
Попробую еще поискать задачки по этой теме и порешать их для закрепления материала.
Если кто знает где найти задачи без решений, подскажите пожалуйста.
STM32F4 Discovery + KEIL + Windows 7
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

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

Нашел интересные и понятные уроки по работе с битами http://www.fanatnauki.ru/index.php?option=com_content&view=article&id=37&Itemid=54
STM32F4 Discovery + KEIL + Windows 7
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

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

Всем привет!
Начал разбираться с функцией делея которую любезно подкинул уважаемый drakon, но есть маленькая незадача((( ткните носом где в reference manual написано про этот системный таймер? (Просто хочется понять что там и к чему)

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

P.S. Хочется самостоятельно сделать нормальную функцию задержки. что бы потом ее можно было использовать в любых проектах.
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
amv2000
Опытный кот
Сообщения: 717
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

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

Сообщение amv2000 »

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

К примеру так

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

void tool_delay_ms(uint32_t ms)
{
  volatile uint32_t nCount = (SystemCoreClock/10000)*ms;
  for (; nCount!=0; nCount--);
}

Про системный таймер немного есть тут http://chipspace.ru/stm32-systick/
Последний раз редактировалось amv2000 Сб дек 14, 2013 14:06:34, всего редактировалось 1 раз.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

Объявляем :

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

  static volatile uint32_t TimingDelay;
     static volatile uint32_t TimerCntDN;
/* Delay & timers */
      void SysTick_Handler(void) {
         if (TimingDelay) {
            TimingDelay--;
         }
         if (TimerCntDN) {
            TimerCntDN--;
         }
         
      }

      
      void Delay_mS(uint32_t nTime) {
         TimingDelay = nTime;

         while (TimingDelay);
      }


Инициализируем:

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

int main (void)
{   
  SysTick_Config(SystemCoreClock /1000);
  ...
  ...


Используем :
1) Тупая задержка:

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

   Delay_mS(100);


2) Отсчет интервала без задержек процессора :
Здесь не допустимы задержки в коде , если хотим адекватных интервалов ...

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

  if (! TimerCntDN) 
    {
       //Наш код исполняемый по истечению интервала  , например переключение пина порта
      TimerCntDN=100; // Заряжаем новый интервал.
    }


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

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

Сообщение coredumped »

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

У ST доки сделаны таким, странным, образом:
- дока на ядро - туда входит периферия ядра "Core peripherals" (SysTick timer - в их числе), называется "Programming manual"
- дока на периферию, не входящую в ядро, называется "Reference manual"
Для STM32F4, например, доки называются соответственно PM0214 и RM0090. Все лежит на сайте ST - находите свой МК, нажимаете закладку "Design resources" и там все есть :)
Есть еще отдельная дока по работе с встроенной flash. Внимательно просмотрите - найдется все + примеры программ.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

coredumped писал(а):У ST доки сделаны таким, странным, образом:


Почему "странно" , все логично - ядро не от STM . Зачем все в кучу мешать?
А из самого "странного" это даташиты на AVR.. :)))
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

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

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

Сообщение dosikus »

coredumped писал(а):В одном документе, особенно начинающему - в миллион раз удобней.


Каждый по своему с ума сходит...
А так не пойму, чем огромный даташит может быть лучше и именно начинающим , которые и так их ни хрена не читают а тут еще и листать замучаются... :))) Не многие же знают что в pdf вьюверах есть поиск ...
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

Самая большая проблема - читать не умеют, на родном английском :) А на русском доки очень мало...
Все будет только лучше, в крайнем случае - хуже.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

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

Приветствую!)) Все огромное спасибо за ответы.)
Итак, начал разбираться с SysTick. Вроде как все просто, но все же вопросы есть:
Подскажите за что отвечает 16 bit регистра STK_CTRL?(Что-то я не совсем понял для чего он и как его использовать?)
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

Открываем PM00214 и читаем...

Bit 16 COUNTFLAG:
Returns 1 if timer counted to 0 since last time this was read.

Если прочиталась 1 - значит, что таймер "перевалил" через 0 с момента предыдущего считывания. То есть с момента предыдущей проверки произошла перезагрузка таймера.
Все будет только лучше, в крайнем случае - хуже.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

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

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

coredumped писал(а):Открываем PM00214 и читаем...

Спасибо за разъяснения. Естественно открывал и читал, только у меня возникли трудности с переводом, по этому я толком и не понял. :( После вашего разъяснения стало все ясно. Спасибо! :)

Смотрю я на функцию задержки из примера который предоставил товарищ drakon, и не понимаю одной вещи(
Вод код функции задержки:

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

void delay_us(uint32_t us){
uint32_t temp = SYST_RVR;
  SYST_RVR  = (SYSTEM_FREQUENCY / 1000000);  //Заносим значение для перегрузки
  SYST_CVR   = 16; //Заносим начальное значение счетчика
   SYST_CSR |= SysTick_CTRL_ENABLE; //Включить SysTick
  while(us > 0){
    while (!(SYST_CSR & SysTick_CTRL_COUNTFLAG));   //Весим в цикле пока не досчитает до 0
    us--;
  }
   SYST_CSR &= ~SysTick_CTRL_ENABLE; //Выключить SysTick
   SYST_RVR = temp;
}

Так вот я не могу понять по чему в регистр STK_VAL (здесь он именуется как SYST_CVR) записывается число 16?
Вот выписка из мануала:
CURRENT: Current counter value
The VAL register contains the current value of the SysTick counter.
Reads return the current value of the SysTick counter.
A write of any value clears the field to 0, and also clears the COUNTFLAG bit in the
STK_CTRL register to 0.


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

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

Сообщение dosikus »

Mr.Denis писал(а):Смотрю я на функцию задержки из примера который предоставил товарищ drakon, и не понимаю одной вещи(
(


Упс, зря я тебе сие посоветовал - рано тебе в эти дебри лезть.
Смотри мой пример - там тебе всего хватит.

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

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

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

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

dosikus, уже залез и потихонечку разбираюсь с этим. Пробую переделать под себя для удобства.

Посмотрите пожалуйста правильно я понимаю вот этот кусок? В этом куске переименовал регистры, биты и прокомментировал по своему(так как я это понимаю).

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

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
}

Что скажете?
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

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

Сообщение coredumped »

Обычно системный таймер так не используют - он предназначен для генерации "тиков" ОС или министеков типа LWIP. Правильнее запустить таймер с генерацией прерываний, и уже в обработчике прерывания Вы можете сделать сколько угодно программных таймеров, задержек итп. Если Вам нужны более точные временные интервалы, используйте обычные таймеры, благо их более чем достаточно. Для управления системным таймером, как уже написал dosikus, ARM предоставляет готовые функции в CMSIS. Не думаю, что Вы сможете написать лучше. Да и какой смысл изобретать колесо - возьмите готовое.
Все будет только лучше, в крайнем случае - хуже.
Ответить

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