реклама на сайте
подробности

 
 
> Запрограммировать группу битов в регистре, с помощью макроопределения?
ViKo
сообщение Mar 14 2013, 05:01
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Для инициализации отдельных битов в регистрах STM32F207 использую следующее макро. Копирую описание битов из stm32f20x.h, и редактирую в соответсвии с потребностями:
Код
  ADC2->CR2 =
    ADC_CR2_ADON        * 1 |    // A/D Converter ON / OFF
    ADC_CR2_CONT        * 0 |    // Continuous Conversion
    ADC_CR2_DMA        * 0 |    // Direct Memory access mode
    ADC_CR2_DDS        * 0 |    // DMA disable selection (Single ADC)
    ADC_CR2_EOCS        * 0 |    // End of conversion selection
    ADC_CR2_ALIGN        * 0 |    // Data Alignment = Right
    ADC_CR2_JEXTSEL_0    * 1 |    // External event select for injected group - Bit 0 = EXTI_15 PG15
    ADC_CR2_JEXTSEL_1    * 1 |    //    Bit 1
    ADC_CR2_JEXTSEL_2    * 1 |    //    Bit 2
    ADC_CR2_JEXTSEL_3    * 1 |    //    Bit 3
    ADC_CR2_JEXTEN_0    * 0 |    // External Trigger Conversion mode for injected channels - Bit 0 = Fall
    ADC_CR2_JEXTEN_1    * 1 |    //    Bit 1
   ...

Очень наглядно, и удобно манипулировать настройками.
Но не нравится, что группу битов, определяющую некое число (как в JEXTSEL, JEXTEN в данном случае), приходится кодировать побитно. Нет ли простого и красивого способа задать сразу группу одним числом?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Mar 14 2013, 05:12
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Mar 14 2013, 09:01) *
Нет ли простого и красивого способа задать сразу группу одним числом?


Код
#define    ADC_CR2_JEXTSEL0    (ADC_CR2_JEXTSEL_0 * 0)
#define    ADC_CR2_JEXTSEL1    (ADC_CR2_JEXTSEL_0 * 1)
#define    ADC_CR2_JEXTSEL2    (ADC_CR2_JEXTSEL_0 * 2)
#define    ADC_CR2_JEXTSEL3    (ADC_CR2_JEXTSEL_0 * 3)
...
#define    ADC_CR2_JEXTSEL15  (ADC_CR2_JEXTSEL_0 * 15)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 14 2013, 05:39
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(MrYuran @ Mar 14 2013, 08:12) *
Код
#define    ADC_CR2_JEXTSEL0    (ADC_CR2_JEXTSEL_0 * 0)
#define    ADC_CR2_JEXTSEL3    (ADC_CR2_JEXTSEL_0 * 3)
...

Не пойдет. ADC_CR2_JEXTSEL_0 - это ((uint32_t)0x00010000) . Что будет, если его умножить на 3?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 14 2013, 05:49
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Mar 14 2013, 09:39) *
Не пойдет. ADC_CR2_JEXTSEL_0 - это ((uint32_t)0x00010000) . Что будет, если его умножить на 3?

??
0x00030000 = ADC_CR2_JEXTSEL_0 | ADC_CR2_JEXTSEL_1

Разве не это нужно было?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 16:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01531 секунд с 7
ELECTRONIX ©2004-2016