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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот втупляю все равно.... :facepalm:

Например, вот такое выражение. Довольно простое.

RCC->AHBENR|=RCC_AHBENR_GPIOCEN;


Если из структуры я выдрал название регистра (его адрес) вот этой конструкцией:

RCC->AHBENR


А вот эта часть - это же объявление бита регистра? RCC_AHBENR_GPIOCEN

т.е. по сути название регистра и название его бита?

Тогда почему такая конструкция?

Должно же быть что-то типа такого:

RCC->AHBENR|=(1<<RCC_AHBENR_GPIOCEN);

Это для установки бита, а для сброса тоже самое, но:

RCC->AHBENR &=~(1<<RCC_AHBENR_GPIOCEN);


P/S/ А вот это я понимаю, что просто не заморачиваясь присвоение регистру типа "магического числа", только используя названия этих битов?

RCC->AHBENR=RCC_AHBENR_GPIOCEN;


Что равносильно примерно этому:

RCC->AHBENR=0х00000100;
Станислав
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

RCC_AHBENR_GPIOCEN уже включает 1<<pos
Контактная информация:
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Я про них смотрю, что выглядит так:

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

/******************  Bit definition for RCC_AHBENR register  ******************/
#define  RCC_AHBENR_DMA1EN                   ((uint16_t)0x0001)            /*!< DMA1 clock enable */
Нету у мня тут (1<<pos)

Как я понимаю, у меня в хидере просто объявлено название бита, которому присвоено 16 битное число, которое равно 1. И 16 бит, потому что обращается (относится) только к младшей половине регистра...

Поэтому и недопонимаю. )

Добавлено after 17 minutes 38 seconds:
Прошу прощения, но я помню, что на АВР писал именно подобное (1<<PIN2) и т.д. Оттуда это осталось. Можно было значит и в АВР писать также не заморачиваясь?
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3898946#p3898946"]Нету у мня тут (1<<pos)[/uquote]Даже при pos равном нулю? :)

Добавлено after 4 minutes 8 seconds:
Где, вы, кстати, такой заголовочный файл нашли? Сейчас это всё вот так объявляется

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

/******************  Bit definition for RCC_AHBENR register  ******************/
#define RCC_AHBENR_DMA1EN_Pos                (0U)                              
#define RCC_AHBENR_DMA1EN_Msk                (0x1U << RCC_AHBENR_DMA1EN_Pos)   /*!< 0x00000001 */
#define RCC_AHBENR_DMA1EN                    RCC_AHBENR_DMA1EN_Msk             /*!< DMA1 clock enable */
#define RCC_AHBENR_SRAMEN_Pos                (2U)                              
#define RCC_AHBENR_SRAMEN_Msk                (0x1U << RCC_AHBENR_SRAMEN_Pos)   /*!< 0x00000004 */
#define RCC_AHBENR_SRAMEN                    RCC_AHBENR_SRAMEN_Msk             /*!< SRAM interface clock enable */
#define RCC_AHBENR_FLITFEN_Pos               (4U)                              
#define RCC_AHBENR_FLITFEN_Msk               (0x1U << RCC_AHBENR_FLITFEN_Pos)  /*!< 0x00000010 */
#define RCC_AHBENR_FLITFEN                   RCC_AHBENR_FLITFEN_Msk            /*!< FLITF clock enable */
#define RCC_AHBENR_CRCEN_Pos                 (6U)                              
#define RCC_AHBENR_CRCEN_Msk                 (0x1U << RCC_AHBENR_CRCEN_Pos)    /*!< 0x00000040 */
#define RCC_AHBENR_CRCEN                     RCC_AHBENR_CRCEN_Msk              /*!< CRC clock enable */
Реклама
Эиком - электронные компоненты и радиодетали
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

:shock: Кстати, на это не обратил внимание.. Вроде не вижу в хидере названий битов с нулевым номером.... :dont_know: НЕТ. Все же нашел..
Тогда совсем запутали...
Можно более развернуто ткнуть носом? :oops: :cry:

Добавлено after 4 minutes 57 seconds:
В самом Кейле нашел...... версии 5.18а Вот с таким названием: stm32f10x.h

Добавлено after 1 minute 38 seconds:
И что-то я начал подозревать, почему у нас разное понимание... т.к. в разные файлы смотрим...
Станислав
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Вы в какой среде программирования пишете?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Кейл. ) Бесплатно до 32 кБайт. Пока хватит.

Добавлено after 14 minutes 35 seconds:
А можете, пожалуйста свой заголовочный кинуть.. А то у меня в Яндексе выдает такой же. А регистрацию свою на СТ я не помню логин и пароль. (((

Добавлено after 15 minutes 29 seconds:
Все. Пароль вспомнил... Файл скачал... Похоже для Ф103 он одинаковый.... как и есть у меня.
Станислав
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Не нужно ничего ставить вручную, поэтому я спросил об IDE.
Жмите Project -> Manage -> Pack installer (его иконка имеется и на тулбаре).

Откроется окно, в котором слева выбираете свой бренд и МК, пусть будет F103. Затем на правой половине окна кликаете Install на Keil::STM32F1xx_DFP и чуть ниже на ARM::CMSIS.
И так для всех семейств МК, которые планируете использовать.

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

А чтобы посмотреть на всякие разные RCC_AHBENR_DMA1EN, в коде кликаете по ним ПКМ и выбираете Go To Definition of 'RCC_AHBENR_DMA1EN'.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Не совсем понятно по правой части окна... У меня оттуда почти все установлено.... А Ап ту дэйт не дает сделать. Самое новое про КМСИС от 2018 года.

Добавлено after 3 minutes 37 seconds:
"А чтобы посмотреть на всякие разные RCC_AHBENR_DMA1EN, в коде кликаете по ним ПКМ и выбираете Go To Definition of 'RCC_AHBENR_DMA1EN'."
Это да. Так и делаю. )))
Станислав
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Если написано Up to date, значит у вас установлена последняя версия.
Если имеется обновление для установленного, то на кнопке пишется Update.
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот. Я так и понял, что нового заголовочного файла можно не ждать. ) И таких объявлений, как есть для других МК у меня не будет. Значит писать биты надо как я и предполагаю.
типа (1<<название бита)

Добавлено after 10 minutes 11 seconds:
Ой.. не... это не понятное название битов.... ((((

Добавлено after 1 minute 4 seconds:
В файле именно числа, которые записываются...

Вот кусок:

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

/*******************  Bit definition for RCC_CFGR register  *******************/
/*!< SW configuration */
#define  RCC_CFGR_SW                         ((uint32_t)0x00000003)        /*!< SW[1:0] bits (System clock Switch) */
#define  RCC_CFGR_SW_0                       ((uint32_t)0x00000001)        /*!< Bit 0 */
#define  RCC_CFGR_SW_1                       ((uint32_t)0x00000002)        /*!< Bit 1 */

#define  RCC_CFGR_SW_HSI                     ((uint32_t)0x00000000)        /*!< HSI selected as system clock */
#define  RCC_CFGR_SW_HSE                     ((uint32_t)0x00000001)        /*!< HSE selected as system clock */
#define  RCC_CFGR_SW_PLL                     ((uint32_t)0x00000002)        /*!< PLL selected as system clock */
Если я его сравниваю с регистром в РМ, то нулевой и первый бит у меня это все SW. И по сути объявления битов - это видно, что числа, а не названия битов... Хотя, последние два можно отнести к названиям битов. А первый сразу записывает единицы в оба бита SW...

Что-то я совсем путаюсь...

Добавлено after 15 minutes 52 seconds:
Короче, как я понял.... Это не объявления как названия битов. Это объявления сразу с тем, что надо записать в указанные биты, чтобы это заработало...

Типа того?

З.Ы. и писать тогда я могу так:

RCC->CFGR |= (1<<RCC_CFGR_SW_1 ); // наложить маску

либо

RCC->CFGR |= RCC_CFGR_SW_PLL; // наложить маску

либо

RCC->CFGR = RCC_CFGR_SW_PLL; // тупо присвоить, затерев все другие биты

И все будет работать?
Станислав
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

СКАЗОЧНИК писал(а):З.Ы. и писать тогда я могу так:

RCC->CFGR |= (1<<RCC_CFGR_SW_1 );
нет так неверно, потому что 2<<0 уже часть RCC_CFGR_SW_1, больше сдвигов не нужно.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

RCC_CFGR_SW_0 - 0 бит
RCC_CFGR_SW_1 - 1 бит
Имеет два бита поле. добавляете те биты которые нужны согласно референсу.
RCC->CFGR |= RCC_CFGR_SW_1; //10: PLL selected as system clock
или RCC->CFGR |= RCC_CFGR_SW_PLL;

RCC->CFGR |= RCC_CFGR_SW_0; //01: HSE selected as system clock
или RCC->CFGR |= RCC_CFGR_SW_HSE;

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

Bits 1:0 SW[1:0]: System clock Switch
Set and cleared by softwareto select SYSCLK source.
Set by hardware to force HSI selection when leaving Stop and Standby mode or in case of failure of 
the HSE oscillator used directly or indirectly as system clock (if the Clock Security System is 
enabled).
00: HSI selected as system clock
01: HSE selected as system clock
10: PLL selected as system clock
11: Not allowed
AHBENR не управляет включением тактирования порта C.

Чтобы включить GPIOC тактирование:
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6541
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3898938#p3898938"]Вот втупляю все равно....[/uquote]
Экспериментировать с присвоением значений битам удобно наблюдая состояние этих битов в регистрах. В режиме отладки в главном меню IAR жмем Viev-Registers. Правым щелчком мыши по открывшемуся окну выбираем нужную группу регистров и смотрим, к чему приводит использование всех этих |=, & и << в тексте программы. В Кейле тоже должно быть, не может не быть.
Астролябия-сама меряет, было бы что мерять!!!
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

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

Сообщение dosikus »

[uquote="Asmodey",url="/forum/viewtopic.php?p=3899164#p3899164"]В режиме отладки в главном меню IAR жмем Viev-Registers. Правым щелчком мыши по открывшемуся окну выбираем нужную группу регистров и смотрим, к чему приводит использование всех этих |=, & и << в тексте программы. В Кейле тоже должно быть, не может не быть.[/uquote]

В кайло точно так же, а еще можно эти биты самому тыкать - снимать/ставить галочки и наблюдать за результатом... :)))
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

:))) Очередной долбо... затуп от меня...

Есть инициализация СисТик

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

#define F_CPU 		72000000UL
	#define TimerTick  	F_CPU/1000-1	// Нам нужен килогерц
	
	SysTick->LOAD=TimerTick;		// Загрузка значения
	SysTick->VAL=TimerTick;		// Обнуляем таймеры и флаги. Записью, помните? 
	SysTick->CTRL &= ~(SysTick_CTRL_CLKSOURCE_Msk); // AHB/8
	SysTick->CTRL |= (SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk);  //IRQ and enable
Т.к. у меня системная частота 72 МГц, то при делении на 8, получаю 9 МГц.
9 МГц период это 0,111111 мкс. (если я все правильно понимаю)
А по формуле выше, я делю частоту 72 МГц...

Так отсчет надо от 72 МГц вести или от 72/8? А то у меня никак 1 кГц не получается в последнем случае.
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Велосипед изобретаем.

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

SysTick_Config(72000000 /1000);  //1ms
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3899474#p3899474"]Так отсчет надо от 72 МГц вести или от 72/8?[/uquote]Можно и так, и так. Управляется битом CLKSOURCE.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Читал, что есть такая функция. ) Просто так почти ближе к железу... )))
Станислав
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Она делает всё то же самое что вы в муках пытаетесь "родить". Ну накрайняк, скопируйте код отуда, если так ближе к железу. Он хотя бы правильный.
Ответить

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