Перейти к содержанию
    

Как вы работаете с регистрами GPIOx_AFR?

Как вы настраиваете альтернативные функции у GPIO с помощью регистров GPIOx_AFR (например при настройке USART1 на PA9, PA10 на STM32F407VG) ? В стандартном файле описания периферии (stm32f4xx.h) - нет информации и масок для работы с этим регистром. Просто высчитываете сами битовую маску и записываете в этот регистр готовое число?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Некоторые пользуются для этого кубом, но путь настоящего джедая читать описание, по нему находить что надо записать в регистр и писать это туда!

 

битики в макросах объявлены, комбинацию вычисляете по описанию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

путь настоящего джедая читать описание, по нему находить что надо записать в регистр и писать это туда!

А что, можно как-то по-другому? :biggrin:

Там даже раскладка регистра очень удобно на шестнадцатеричные константы ложится :yeah:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как узнать число, которое нужно записать в AFRH9 и AFRH10, что бы включить альтернативную функцию USART1 на PA9, PA10 на STM32F407? (это число состоит из 4-ёх бит согласно стр. 287 RM0090)

Изменено пользователем allsettingsdone

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или так...

 

        #define arm_stm32f30x_hardware_pio_altfn(gpio, opins, afn) \
            { \
                const portholder_t lo = power4((opins) >> 0); \
                const portholder_t hi = power4((opins) >> 8); \
                (gpio)->AFR [0] = ((gpio)->AFR [0] & ~ (lo * 0x0f)) | (lo * (afn)); \
                (gpio)->AFR [1] = ((gpio)->AFR [1] & ~ (hi * 0x0f)) | (hi * (afn)); \
            } while (0)

pio.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Типа того. Раньше для альтернативных функций конкретно перечисления создавал (typedef enum { AF_SYSTEM, AF_TIM1, AF_TIM2 = 1, AF_TIM3...), потом перестал.

/*! GPIO Mode Type */
typedef enum {
 MD_IN,			//!< Input *
 MD_GO,			//!< General purpose output
 MD_AF,			//!< Alternate function
 MD_AN				//!< Analog  
} GPIO_MODE_t;

/*! GPIO Output Type */
typedef enum {
 OT_PP,			//!< Output push-pull*
 OT_OD				//!< Output open-drain
} GPIO_OTYPE_t;

/*! GPIO Output Speed Type */
typedef enum {
 SP_LO,			//!< 2 MHz Low speed *
 SP_ME,			//!< 10 MHz Medium speed
			//   2 MHz
 SP_HI = 3			//!< 50 MHz High speed
} GPIO_OSPEED_t;

/*! GPIO Pull-Up_Pull-Down Type */
typedef enum {
 PL_NP,			//!< No pull-up, pull-down *
 PL_PU,			//!< Pull-up
 PL_PD				//!< Pull-down
			//   Reserved
} GPIO_PUPD_t;

/*! GPIO Alternate Functions
The specific alternate function assignments for each pin are detailed in 
the device datasheet */
typedef enum {
 AF_00,			//!< AF0 *
 AF_01,			//!< AF1
 AF_02,			//!< AF2
 AF_03,			//!< AF3
 AF_04,			//!< AF4
 AF_05,			//!< AF5
 AF_06,			//!< AF6
 AF_07,			//!< AF7
 AF_08,			//!< AF8
 AF_09,			//!< AF9
 AF_10,			//!< AF10
 AF_11,			//!< AF11
 AF_12,			//!< AF12
 AF_13,			//!< AF13
 AF_14,			//!< AF14
 AF_15				//!< AF15
} GPIO_AFLH_t;

#define GPIO_CONF(PORT, 						\
MD00, OT00, SP00, PL00, AF00,					\
MD01, OT01, SP01, PL01, AF01,					\
MD02, OT02, SP02, PL02, AF02,					\
MD03, OT03, SP03, PL03, AF03,					\
MD04, OT04, SP04, PL04, AF04,					\
MD05, OT05, SP05, PL05, AF05,					\
MD06, OT06, SP06, PL06, AF06,					\
MD07, OT07, SP07, PL07, AF07,					\
MD08, OT08, SP08, PL08, AF08,					\
MD09, OT09, SP09, PL09, AF09,					\
MD10, OT10, SP10, PL10, AF10,					\
MD11, OT11, SP11, PL11, AF11,					\
MD12, OT12, SP12, PL12, AF12,					\
MD13, OT13, SP13, PL13, AF13,					\
MD14, OT14, SP14, PL14, AF14,					\
MD15, OT15, SP15, PL15, AF15);					\
GPIO##PORT->MODER = (							\
MD00 <<  0 | MD01 <<  2 | MD02 <<  4 | MD03 <<  6 |		\
MD04 <<  8 | MD05 << 10 | MD06 << 12 | MD07 << 14 |		\
MD08 << 16 | MD09 << 18 | MD10 << 20 | MD11 << 22 |		\
MD12 << 24 | MD13 << 26 | MD14 << 28 | (uint32_t)MD15 << 30);	\
GPIO##PORT->OTYPER = (							\
OT00 <<  0 | OT01 <<  1 | OT02 <<  2 | OT03 <<  3 |		\
OT04 <<  4 | OT05 <<  5 | OT06 <<  6 | OT07 <<  7 |		\
OT08 <<  8 | OT09 <<  9 | OT10 << 10 | OT11 << 11 |		\
OT12 << 12 | OT13 << 13 | OT14 << 14 | (uint32_t)OT15 << 15);	\
GPIO##PORT->OSPEEDR = (							\
SP00 <<  0 | SP01 <<  2 | SP02 <<  4 | SP03 <<  6 |		\
SP04 <<  8 | SP05 << 10 | SP06 << 12 | SP07 << 14 |		\
SP08 << 16 | SP09 << 18 | SP10 << 20 | SP11 << 22 |		\
SP12 << 24 | SP13 << 26 | SP14 << 28 | (uint32_t)SP15 << 30);	\
GPIO##PORT->PUPDR = (							\
PL00 <<  0 | PL01 <<  2 | PL02 <<  4 | PL03 <<  6 |		\
PL04 <<  8 | PL05 << 10 | PL06 << 12 | PL07 << 14 |		\
PL08 << 16 | PL09 << 18 | PL10 << 20 | PL11 << 22 |		\
PL12 << 24 | PL13 << 26 | PL14 << 28 | (uint32_t)PL15 << 30);	\
GPIO##PORT->AFR[0] = (							\
AF00 <<  0 | AF01 <<  4 | AF02 <<  8 | AF03 << 12 |		\
AF04 << 16 | AF05 << 20 | AF06 << 24 | (uint32_t)AF07 << 28);	\
GPIO##PORT->AFR[1] = (							\
AF08 <<  0 | AF09 <<  4 | AF10 <<  8 | AF11 << 12 |		\
AF12 << 16 | AF13 << 20 | AF14 << 24 | (uint32_t)AF15 << 28);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как узнать число, которое нужно записать в AFRH9 и AFRH10, что бы включить альтернативную функцию USART1 на PA9, PA10 на STM32F407? (это число состоит из 4-ёх бит согласно стр. 287 RM0090)

 

В вашем случае так:

GPIOA->AFR[1]|=0x770;

 

Если представить вышеуказанное число в двоичном виде, то у нас получится следующее:

0111 0111 0000.

Как вы и писали на каждую ножку настройка функций идет по 4 битам. Здесь последние 4 бита идут нули, а следующие 8 имеют значение 0х77, что соответствует 7 альтернативной функции (USART1) для вашего контроллера на ножках 9 и 10. Сами назначения функций (зависимость функции от числа) можно посмотреть в таблице альтернативных функций в даташите на контроллер

http://www.st.com/web/en/resource/technica.../DM00037051.pdf

Стр. 61

Изменено пользователем ЯadiatoR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО, в Datasheet на STM32F407, страница 61, описаны альтернативные функции по каждому пину в виде таблицы. Соответственно, AF0 == 0000 (0), AF15 == 1111 (F), etc.

А уже в Reference manual'е описаны сами регистры.

Так что, пример выбора альтертанивной функции #10 для пина #7 будет выглядеть так:

GPIOn->AFRL &= ~(0xF0000000); // Сброс битов альтертанивных функций для пина
GPIOn->AFRL |= (0xA0000000); // Выставляем биты регистра

Либо

GPIOn->AFRL &= ~(0x0F << 28); // То же, но с предварительными сдвигами.
GPIOn->AFRL |= (0x0A << 28); // То же, но со сдвигом.

Изменено пользователем AlanDrakes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В opencm3 нужные макросы есть. И даже функции вроде

gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF, AFIO_MAPR_SPI1_REMAP);

(это я SPI на более удобные ноги переносил) или так:

gpio_primary_remap(AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF, AFIO_MAPR_TIM2_REMAP_PARTIAL_REMAP2);

(а это - переносил таймер на 5-tolerant ноги).

Ну и, естественно, везде в main() до конфигурирования ног делаю

AFIO_MAPR = AFIO_MAPR_SWJ_CFG_JTAG_OFF_SW_OFF;

(по какой-то глупой причине это приходится явно делать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вы настраиваете альтернативные функции у GPIO с помощью регистров GPIOx_AFR (например при настройке USART1 на PA9, PA10 на STM32F407VG) ?

 

Странно, что никто не сказал, что единственный правильный путь - это STM32Tpl.

 

Pin<'A',9>::Alternate (ALT_FUNC_USART1);
Pin<'A',10>::Alternate (ALT_FUNC_USART1);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как этот правильный путь поможет задать альтернативные функции LPC? или право делать процы с альтернативными функциями пинов на арм ядре только у СТМ:)?

 

Правильный путь для любого проца, настроить регистры согласно описанию!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как этот правильный путь поможет задать альтернативные функции LPC?

Название темы хронически не читаем? Где у LPC регистр GPIOx_AFR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...