allsettingsdone 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Как вы настраиваете альтернативные функции у GPIO с помощью регистров GPIOx_AFR (например при настройке USART1 на PA9, PA10 на STM32F407VG) ? В стандартном файле описания периферии (stm32f4xx.h) - нет информации и масок для работы с этим регистром. Просто высчитываете сами битовую маску и записываете в этот регистр готовое число? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Некоторые пользуются для этого кубом, но путь настоящего джедая читать описание, по нему находить что надо записать в регистр и писать это туда! битики в макросах объявлены, комбинацию вычисляете по описанию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба путь настоящего джедая читать описание, по нему находить что надо записать в регистр и писать это туда! А что, можно как-то по-другому? Там даже раскладка регистра очень удобно на шестнадцатеричные константы ложится :yeah: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба SPL ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
allsettingsdone 0 20 октября, 2015 Опубликовано 20 октября, 2015 (изменено) · Жалоба Как узнать число, которое нужно записать в AFRH9 и AFRH10, что бы включить альтернативную функцию USART1 на PA9, PA10 на STM32F407? (это число состоит из 4-ёх бит согласно стр. 287 RM0090) Изменено 20 октября, 2015 пользователем allsettingsdone Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Или так... #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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба Типа того. Раньше для альтернативных функций конкретно перечисления создавал (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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RadiatoR 2 20 октября, 2015 Опубликовано 20 октября, 2015 (изменено) · Жалоба Как узнать число, которое нужно записать в 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 Изменено 20 октября, 2015 пользователем ЯadiatoR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 20 октября, 2015 Опубликовано 20 октября, 2015 (изменено) · Жалоба ИМХО, в 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); // То же, но со сдвигом. Изменено 20 октября, 2015 пользователем AlanDrakes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба ну и есть дефайн AF0-AF15, его надо использовать вместо явной константы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 20 октября, 2015 Опубликовано 20 октября, 2015 · Жалоба В 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; (по какой-то глупой причине это приходится явно делать) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба Как вы настраиваете альтернативные функции у GPIO с помощью регистров GPIOx_AFR (например при настройке USART1 на PA9, PA10 на STM32F407VG) ? Странно, что никто не сказал, что единственный правильный путь - это STM32Tpl. Pin<'A',9>::Alternate (ALT_FUNC_USART1); Pin<'A',10>::Alternate (ALT_FUNC_USART1); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба а как этот правильный путь поможет задать альтернативные функции LPC? или право делать процы с альтернативными функциями пинов на арм ядре только у СТМ:)? Правильный путь для любого проца, настроить регистры согласно описанию! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба а как этот правильный путь поможет задать альтернативные функции LPC? Название темы хронически не читаем? Где у LPC регистр GPIOx_AFR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 октября, 2015 Опубликовано 21 октября, 2015 · Жалоба ну это так докопаться.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться