|
|
  |
Для чего в файле stm32f4xx.h эти странные битовые маски? |
|
|
|
Oct 19 2015, 22:18
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 13-09-15
Пользователь №: 88 376

|
Для чего в файле stm32f4xx.h, начиная со стоки №6795, расположены ниже приведенные определения? Если вы считаете, что эти маски можно как-то использовать в рамках GPIO, то приведите пожалуйста конкретный пример. Код #define GPIO_BSRR_BR_0 ((uint32_t)0x00010000) #define GPIO_BSRR_BR_1 ((uint32_t)0x00020000) #define GPIO_BSRR_BR_2 ((uint32_t)0x00040000) #define GPIO_BSRR_BR_3 ((uint32_t)0x00080000) #define GPIO_BSRR_BR_4 ((uint32_t)0x00100000) #define GPIO_BSRR_BR_5 ((uint32_t)0x00200000) #define GPIO_BSRR_BR_6 ((uint32_t)0x00400000) #define GPIO_BSRR_BR_7 ((uint32_t)0x00800000) #define GPIO_BSRR_BR_8 ((uint32_t)0x01000000) #define GPIO_BSRR_BR_9 ((uint32_t)0x02000000) #define GPIO_BSRR_BR_10 ((uint32_t)0x04000000) #define GPIO_BSRR_BR_11 ((uint32_t)0x08000000) #define GPIO_BSRR_BR_12 ((uint32_t)0x10000000) #define GPIO_BSRR_BR_13 ((uint32_t)0x20000000) #define GPIO_BSRR_BR_14 ((uint32_t)0x40000000) #define GPIO_BSRR_BR_15 ((uint32_t)0x80000000) На данный момент мне кажется, что это ошибка в stm32f4xx.h, потому что GPIO_BSRR_BR_x - никак не используется: Код //запись бита GPIOA->BSRRL |= GPIO_BSRR_BS_0;
//сброс бита GPIOA->BSRRH |= GPIO_BSRR_BS_0;
Сообщение отредактировал r44083 - Oct 19 2015, 22:34
|
|
|
|
|
Oct 19 2015, 23:22
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Я поправил структуру GPIO (привел её в соответствие с тем, как она описана в осталных процессорах) - и не пришлось переделывать библиотеку ввоа/вывода. Тем более, что в документации этот регистр и описан как 32 бит. В документе RM0390 (на STM32F446) описание идентично. На stm32f7xx тоже. В аттачмение Ваша версия заголовочного файла со внсенной правкой. Да, читать этот регистр нет необходимости (читается всегда ноль), вместо операции |= надо применять просто присвоение =
Сообщение отредактировал Genadi Zawidowski - Oct 19 2015, 23:44
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 20 2015, 06:55
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(r44083 @ Oct 20 2015, 01:18)  Для чего в файле stm32f4xx.h, начиная со стоки №6795, расположены ниже приведенные определения? Если вы считаете, что эти маски можно как-то использовать в рамках GPIO, то приведите пожалуйста конкретный пример. Например, установить бит 0 и сбросить бит 1 (одновременно). Код GPIOA->BSRR = GPIO_BSRR_BS_0 | GPIO_BSRR_BR_1; Я у себя такое часто использую, правда контроллер stm32f1xx, но вроде GPIO одинаковое у всех.
|
|
|
|
|
Oct 20 2015, 07:54
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 13-09-15
Пользователь №: 88 376

|
Цитата(Шаманъ @ Oct 20 2015, 09:55)  Например, установить бит 0 и сбросить бит 1 (одновременно). Код GPIOA->BSRR = GPIO_BSRR_BS_0 | GPIO_BSRR_BR_1; Я у себя такое часто использую, правда контроллер stm32f1xx, но вроде GPIO одинаковое у всех. В STM32F4 по другому. Регистра "GPIOA_BSRR" нет в файле описания периферии stm32f4xx.h. Такая конструкция работать не будет.
Сообщение отредактировал IgorKossak - Oct 20 2015, 08:26
|
|
|
|
|
Oct 20 2015, 08:13
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(r44083 @ Oct 20 2015, 10:54)  В STM32F4 по другому. Регистра "GPIOA_BSRR" нет в файле описания периферии stm32f4xx.h. Такая конструкция работать не будет. А кто Вам мешает его сделать? Можно как Геннадий сделал, а можно сделать совместимым с любыми вариантами: Код typedef struct { __IO uint32_t MODER; /*!< GPIO port mode register, Address offset: 0x00 */ __IO uint32_t OTYPER; /*!< GPIO port output type register, Address offset: 0x04 */ __IO uint32_t OSPEEDR; /*!< GPIO port output speed register, Address offset: 0x08 */ __IO uint32_t PUPDR; /*!< GPIO port pull-up/pull-down register, Address offset: 0x0C */ __IO uint32_t IDR; /*!< GPIO port input data register, Address offset: 0x10 */ __IO uint32_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */ union { struct { __IO uint16_t BSRRL; /*!< GPIO port bit set register */ __IO uint16_t BSRRH; /*!< GPIO port bit reset register */ }; __IO uint32_t BSRR; /*!< GPIO port bit set/reset register, Address offset: 0x18 */ }; __IO uint32_t LCKR; /*!< GPIO port configuration lock register, Address offset: 0x1C */ __IO uint32_t AFR[2]; /*!< GPIO alternate function registers, Address offset: 0x20-0x24 */ } GPIO_TypeDef;
|
|
|
|
|
Oct 23 2015, 23:43
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Ну вот... польстился я на свеженький файл от ST... А там старые грабли! Из версии в верисю кочует ошибка со значениями регистров SAI. Для инофрмации, в файлах stm32f7xx эта ошибка уже исправлена. А по основной теме - пришлось использовать такое: Код #if CPUSTYLE_STM32F10X #define BSRR_S(v) ((v) * GPIO_BSRR_BS0) /* Преобразование значения для установки бита в регистре */ #define BSRR_C(v) ((v) * GPIO_BSRR_BR0) /* Преобразование значения для сброса бита в регистре */ #else #define BSRR_S(v) ((v) * GPIO_BSRR_BS_0) /* Преобразование значения для установки бита в регистре */ #define BSRR_C(v) ((v) * GPIO_BSRR_BR_0) /* Преобразование значения для сброса бита в регистре */ #endif И вот использование: Код #define arm_stm32f4xx_hardware_pio_setstate(gpio, opins, initialstate) \ do { \ (gpio)->BSRR = \ BSRR_S((initialstate) & (opins)) | /* set bits */ \ BSRR_C(~ (initialstate) & (opins)) | /* reset bits */ \ 0; \ } while (0)
Сообщение отредактировал Genadi Zawidowski - Oct 23 2015, 23:27
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 25 2015, 13:23
|

Участник

Группа: Участник
Сообщений: 25
Регистрация: 13-09-15
Пользователь №: 88 376

|
Вообщем будем ждать пока ST исправят косяк, а пока использовать: Код GPIOD->BSRRL |= GPIO_BSRR_BS_12 // Для установки бита GPIOD->BSRRH |= GPIO_BSRR_BS_12 // Для снятия бита
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|