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

 
 
 
Reply to this topicStart new topic
> STM32F10x библиотека работы с GPIO
Beginning
сообщение Nov 22 2011, 06:51
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



Разбираюсь с камнем STM32F100. Изучаю инициализацию. Т.в. стандартная библиотека инициализации stm32f10x_gpio не понравилась, а конкретнее void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
Мои желания были следующие – максимальная быстрота инициализации GPIO, максимальное удобство. Насчёт быстроты понятно – слишком много операторов, не комильфо, а цикл поиска вообще убил. Ладно, попробовал воспользоваться. Т.в. удобством тоже не пахнет. От количества структур в глазах начало рябить, и это только от инициализации одного порта. Сделал свою инициализацию. Меня устраивает и скорость и наглядность. Покритикуйте.
CODE


//**************GPIO mode*************
#define Input 0
#define Output_10MHz 1
#define Output_2MHz 2
#define Output_50MHz 3

//**************GPIO config***********
#define Analog 0
#define Floating 1
#define Pull_up_down 2

#define Push_pull 0
#define Open_drain 1
#define Alternate_fun_Push_pull 2
#define Alternate_fun_Open_drain 3


//PORTA************************************************
GPIOA.CRL=
//Pin0----
(Output_2MHz << 0) |(Push_pull << 2)| //no
//Pin1----
(Output_2MHz << 4) |(Push_pull << 6)| //no
//Pin2----
(Output_2MHz << 8) |(Push_pull << 10)| //no
//Pin3----
(Output_2MHz << 12)|(Push_pull << 14)| //no
//Pin4----
(Output_2MHz << 16)|(Push_pull << 18)| //no
//Pin5----
(Output_2MHz << 20)|(Push_pull << 22)| //no
//Pin6----
(Output_2MHz << 24)|(Push_pull << 26)| //no
//Pin7----
(Output_2MHz << 28)|(Push_pull << 30); //no
//--------
GPIOA.CRH=
//Pin8----
(Output_2MHz << 0) |(Push_pull << 2)| //GSM_Pwr_key
//Pin9----
(Input << 4) |(Floating << 6)| //RX
//Pin10----
(Input << 8) |(Floating << 10)| //TX
//Pin11----
(Output_2MHz << 12)|(Push_pull << 14)| //non func
//Pin12----
(Output_2MHz << 16)|(Push_pull << 18)| //Pow_GSM
//Pin13----
(Output_2MHz << 20)|(Push_pull << 22)| //no
//Pin14----
(Output_2MHz << 24)|(Push_pull << 26)| //no
//Pin15----
(Output_2MHz << 28)|(Push_pull << 30); //no
//====================
GPIOA.ODR = (0<<0)|
(0<<1)|
(0<<2)|
(0<<3)|
(0<<4)|
(0<<5)|
(0<<6)|
(0<<7)|
(0<<8)|
(0<<9)|
(0<<10)|
(0<<11)|
(0<<12)|
(0<<13)|
(0<<14)|
(0<<15);


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 22 2011, 07:23
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



CODE

/* Port bit configuration table */
typedef enum {
IN_ANALG, GPO_PP10, GPO_PP02, GPO_PP50, // Input Analog, GP Output Push-pull 10-2-50MHz
IN_FLOAT, GPO_OD10, GPO_OD02, GPO_OD50, // Input Float, GP Output Open-drain 10-2-50MHz
IN_PD_PU, AFO_PP10, AFO_PP02, AFO_PP50, // Input Pull-down/Pull-up, Alt Func Push-pull
CFG_None, AFO_OD10, AFO_OD02, AFO_OD50 // none(illegal), Alt Func Open-drain 10-2-50MHz
} CFG_MODE;

/*!
*******************************************************************************
* @brief Port Low/High byte configuration
* @details Конфигурация байтов порта целиком
* @param PORT - имя порта (A..G)
* @param CM15..CM00 - конфигурация битов 15..0
* @return нет
* @note Используется перечисляемый тип CFG_MODE
* @note Для IN_PD_PU нужный pull-down/pull-up задается в ODR
*******************************************************************************/
#define GPIO_PORTL_CFG(PORT,CM07,CM06,CM05,CM04,CM03,CM02,CM01,CM00) \
GPIO##PORT->CRL = (CM07<<28|CM06<<24|CM05<<20|CM04<<16|CM03<<12|CM02<<8|CM01<<4|CM00)

#define GPIO_PORTH_CFG(PORT,CM15,CM14,CM13,CM12,CM11,CM10,CM09,CM08) \
GPIO##PORT->CRH = (CM15<<28|CM14<<24|CM13<<20|CM12<<16|CM11<<12|CM10<<8|CM09<<4|CM08)

/*!
*******************************************************************************
* @brief Bit of Low/High byte Port configuration
* @details Конфигурация одиночного бита порта
* @param PORT - имя порта (A..G)
* @param BIT - номер бита (0..15)
* @param CM - конфигурация бита
* @return нет
* @note Используется перечисляемый тип CFG_MODE
* @note Для IN_PD_PU нужный pull-down/pull-up задается в ODR
*******************************************************************************/
#define GPIO_LBIT_CFG(PORT,BIT,CM) \
GPIO##PORT->CRL = GPIO##PORT->CRL & (~(0xf<<BIT*4)) | (CM<<BIT*4)

#define GPIO_HBIT_CFG(PORT,BIT,CM) \
GPIO##PORT->CRH = GPIO##PORT->CRH & (~(0xf<<(BIT-8)*4)) | (CM<<(BIT-8)*4)



Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 22 2011, 08:18
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Фтопку эти "библиотеки". Не хватает ещё к своему глюкодрому прикручивать чужой.
Программировать регистры напрямую шестнадцатеричными значениями. Рядом писать комментарий.
Или простенькие макросы для битовых полей, а также именовать используемые константы.
Go to the top of the page
 
+Quote Post
sevastianovd
сообщение Nov 22 2011, 09:03
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 78
Регистрация: 8-04-08
Из: Омск
Пользователь №: 36 562



так себе наглядно, и совсем не удобно.
в скорости выиграли? на сколько?

все-таки библиотека stm выдержана в одном стиле. для меня она удобна.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Nov 22 2011, 09:29
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053



По скорости - у меня одна загрузка числа в регистр. В библиотеке - посмотрите сами (я смотрел), чего стоит только вот этот код:
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = ((u32)0x01) << pinpos;
/* Get the port pins position */
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;

if (currentpin == pos)
{ ....

По поводу наглядности - я вначале написал код с использованием библиотеки. Получились сплошные инициализации структур. Мой код - своеобразная таблица - горзонталь пины, вертикаль функции пинов, ячейки - конфигурация. Быстрый поиск и изменение. Или я не прав?


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 22 2011, 09:31
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Не знаю, к чему/кому относятся предыдущие сообщения. sm.gif
Регистры программирую напрямую, тем, что показал. Удобно. Наглядно. Какие там могут быть глюки?
В скорости выигрываю. В объеме кода - значительно выигрываю!
С библиотекой разбирался, впечатление - гнетущее.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2011, 09:49
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Beginning @ Nov 22 2011, 12:29) *
Или я не прав?
Прав, прав. В качестве улучшений: позаимствуйте у ViKo идею enum вместо #define, а "столбики" инициализации удобно писать в таком виде:
CODE
    GPIOA->ODR = 0
            | (1 << 15)     // TDI, pull-up
            | (0 << 14)     // TCK, pull-down
            | (1 << 13)     // TMS, pull-up
            | (0 << 12)     // IN4
            | (0 << 11)     // EXC
            | (0 << 10)     // RX_232
            | (1 << 9)      // TX_232
            | (0 << 8)      // PWR_CTL
            | (0 << 7)      // PWR_OK
            | (0 << 6)      // IN6
            | (0 << 5)      // MOD2
            | (0 << 4)      // MOD1
            | (0 << 3)      // IN7
            | (0 << 2)      // IN8
            | (0 << 1)      // IN5
            | (0 << 0)      // IN3
           ;
Так можно закомментировать или методом copy-paste добавить не только средние, но и первое и последее подвыражения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:13
Рейтинг@Mail.ru


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