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

 
 
 
Reply to this topicStart new topic
> Для чего в файле stm32f4xx.h эти странные битовые маски?
r44083
сообщение Oct 19 2015, 22:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  stm32f4xx.zip ( 93.04 килобайт ) Кол-во скачиваний: 7
 
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 19 2015, 23:22
Сообщение #2


Профессионал
*****

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



Я поправил структуру GPIO (привел её в соответствие с тем, как она описана в осталных процессорах) - и не пришлось переделывать библиотеку ввоа/вывода. Тем более, что в документации этот регистр и описан как 32 бит.
В документе RM0390 (на STM32F446) описание идентично. На stm32f7xx тоже.
В аттачмение Ваша версия заголовочного файла со внсенной правкой.
Да, читать этот регистр нет необходимости (читается всегда ноль), вместо операции |= надо применять просто присвоение =

Сообщение отредактировал Genadi Zawidowski - Oct 19 2015, 23:44
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  stm32f4xx.zip ( 84.27 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Oct 20 2015, 06:55
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 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 одинаковое у всех.
Go to the top of the page
 
+Quote Post
r44083
сообщение Oct 20 2015, 07:54
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Шаманъ
сообщение Oct 20 2015, 08:13
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 23 2015, 23:43
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
r44083
сообщение Oct 25 2015, 13:23
Сообщение #7


Участник
*

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



Вообщем будем ждать пока ST исправят косяк, а пока использовать:

Код
GPIOD->BSRRL |= GPIO_BSRR_BS_12   // Для установки бита
GPIOD->BSRRH |= GPIO_BSRR_BS_12   // Для снятия бита


Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Oct 25 2015, 14:24
Сообщение #8


Профессионал
*****

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



читать этот регистр нет необходимости (читается всегда ноль), вместо операции |= надо применять просто присвоение =
Пока использовать:
Код
GPIOD->BSRRL = GPIO_BSRR_BS_12   // Для установки бита
GPIOD->BSRRH = GPIO_BSRR_BS_12   // Для снятия бита


Сообщение отредактировал Genadi Zawidowski - Oct 25 2015, 14:25
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:54
Рейтинг@Mail.ru


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