|
|
  |
STM32F10x библиотека работы с GPIO |
|
|
|
Nov 22 2011, 06:51
|

Знающий
   
Группа: Свой
Сообщений: 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);
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Nov 22 2011, 07:23
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 22 2011, 09:49
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|