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

 
 
> Как вы работаете с регистрами GPIOx_AFR?
allsettingsdone
сообщение Oct 20 2015, 08:11
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284



Как вы настраиваете альтернативные функции у GPIO с помощью регистров GPIOx_AFR (например при настройке USART1 на PA9, PA10 на STM32F407VG) ? В стандартном файле описания периферии (stm32f4xx.h) - нет информации и масок для работы с этим регистром. Просто высчитываете сами битовую маску и записываете в этот регистр готовое число?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alechek
сообщение Oct 26 2015, 08:52
Сообщение #2


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

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Инициалиация в одном месте хорошо. Но иногда не прокатывает: при работе с встраиваемыми модулями (GSM и прочие) сразу инициализировать ноги нельзя, вначале надо подать на модуль питание. И, соотвественно, иницалиировать в третье состяоние при снятии питания.
Таким образом, инциализация ног происходит не разово, а постоянно в работе.
Для LPC и STM создан "drv_gpio"

Все регистры для установки ног вычиляются внутри функции IO_SetupPin(..)
С одной стороны, лишние накладные расходы, с другой - код намного читабельнее и понятнее.
Единстенное, что никак не стандартизируешь - вариант альтернативной конфиграции ноги. Тут уж придется лезть в даташит.

CODE
#ifndef __DRV_IOPORTS_H
#define __DRV_IOPORTS_H

enum __pindirection {
PIN_IN,
PIN_OUT,
PIN_ALTOUT
};

enum __pullupmode {
ppullINACTIVE = 0,
ppullDOWN,
ppullUP,
ppullREPEATER
};

enum __pinslew {
pslewENABLED = 0,
pslewDISABLED = 1
};

enum __pinmode {
pinNORMAL = 0,
pinOPENDRAIN = 1,
pinANALOG = 2,
};

enum __pinfilter {
pglfENABLED = 0,
pglfDISABLED = 1
};

enum __pinntest_res {
PIN_OK,
PIN_SHORTLOW,
PIN_SHORTHIGH
};

#define pmANALOG 0
#define pmDIGITAL 1

#define PORTA A
#define PORTB B
#define PORTC C
#define PORTD D
#define PORTE E
#define PORTF F

#define PORTABASE ((void*)&GPIOA_CRL)
#define PORTBBASE ((void*)&GPIOB_CRL)
#define PORTCBASE ((void*)&GPIOC_CRL)
#define PORTDBASE ((void*)&GPIOD_CRL)
#define PORTEBASE ((void*)&GPIOE_CRL)

#define _PORTBASE(port) ((void*)&(GPIO ## port ## _CRL))

#define _PORTSET(port) GPIO ## port ## _BSRR
#define _PORTCLR(port) GPIO ## port ## _BRR
#define _PORTPIN(port) GPIO ## port ## _IDR

#define PORTSET(port) _PORTSET(port)
#define PORTCLR(port) _PORTCLR(port)
#define PORTPIN(port) _PORTPIN(port)
#define PINSET(port, pin) _PORTSET(port) = BIT(pin)
#define PINCLR(port, pin) _PORTCLR(port) = BIT(pin)
#define PINREAD(port, pin) (!!(_PORTPIN(port) & BIT(pin)))

#define PINSETUP(port, pin, dir, pu, pm, s, f) \
IO_SetupPin(_PORTBASE(port), pin, dir, pu, pm, s, f)

#define PINMODE(port, pin, mode)

#define PINDIR(dir, port, pin) IO_PinDir(dir, port, (1UL << pin))


#ifdef __cplusplus
extern "C" {
#endif

void IO_Init(void);

void IO_SetupPin(void * portbase,
int pin,
enum __pindirection dir,
enum __pullupmode pumode,
enum __pinmode pinmode,
enum __pinslew slewrate,
enum __pinfilter filter);


enum __pinntest_res
IO_PinTest(int port, int pin);

void IO_PinDir(enum __pindirection dir, int port, unsigned long pinmask);

#ifdef __cplusplus
}
#endif


#endif //__DRV_IOPORTS_H
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- allsettingsdone   Как вы работаете с регистрами GPIOx_AFR?   Oct 20 2015, 08:11
- - Golikov A.   Некоторые пользуются для этого кубом, но путь наст...   Oct 20 2015, 08:15
|- - scifi   Цитата(Golikov A. @ Oct 20 2015, 11:15) п...   Oct 20 2015, 08:29
- - smalcom   SPL )   Oct 20 2015, 08:41
- - allsettingsdone   Как узнать число, которое нужно записать в AFRH9 и...   Oct 20 2015, 08:51
|- - ЯadiatoR   Цитата(allsettingsdone @ Oct 20 2015, 11...   Oct 20 2015, 09:24
- - Genadi Zawidowski   Или так... Код #define arm_stm32f30x_hardware_pi...   Oct 20 2015, 08:53
- - ViKo   Типа того. Раньше для альтернативных функций конкр...   Oct 20 2015, 08:56
- - AlanDrakes   ИМХО, в Datasheet на STM32F407, страница 61, описа...   Oct 20 2015, 10:17
- - Golikov A.   ну и есть дефайн AF0-AF15, его надо использовать в...   Oct 20 2015, 11:23
- - Эдди   В opencm3 нужные макросы есть. И даже функции врод...   Oct 20 2015, 11:24
- - esaulenka   Цитата(allsettingsdone @ Oct 20 2015, 11...   Oct 21 2015, 11:44
- - Golikov A.   а как этот правильный путь поможет задать альтерна...   Oct 21 2015, 13:12
|- - AHTOXA   Цитата(Golikov A. @ Oct 21 2015, 18:12) а...   Oct 21 2015, 14:46
|- - esaulenka   Цитата(Golikov A. @ Oct 21 2015, 16:12) а...   Oct 22 2015, 06:22
|- - den_po   Цитата(esaulenka @ Oct 22 2015, 09:22) Ес...   Oct 27 2015, 08:03
|- - AHTOXA   Дам ссылку на уже упомянутую в этой теме мою библ...   Oct 27 2015, 08:57
- - Golikov A.   ну это так докопаться....   Oct 21 2015, 14:47
- - adnega   Инициализирую все выводы в одном месте init_GPIO()...   Oct 22 2015, 07:15


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

 


RSS Текстовая версия Сейчас: 2nd August 2025 - 15:12
Рейтинг@Mail.ru


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