a5021 писал(а):Кто-нибудь знает ответ на вопрос, зачем потребовалось объявлять данные регистры в виде массива? Должна же быть какая-то причина.
так делается для работы с ними в циклах.
a5021 писал(а):Кто-нибудь знает ответ на вопрос, зачем потребовалось объявлять данные регистры в виде массива? Должна же быть какая-то причина.
a5021 писал(а):Если честно, я как-то не очень представляю назначение альтернативных функций выводам МК в цикле. Нет, делать это, разумеется, можно. Делать сколь-нибудь осмысленно, с этим проблема.
Код: Выделить всё
void GPIO_af_cfg(GPIO_TypeDef *GPIOx, uint16_t Pin, uint8_t AF) {
uint32_t AFR = GPIOx->AFR[Pin >> 3];
// Set the alternative function for a GPIO pin
AFR &= ~GPIO_AF_MSK(Pin & 0x07);
AFR |= GPIO_AF_SET(Pin & 0x07,AF);
// Write new value of the alternate function register
GPIOx->AFR[Pin >> 3] = AFR;
}Код: Выделить всё
GPIOx->AFR[Port_Part]|=(AFR_volume<<(4*Pin_Number));Код: Выделить всё
GPIOx->AFR[Pin>>3] |= (Pin_value) <<((Pin & 0x7)<<2);Код: Выделить всё
#define SELECT_AF(GPIO, PIN, AF) GPIO->AFR[PIN >> 3] |= (AF << 4 * ((PIN > 7) ? PIN - 8 : PIN));
#define CONFIGURE_AF(GPIO, PIN, AF) if (PIN > 7) {\
GPIO->AFR[1] |= AF << (4 * (PIN - 8));\
} else {\
GPIO->AFR[0] |= (AF << (4 * PIN));\
}
Код: Выделить всё
#define PIN_AF(GPIO, PIN, AF) GPIO->AFR[PIN >> 3] |= AF << ((PIN & 0x7) << 2)Код: Выделить всё
/****************** Bit definition for GPIO_AFRL register ********************/
#define GPIO_AFRL_AFRL0_Pos (0U)
#define GPIO_AFRL_AFRL0_Msk (0xFU << GPIO_AFRL_AFRL0_Pos) /*!< 0x0000000F */
#define GPIO_AFRL_AFRL0 GPIO_AFRL_AFRL0_Msk
#define GPIO_AFRL_AFRL1_Pos (4U)
#define GPIO_AFRL_AFRL1_Msk (0xFU << GPIO_AFRL_AFRL1_Pos) /*!< 0x000000F0 */
#define GPIO_AFRL_AFRL1 GPIO_AFRL_AFRL1_Msk
#define GPIO_AFRL_AFRL2_Pos (8U)
#define GPIO_AFRL_AFRL2_Msk (0xFU << GPIO_AFRL_AFRL2_Pos) /*!< 0x00000F00 */
#define GPIO_AFRL_AFRL2 GPIO_AFRL_AFRL2_Msk
#define GPIO_AFRL_AFRL3_Pos (12U)
#define GPIO_AFRL_AFRL3_Msk (0xFU << GPIO_AFRL_AFRL3_Pos) /*!< 0x0000F000 */
#define GPIO_AFRL_AFRL3 GPIO_AFRL_AFRL3_Msk
#define GPIO_AFRL_AFRL4_Pos (16U)
#define GPIO_AFRL_AFRL4_Msk (0xFU << GPIO_AFRL_AFRL4_Pos) /*!< 0x000F0000 */
#define GPIO_AFRL_AFRL4 GPIO_AFRL_AFRL4_Msk
#define GPIO_AFRL_AFRL5_Pos (20U)
#define GPIO_AFRL_AFRL5_Msk (0xFU << GPIO_AFRL_AFRL5_Pos) /*!< 0x00F00000 */
#define GPIO_AFRL_AFRL5 GPIO_AFRL_AFRL5_Msk
#define GPIO_AFRL_AFRL6_Pos (24U)
#define GPIO_AFRL_AFRL6_Msk (0xFU << GPIO_AFRL_AFRL6_Pos) /*!< 0x0F000000 */
#define GPIO_AFRL_AFRL6 GPIO_AFRL_AFRL6_Msk
#define GPIO_AFRL_AFRL7_Pos (28U)
#define GPIO_AFRL_AFRL7_Msk (0xFU << GPIO_AFRL_AFRL7_Pos) /*!< 0xF0000000 */
#define GPIO_AFRL_AFRL7 GPIO_AFRL_AFRL7_Msk
/****************** Bit definition for GPIO_AFRH register ********************/
#define GPIO_AFRH_AFRH0_Pos (0U)
#define GPIO_AFRH_AFRH0_Msk (0xFU << GPIO_AFRH_AFRH0_Pos) /*!< 0x0000000F */
#define GPIO_AFRH_AFRH0 GPIO_AFRH_AFRH0_Msk
#define GPIO_AFRH_AFRH1_Pos (4U)
#define GPIO_AFRH_AFRH1_Msk (0xFU << GPIO_AFRH_AFRH1_Pos) /*!< 0x000000F0 */
#define GPIO_AFRH_AFRH1 GPIO_AFRH_AFRH1_Msk
#define GPIO_AFRH_AFRH2_Pos (8U)
#define GPIO_AFRH_AFRH2_Msk (0xFU << GPIO_AFRH_AFRH2_Pos) /*!< 0x00000F00 */
#define GPIO_AFRH_AFRH2 GPIO_AFRH_AFRH2_Msk
#define GPIO_AFRH_AFRH3_Pos (12U)
#define GPIO_AFRH_AFRH3_Msk (0xFU << GPIO_AFRH_AFRH3_Pos) /*!< 0x0000F000 */
#define GPIO_AFRH_AFRH3 GPIO_AFRH_AFRH3_Msk
#define GPIO_AFRH_AFRH4_Pos (16U)
#define GPIO_AFRH_AFRH4_Msk (0xFU << GPIO_AFRH_AFRH4_Pos) /*!< 0x000F0000 */
#define GPIO_AFRH_AFRH4 GPIO_AFRH_AFRH4_Msk
#define GPIO_AFRH_AFRH5_Pos (20U)
#define GPIO_AFRH_AFRH5_Msk (0xFU << GPIO_AFRH_AFRH5_Pos) /*!< 0x00F00000 */
#define GPIO_AFRH_AFRH5 GPIO_AFRH_AFRH5_Msk
#define GPIO_AFRH_AFRH6_Pos (24U)
#define GPIO_AFRH_AFRH6_Msk (0xFU << GPIO_AFRH_AFRH6_Pos) /*!< 0x0F000000 */
#define GPIO_AFRH_AFRH6 GPIO_AFRH_AFRH6_Msk
#define GPIO_AFRH_AFRH7_Pos (28U)
#define GPIO_AFRH_AFRH7_Msk (0xFU << GPIO_AFRH_AFRH7_Pos) /*!< 0xF0000000 */
#define GPIO_AFRH_AFRH7 GPIO_AFRH_AFRH7_Msk
dosikus писал(а):Любовь к макросам всегда печальна
scorpi_0n писал(а):Дв всё нормально. Новичковые вопросы от новичка в новичковой теме.
СТМ предоставил несколько вариантов работы с AFR.
Ведь к чему-то a5021 ведёт? Только пока непонятно к чему.
Код: Выделить всё
__IO uint32_t AFR[2]; /*!< GPIO alternate function low register, Address offset: 0x20-0x24 */Вам уже ответили, что для удобства пользования. Или по-вашему в документации к МК нужно было написать, что 2 регистра в МК объявлены массивом? Вы путаете программный продукт и документацию на железо.a5021 писал(а):нафига AFR объявлен массивом, а в мануале описан двумя отдельными регистрами.
Что-то Вы путаете. Сдвиг там идет на 3 разряда, что равносильно целочисленному делению на 8. 15ый пин попадет как раз в 1 ую ячейку массива (15/8=1).a5021 писал(а):Один особо бойкий старичок было предложил сдвигать маску AF влево, вплоть до шестидесяти позиций, но это скорее стоит списать на старческий маразм, чем на продукт мыслительного процесса.
Либо через массив, либо через L-H регистры.a5021 писал(а):И какие это варианты?
Просто опечатка из-за копипасты.a5021 писал(а):Тут про какой-то low register говорят
ibiza11 писал(а):Вам уже ответили, что для удобства пользования.
Или по-вашему в документации к МК нужно было написать, что 2 регистра в МК объявлены массивом?
Вы путаете программный продукт и документацию на железо.
Что-то Вы путаете. Сдвиг там идет на 3 разряда, что равносильно целочисленному делению на 8. 15ый пин попадет как раз в 1 ую ячейку массива (15/8=1).
Код: Выделить всё
GPIOx->AFR[Port_Part]|=(AFR_volume<<(4*Pin_Number));Либо через массив, либо через L-H регистры.
Просто опечатка из-за копипасты.
По поводу Вашего стиля общения - прошу уважительно относиться к остальным участникам форума, без оскорблений
a5021 писал(а):Речь шла о крайне неудачном предложении обращаться к регистру следующим образом:Код: Выделить всё
GPIOx->AFR[Port_Part]|=(AFR_volume<<(4*Pin_Number));
Здесь 15-й пин не пересчитывается и сдвинет маску на 60 двоичных разрядов.
[