Configuration Wizard в KEIL. Пример настройки GPIO портов для STM32F4xx

Всем любителям KEIL посвящается:
Благодаря Configuration Wizard, встроенном в KEIL весьма удобно производить настройки в файлах заголовков.
Один из таких файлов мной был написан.


//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
#ifndef STM32F4XX_GPIO_HAL_H
#define STM32F4XX_GPIO_HAL_H

#include "stm32f4xx.h"

//<h> GPIO Configuration
//  <e> GPIOA
#define GPIOA_ENABLE 1
//    <e> GPIOA 00
#define GPIOA00_ENABLE 1
//      <o0> Mode <0=>0x00 - Input<1=>0x01 - General Output<2=>0x02 - Alternate function<3=>0x03 - Analog
//      <o1> Output Type <0=>0x00 - Push - Pull<1=>0x01 - Open drain
//      <o2> Output Speed <0=>0x00 - Low (2MHz)<1=>0x01 - Medium (25MHz)<2=>0x02 - Fast (50MHz)<3=>0x03 - High (100Mhz)
//      <o3> Pull up/down resistors <0=>0x00 - Disable<1=>0x01 - Up<2=>0x02 - Down
//      <o5> Alternate function <0=>0x00 - System<1=>0x01 - TIM1..2<2=>0x02 - TIM3..5<3=>0x03 - TIM8..11<4=>0x04 - I2C1..3<5=>0x05 - SPI1..2<6=>0x06 - SPI3<7=>0x07 - USART1..3<8=>0x08 - USART4..6<9=>0x09 - CAN1..2, TIM12..14<10=>0x0A - OTG_FS, OTG_HS<11=>0x0B - ETH<12=>0x0C - FSMC, SDIO, OTG_HS<13=>0x0D - DCMI<14=>0x0E - LTDC<15=>0x0F - EVENTOUT
//      <o4> Start output level <0=>0x00 - Low<1=>0x01 - High
//      <o6> Locked setup registers <0=>0x00 - Unlocked<1=>0x01 - Locked
#define GPIOA00_MODE			0
#define GPIOA00_TYPE			0
#define GPIOA00_SPEED			0
#define GPIOA00_PULL			0
#define GPIOA00_LEVEL			0
#define GPIOA00_AF			0
#define GPIOA00_LOCKED			0
//    </e>
//    <e> GPIOA 01
#define GPIOA01_ENABLE 1
//      <o0> Mode <0=>0x00 - Input<1=>0x01 - General Output<2=>0x02 - Alternate function<3=>0x03 - Analog
//      <o1> Output Type <0=>0x00 - Push - Pull<1=>0x01 - Open drain
//      <o2> Output Speed <0=>0x00 - Low (2MHz)<1=>0x01 - Medium (25MHz)<2=>0x02 - Fast (50MHz)<3=>0x03 - High (100Mhz)
//      <o3> Pull up/down resistors <0=>0x00 - Disable<1=>0x01 - Up<2=>0x02 - Down
//      <o5> Alternate function <0=>0x00 - System<1=>0x01 - TIM1..2<2=>0x02 - TIM3..5<3=>0x03 - TIM8..11<4=>0x04 - I2C1..3<5=>0x05 - SPI1..2<6=>0x06 - SPI3<7=>0x07 - USART1..3<8=>0x08 - USART4..6<9=>0x09 - CAN1..2, TIM12..14<10=>0x0A - OTG_FS, OTG_HS<11=>0x0B - ETH<12=>0x0C - FSMC, SDIO, OTG_HS<13=>0x0D - DCMI<14=>0x0E - LTDC<15=>0x0F - EVENTOUT
//      <o4> Start output level <0=>0x00 - Low<1=>0x01 - High
//      <o6> Locked setup registers <0=>0x00 - Unlocked<1=>0x01 - Locked
#define GPIOA01_MODE			0
#define GPIOA01_TYPE			0
#define GPIOA01_SPEED			0
#define GPIOA01_PULL			0
#define GPIOA01_LEVEL			0
#define GPIOA01_AF			0
#define GPIOA01_LOCKED			0
//    </e>

ну и так далее.
в самом конце имеется следующее:
#define GPIOA_MODER	(GPIOA00_MODE) | ((GPIOA01_MODE)<<2) | ((GPIOA02_MODE)<<4) | ((GPIOA03_MODE)<<6) |\
				((GPIOA04_MODE)<<8) | ((GPIOA05_MODE)<<10) | ((GPIOA06_MODE)<<12) | ((GPIOA07_MODE)<<14) |\
				((GPIOA08_MODE)<<16) | ((GPIOA09_MODE)<<18) | ((GPIOA10_MODE)<<20) | ((GPIOA11_MODE)<<22) |\
				((GPIOA12_MODE)<<24) | ((GPIOA13_MODE)<<26) | ((GPIOA14_MODE)<<28) | ((GPIOA15_MODE)<<30)
#define GPIOA_OTYPER		(GPIOA00_TYPE) | ((GPIOA01_TYPE)<<1) | ((GPIOA02_TYPE)<<2) | ((GPIOA03_TYPE)<<3) |\
				((GPIOA04_TYPE)<<4) | ((GPIOA05_TYPE)<<5) | ((GPIOA06_TYPE)<<6) | ((GPIOA07_TYPE)<<7) |\
				((GPIOA08_TYPE)<<8) | ((GPIOA09_TYPE)<<9) | ((GPIOA10_TYPE)<<10) | ((GPIOA11_TYPE)<<11) |\
				((GPIOA12_TYPE)<<12) | ((GPIOA13_TYPE)<<13) | ((GPIOA14_TYPE)<<14) | ((GPIOA15_TYPE)<<15)
#define GPIOA_OSPEEDR		(GPIOA00_SPEED) | ((GPIOA01_SPEED)<<2) | ((GPIOA02_SPEED)<<4) | ((GPIOA03_SPEED)<<6) |\
				((GPIOA04_SPEED)<<8) | ((GPIOA05_SPEED)<<10) | ((GPIOA06_SPEED)<<12) | ((GPIOA07_SPEED)<<14) |\
				((GPIOA08_SPEED)<<16) | ((GPIOA09_SPEED)<<18) | ((GPIOA10_SPEED)<<20) | ((GPIOA11_SPEED)<<22) |\
				((GPIOA12_SPEED)<<24) | ((GPIOA13_SPEED)<<26) | ((GPIOA14_SPEED)<<28) | ((GPIOA15_SPEED)<<30)
#define GPIOA_PUPDR		(GPIOA00_PULL) | ((GPIOA01_PULL)<<2) | ((GPIOA02_PULL)<<4) | ((GPIOA03_PULL)<<6) |\
				((GPIOA04_PULL)<<8) | ((GPIOA05_PULL)<<10) | ((GPIOA06_PULL)<<12) | ((GPIOA07_PULL)<<14) |\
				((GPIOA08_PULL)<<16) | ((GPIOA09_PULL)<<18) | ((GPIOA10_PULL)<<20) | ((GPIOA11_PULL)<<22) |\
				((GPIOA12_PULL)<<24) | ((GPIOA13_PULL)<<26) | ((GPIOA14_PULL)<<28) | ((GPIOA15_PULL)<<30)
#define GPIOA_ODR		(GPIOA00_LEVEL) | ((GPIOA01_LEVEL)<<1) | ((GPIOA02_LEVEL)<<2) | ((GPIOA03_LEVEL)<<3) |\
				((GPIOA04_LEVEL)<<4) | ((GPIOA05_LEVEL)<<5) | ((GPIOA06_LEVEL)<<6) | ((GPIOA07_LEVEL)<<7) |\
				((GPIOA08_LEVEL)<<8) | ((GPIOA09_LEVEL)<<9) | ((GPIOA10_LEVEL)<<10) | ((GPIOA11_LEVEL)<<11) |\
				((GPIOA12_LEVEL)<<12) | ((GPIOA13_LEVEL)<<13) | ((GPIOA14_LEVEL)<<14) | ((GPIOA15_LEVEL)<<15)
#define GPIOA_AFRL		(GPIOA00_AF) | ((GPIOA01_AF)<<4) | ((GPIOA02_AF)<<8) | ((GPIOA03_AF)<<12) |\
				((GPIOA04_AF)<<16) | ((GPIOA05_AF)<<20) | ((GPIOA06_AF)<<24) | ((GPIOA07_AF)<<28)
#define GPIOA_AFRH		(GPIOA08_AF) | ((GPIOA09_AF)<<4) | ((GPIOA10_AF)<<8) | ((GPIOA11_AF)<<12) |\
				((GPIOA12_AF)<<16) | ((GPIOA13_AF)<<20) | ((GPIOA14_AF)<<24) | ((GPIOA15_AF)<<28)
#define GPIOA_LCKR		(GPIOA00_LOCKED) | ((GPIOA01_LOCKED)<<1) | ((GPIOA02_LOCKED)<<2) | ((GPIOA03_LOCKED)<<3) |\
				((GPIOA04_LOCKED)<<4) | ((GPIOA05_LOCKED)<<5) | ((GPIOA06_LOCKED)<<6) | ((GPIOA07_LOCKED)<<7) |\
				((GPIOA08_LOCKED)<<8) | ((GPIOA09_LOCKED)<<9) | ((GPIOA10_LOCKED)<<10) | ((GPIOA11_LOCKED)<<11) |\
				((GPIOA12_LOCKED)<<12) | ((GPIOA13_LOCKED)<<13) | ((GPIOA14_LOCKED)<<14) | ((GPIOA15_LOCKED)<<15)
#define GPIOA_MSK1		((GPIOA00_ENABLE) | ((GPIOA01_ENABLE)<<1) | ((GPIOA02_ENABLE)<<2) | ((GPIOA03_ENABLE)<<3) |\
				((GPIOA04_ENABLE)<<4) | ((GPIOA05_ENABLE)<<5) | ((GPIOA06_ENABLE)<<6) | ((GPIOA07_ENABLE)<<7) |\
				((GPIOA08_ENABLE)<<8) | ((GPIOA09_ENABLE)<<9) | ((GPIOA10_ENABLE)<<10) | ((GPIOA11_ENABLE)<<11) |\
				((GPIOA12_ENABLE)<<12) | ((GPIOA13_ENABLE)<<13) | ((GPIOA14_ENABLE)<<14) | ((GPIOA15_ENABLE)<<15))
#define GPIOA_MSK2		((3*!!(GPIOA00_ENABLE)) | ((3*!!(GPIOA01_ENABLE))<<2) | ((3*!!(GPIOA02_ENABLE))<<4) | ((3*!!(GPIOA03_ENABLE))<<6) |\
				((3*!!(GPIOA04_ENABLE))<<8) | ((3*!!(GPIOA05_ENABLE))<<10) | ((3*!!(GPIOA06_ENABLE))<<12) | ((3*!!(GPIOA07_ENABLE))<<14) |\
				((3*!!(GPIOA08_ENABLE))<<16) | ((3*!!(GPIOA09_ENABLE))<<18) | ((3*!!(GPIOA10_ENABLE))<<20) | ((3*!!(GPIOA11_ENABLE))<<22) |\
				((3*!!(GPIOA12_ENABLE))<<24) | ((3*!!(GPIOA13_ENABLE))<<26) | ((3*!!(GPIOA14_ENABLE))<<28) | ((3UL*!!(GPIOA15_ENABLE))<<30))
#define GPIOA_MSK_AFRL		((15*!!(GPIOA00_ENABLE)) | ((15*!!(GPIOA01_ENABLE))<<4) | ((15*!!(GPIOA02_ENABLE))<<8) | ((15*!!(GPIOA03_ENABLE))<<12) |\
				((15*!!(GPIOA04_ENABLE))<<16) | ((15*!!(GPIOA05_ENABLE))<<20) | ((15*!!(GPIOA06_ENABLE))<<24) | ((15UL*!!(GPIOA07_ENABLE))<<28))
#define GPIOA_MSK_AFRH		((15*!!(GPIOA08_ENABLE)) | ((15*!!(GPIOA09_ENABLE))<<4) | ((15*!!(GPIOA10_ENABLE))<<8) | ((15*!!(GPIOA11_ENABLE))<<12) |\
				((15*!!(GPIOA12_ENABLE))<<16) | ((15*!!(GPIOA13_ENABLE))<<20) | ((15*!!(GPIOA14_ENABLE))<<24) | ((15UL*!!(GPIOA15_ENABLE))<<28))

и т.д. для всех портов GPIOA..K

а еще ниже — функции:
typedef struct{
	unsigned int MODER;
	unsigned int OTYPER;
	unsigned int OSPEEDR;
	unsigned int PUPDR;
	unsigned int ODR;
	unsigned int LCKR;
	unsigned int AFRL;
	unsigned int AFRH;
}GPIO_Setup_TypeDef;

typedef struct{
	unsigned int mask1;
	unsigned int mask2;
	unsigned int mask_AFRL;
	unsigned int mask_AFRH;
}GPIO_Mask_TypeDef;

#if GPIOA_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOA_Setup = {GPIOA_MODER, GPIOA_OTYPER, GPIOA_OSPEEDR, GPIOA_PUPDR, GPIOA_ODR, GPIOA_LCKR, GPIOA_AFRL, GPIOA_AFRH};
static const GPIO_Mask_TypeDef GPIOA_Mask = {GPIOA_MSK1, GPIOA_MSK2, GPIOA_MSK_AFRL, GPIOA_MSK_AFRH};
#endif

#if GPIOB_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOB_Setup = {GPIOB_MODER, GPIOB_OTYPER, GPIOB_OSPEEDR, GPIOB_PUPDR, GPIOB_ODR, GPIOB_LCKR, GPIOB_AFRL, GPIOB_AFRH};
static const GPIO_Mask_TypeDef GPIOB_Mask = {GPIOB_MSK1, GPIOB_MSK2, GPIOB_MSK_AFRL, GPIOB_MSK_AFRH};
#endif

#if GPIOC_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOC_Setup = {GPIOC_MODER, GPIOC_OTYPER, GPIOC_OSPEEDR, GPIOC_PUPDR, GPIOC_ODR, GPIOC_LCKR, GPIOC_AFRL, GPIOC_AFRH};
static const GPIO_Mask_TypeDef GPIOC_Mask = {GPIOC_MSK1, GPIOC_MSK2, GPIOC_MSK_AFRL, GPIOC_MSK_AFRH};
#endif

#if GPIOD_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOD_Setup = {GPIOD_MODER, GPIOD_OTYPER, GPIOD_OSPEEDR, GPIOD_PUPDR, GPIOD_ODR, GPIOD_LCKR, GPIOD_AFRL, GPIOD_AFRH};
static const GPIO_Mask_TypeDef GPIOD_Mask = {GPIOD_MSK1, GPIOD_MSK2, GPIOD_MSK_AFRL, GPIOD_MSK_AFRH};
#endif

#if GPIOE_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOE_Setup = {GPIOE_MODER, GPIOE_OTYPER, GPIOE_OSPEEDR, GPIOE_PUPDR, GPIOE_ODR, GPIOE_LCKR, GPIOE_AFRL, GPIOE_AFRH};
static const GPIO_Mask_TypeDef GPIOE_Mask = {GPIOE_MSK1, GPIOE_MSK2, GPIOE_MSK_AFRL, GPIOE_MSK_AFRH};
#endif

#if GPIOF_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOF_Setup = {GPIOF_MODER, GPIOF_OTYPER, GPIOF_OSPEEDR, GPIOF_PUPDR, GPIOF_ODR, GPIOF_LCKR, GPIOF_AFRL, GPIOF_AFRH};
static const GPIO_Mask_TypeDef GPIOF_Mask = {GPIOF_MSK1, GPIOF_MSK2, GPIOF_MSK_AFRL, GPIOF_MSK_AFRH};
#endif

#if GPIOG_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOG_Setup = {GPIOG_MODER, GPIOG_OTYPER, GPIOG_OSPEEDR, GPIOG_PUPDR, GPIOG_ODR, GPIOG_LCKR, GPIOG_AFRL, GPIOG_AFRH};
static const GPIO_Mask_TypeDef GPIOG_Mask = {GPIOG_MSK1, GPIOG_MSK2, GPIOG_MSK_AFRL, GPIOG_MSK_AFRH};
#endif

#if GPIOH_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOH_Setup = {GPIOH_MODER, GPIOH_OTYPER, GPIOH_OSPEEDR, GPIOH_PUPDR, GPIOH_ODR, GPIOH_LCKR, GPIOH_AFRL, GPIOH_AFRH};
static const GPIO_Mask_TypeDef GPIOH_Mask = {GPIOH_MSK1, GPIOH_MSK2, GPIOH_MSK_AFRL, GPIOH_MSK_AFRH};
#endif

#if GPIOI_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOI_Setup = {GPIOI_MODER, GPIOI_OTYPER, GPIOI_OSPEEDR, GPIOI_PUPDR, GPIOI_ODR, GPIOI_LCKR, GPIOI_AFRL, GPIOI_AFRH};
static const GPIO_Mask_TypeDef GPIOI_Mask = {GPIOI_MSK1, GPIOI_MSK2, GPIOI_MSK_AFRL, GPIOI_MSK_AFRH};
#endif

#if GPIOJ_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOJ_Setup = {GPIOJ_MODER, GPIOJ_OTYPER, GPIOJ_OSPEEDR, GPIOJ_PUPDR, GPIOJ_ODR, GPIOJ_LCKR, GPIOJ_AFRL, GPIOJ_AFRH};
static const GPIO_Mask_TypeDef GPIOJ_Mask = {GPIOJ_MSK1, GPIOJ_MSK2, GPIOJ_MSK_AFRL, GPIOJ_MSK_AFRH};
#endif

#if GPIOK_ENABLE == 1
static const GPIO_Setup_TypeDef GPIOK_Setup = {GPIOK_MODER, GPIOK_OTYPER, GPIOK_OSPEEDR, GPIOK_PUPDR, GPIOK_ODR, GPIOK_LCKR, GPIOK_AFRL, GPIOK_AFRH};
static const GPIO_Mask_TypeDef GPIOK_Mask = {GPIOK_MSK1, GPIOK_MSK2, GPIOK_MSK_AFRL, GPIOK_MSK_AFRH};
#endif

static uint32_t Gpio_Lock(GPIO_TypeDef *GPIO, uint16_t mask)
{
	uint32_t first = (1UL<<16) | mask;
	GPIO->LCKR = first;
	GPIO->LCKR = mask;
	GPIO->LCKR = first;
	GPIO->LCKR;
	return GPIO->LCKR;
}

static void Init_Gpio_Once_hal(GPIO_TypeDef *GPIO, const GPIO_Setup_TypeDef *SourceGPIO, const GPIO_Mask_TypeDef* Mask)
{
	GPIO->AFR[0] = (GPIO->AFR[0] & ~Mask->mask_AFRL) | (SourceGPIO->AFRL & Mask->mask_AFRL);
	GPIO->AFR[1] = (GPIO->AFR[1] & ~Mask->mask_AFRH) | (SourceGPIO->AFRH & Mask->mask_AFRH);
	GPIO->PUPDR = (GPIO->PUPDR & ~Mask->mask2) | (SourceGPIO->PUPDR & Mask->mask2);
	GPIO->OTYPER = (GPIO->OTYPER & ~Mask->mask1) | (SourceGPIO->OTYPER & Mask->mask1);
	GPIO->OSPEEDR = (GPIO->OSPEEDR & ~Mask->mask2) | (SourceGPIO->OSPEEDR & Mask->mask2);
	GPIO->ODR = (GPIO->ODR & ~Mask->mask1) | (SourceGPIO->ODR & Mask->mask1);
	GPIO->MODER = (GPIO->MODER & ~Mask->mask2) | (SourceGPIO->MODER & Mask->mask2);
	if(Mask->mask1 & SourceGPIO->LCKR)
		if(Gpio_Lock(GPIO, Mask->mask1 & SourceGPIO->LCKR) != ((Mask->mask1 & SourceGPIO->LCKR)|0x00010000))
			NVIC_SystemReset();
}

static void Init_Gpio_hal(void)
{
	RCC->AHB1ENR |= (RCC_AHB1ENR_GPIOAEN * !!GPIOA_ENABLE)| 
			(RCC_AHB1ENR_GPIOBEN * !!GPIOB_ENABLE)|
			(RCC_AHB1ENR_GPIOCEN * !!GPIOC_ENABLE)|
			(RCC_AHB1ENR_GPIODEN * !!GPIOD_ENABLE)|
			(RCC_AHB1ENR_GPIOEEN * !!GPIOE_ENABLE)|
			(RCC_AHB1ENR_GPIOFEN * !!GPIOF_ENABLE)|
			(RCC_AHB1ENR_GPIOGEN * !!GPIOG_ENABLE)|
			(RCC_AHB1ENR_GPIOHEN * !!GPIOH_ENABLE)|
			(RCC_AHB1ENR_GPIOIEN * !!GPIOI_ENABLE)|
			(RCC_AHB1ENR_GPIOJEN * !!GPIOJ_ENABLE)|
			(RCC_AHB1ENR_GPIOKEN * !!GPIOK_ENABLE);
	
#if GPIOA_ENABLE == 1
	Init_Gpio_Once_hal(GPIOA, &GPIOA_Setup, &GPIOA_Mask);
#endif
#if GPIOB_ENABLE == 1
	Init_Gpio_Once_hal(GPIOB, &GPIOB_Setup, &GPIOB_Mask);
#endif
#if GPIOC_ENABLE == 1
	Init_Gpio_Once_hal(GPIOC, &GPIOC_Setup, &GPIOC_Mask);
#endif
#if GPIOD_ENABLE == 1
	Init_Gpio_Once_hal(GPIOD, &GPIOD_Setup, &GPIOD_Mask);
#endif
#if GPIOE_ENABLE == 1
	Init_Gpio_Once_hal(GPIOE, &GPIOE_Setup, &GPIOE_Mask);
#endif
#if GPIOF_ENABLE == 1
	Init_Gpio_Once_hal(GPIOF, &GPIOF_Setup, &GPIOF_Mask);
#endif
#if GPIOG_ENABLE == 1
	Init_Gpio_Once_hal(GPIOG, &GPIOG_Setup, &GPIOG_Mask);
#endif
#if GPIOH_ENABLE == 1
	Init_Gpio_Once_hal(GPIOH, &GPIOH_Setup, &GPIOH_Mask);
#endif
#if GPIOI_ENABLE == 1
	Init_Gpio_Once_hal(GPIOI, &GPIOI_Setup, &GPIOI_Mask);
#endif
#if GPIOJ_ENABLE == 1
	Init_Gpio_Once_hal(GPIOJ, &GPIOJ_Setup, &GPIOJ_Mask);
#endif
#if GPIOK_ENABLE == 1
	Init_Gpio_Once_hal(GPIOK, &GPIOK_Setup, &GPIOK_Mask);
#endif
}


теперь в модуле, где требуется настроить все порты делаем:

#include "stm32f4xx_gpio_hal.h"
//  ...
int main(void)
{
//    ...
    Init_Gpio_hal();
//    ...
}

Главная фишка в том, что если перейти в режим Wizard, то увидим приятную картинку настроек:

И еще бонус: Программа по настройке портов занимает минимум места на флеш.
UPD:
ссылка
  • +14
  • 05 марта 2015, 12:54
  • Mihail
  • 1
Файлы в топике: stm32f4xx_gpio_hal.zip

Комментарии (44)

RSS свернуть / развернуть
жду отзывы!
0
locked впрочем можно вывести иначе, для каждого порта так же в настройках прописать, сразу не подумал об этом…
0
обновил, как и обещал
0
А под другие F0,F1,F2,F3 и под Kinetis есть подобное? Ваш код — исходники закрыты?
0
не писал…
0
файл свободен для скачивания
0
а наконец врубился :)
0
А теперь что будет, если мы сделаем Init_Gpio_hal(3)?
0
Вижу, ничего плохого. Обычная подъёбка ошибка препроцессора тут не работает.
0
все заблокируется как и положено, но вскоре я выведу эту опцию поканально
0
А в чем прикол? Вроде ж функция Init_Gpio_hal не принимает параметров вообще?
0
прикол в том, что несколько часов назад принимала, а теперь нет))
0
раньше в настройках отсутствовал параметр «Locked setup registers». А функция первоначально выглядела так:
static void Init_Gpio_hal(uint8_t locked)
0
Круто. Молодец. Плюсанул.
0
Вот думаю, стоит ли делать настройку выводов по маске, чтобы иметь возможность пропускать настройку некоторых выводов?
0
О как, до чего дошел прогресс) Т.е. можно делать визарды для настройки чего угодно, даже своих модулей/библиотек?
0
именно так!
0
Годная фича, однако.
0
Эта фича еще в 2005 году была, в uVision 2.
0
У меня первый пк появился в 2006 только)
0
Люто плюсую! Надеюсь вы не относитесь к адептам, которые на форуме разжигали холивары регистры/SPL. Очень полезная фича Keil'a и грамотное применение. Но вот наметилась тенденция перехода на другие IDE.
0
если наметился переход И другая IDE не поддерживает Wizard — что ж, печалька. Но можно править и ручками!
0
А в иаре подобного нету?
0
лично я без понятия. IAR никогда особо не заботился о юзабельности своей программы.
0
нет
0
Согласен с коллегами выше – фича удобная. Я когда то писал свою (аналогичную, но в виде отдельной программы и без «фатального недостатка») GUI конфигурлику (на входе шаблон в XML, на выходе *.h с установленными дефайнами).

Единственное – у вас в коде слишком много «копи-паста», лучше бы вынести повторяющийся код в инлайн функции, макросы…
0
это можно. Тогда уж не в инлайн, а сформировать константные структуры данных, и по человечески передавать их в одну функцию.
0
Нет предела совершенству
0
Всегда думал что Configuration Wizard у Кейла это примочка только для Сишников. По роду деятельности мне не часто приходится писАть свое на С, больше исправлять и дорабатывать чужое на ассемблере. Поэтому на Configuration Wizard просто не обращал внимание, думал не мое.
После этой статьи решил почитать, и обнаружил: «Мастер настроек, встроенная программа редактора для генерации GUI-как элементы управления конфигурацией на ассемблере, C / C ++, или файлов инициализации. Используйте Мастер настройки аннотаций в исходном коде для создания элементов управления.»
О как! Теперь буду пробовать прикрутить это к ассемблеру. Автору плюс.
0
Мне кажется, что название статьи немного вводит в заблуждение. Ведь все это справедливо только для среды Keil, применяемый контроллер, да и язык не очень влияет. Скорее название должно звучать так — «Настройка GPIO портов для IDE Keil на уровне препроцессора».
0
Рано обрадовался, для ассемблерного проекта (главный файл asm) препроцессор вообще не вызывается, а у ассемблера функция FUNC void Setup (void) вызывает ступор.
0
Вернее не так, сам ассемблер у Keil двупроходный, имеет собственный препроцессор. Но вот как заставить сишный препроцессор предварительно обработать ассемблерный проект (главный файл a51, а не asm), так и не понял. Печалька…
0
не писал на ассемблере под кейл, не могу ничего говорить по этому поводу. Но, как мне кажется, препроцессор должен работать и на файлах типа .s Про wizard: Чтобы он начал работать необходимо иметь точку входа, которая определяется строкой:
// <<< Use Configuration Wizard in Context Menu >>> 

ну и конец определяется так:
// <<< end of configuration section >>>


Далее нужно файл сохранить, закрыть и открыть заново. После этих манипуляций появится дополнительная вкладка Configuration wizard
0
Если правильно понимаю, файлы типа .s применяются в сишных проектах для ассемблерных файлов. Т.е. чисто ассемблерный проект нужно будет переделывать в смешанный С/asm. Надо будет как то попробовать, хотя делать это только из-за Configuration Wizard? Сомнительно…
0
Попробовал вставить строки
// <<>>
// <<>>
в подключаемый файл А51, вкладка Configuration wizard появилась. Но когда между ними помещаю FUNC void Setup (void), получаю SINTAX ERROR. Может обьявление функции неверно?
0
функция объявлена не верно, если она объявлена так, как вы пишите.
вы писали:
FUNC void Setup (void)

Не учитывая синтаксис макроса(?) FUNC писать нужно так:
FUNC void Setup(void)
. Видите разницу?
0
Конечно же я имел в виду строки

// <<< Use Configuration Wizard in Context Menu >>>
// <<< end of configuration section >>>
0
проверил у себя в проекте:
вставил строку следующим образом:
//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
#ifndef STM32F4XX_GPIO_HAL_H
#define STM32F4XX_GPIO_HAL_H

#include "stm32f4xx.h"

//<h> GPIO Configuration
//  <e> GPIOA
<strong>void func(void);
</strong>#define GPIOA_ENABLE 1
//    <e> GPIOA 00
#define GPIOA00_ENABLE 1
//	<o0> Mode <0=>0x00 - Input<1=>0x01 - General Output<2=>0x02 - Alternate function<3=>0x03 - Analog
//	<o1> Output Type <0=>0x00 - Push - Pull<1=>0x01 - Open drain
//	<o2> Output Speed <0=>0x00 - Low (2MHz)<1=>0x01 - Medium (25MHz)<2=>0x02 - Fast (50MHz)<3=>0x03 - High (100Mhz)
//	<o3> Pull up/down resistors <0=>0x00 - Disable<1=>0x01 - Up<2=>0x02 - Down
//	<o5> Alternate function <0=>0x00 - System<1=>0x01 - TIM1..2<2=>0x02 - TIM3..5<3=>0x03 - TIM8..11<4=>0x04 - I2C1..3<5=>0x05 - SPI1..2<6=>0x06 - SPI3<7=>0x07 - USART1..3<8=>0x08 - USART4..6<9=>0x09 - CAN1..2, TIM12..14<10=>0x0A - OTG_FS, OTG_HS<11=>0x0B - ETH<12=>0x0C - FSMC, SDIO, OTG_HS<13=>0x0D - DCMI<14=>0x0E - LTDC<15=>0x0F - EVENTOUT
//      <o4> Start output level <0=>0x00 - Low<1=>0x01 - High
//	<o6> Locked setup registers <0=>0x00 - Unlocked<1=>0x01 - Locked
#define GPIOA00_MODE			0
#define GPIOA00_TYPE			0
#define GPIOA00_SPEED			0
#define GPIOA00_PULL			0
#define GPIOA00_LEVEL			0
#define GPIOA00_AF			0
#define GPIOA00_LOCKED			0
//    </e>


Все прекрасно летает
0
//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
#ifndef STM32F4XX_GPIO_HAL_H
#define STM32F4XX_GPIO_HAL_H

#include "stm32f4xx.h"

//<h> GPIO Configuration
//  <e> GPIOA
void func(void);
#define GPIOA_ENABLE 1
//    <e> GPIOA 00
#define GPIOA00_ENABLE 1
//	<o0> Mode <0=>0x00 - Input<1=>0x01 - General Output<2=>0x02 - Alternate function<3=>0x03 - Analog
//	<o1> Output Type <0=>0x00 - Push - Pull<1=>0x01 - Open drain
//	<o2> Output Speed <0=>0x00 - Low (2MHz)<1=>0x01 - Medium (25MHz)<2=>0x02 - Fast (50MHz)<3=>0x03 - High (100Mhz)
//	<o3> Pull up/down resistors <0=>0x00 - Disable<1=>0x01 - Up<2=>0x02 - Down
//	<o5> Alternate function <0=>0x00 - System<1=>0x01 - TIM1..2<2=>0x02 - TIM3..5<3=>0x03 - TIM8..11<4=>0x04 - I2C1..3<5=>0x05 - SPI1..2<6=>0x06 - SPI3<7=>0x07 - USART1..3<8=>0x08 - USART4..6<9=>0x09 - CAN1..2, TIM12..14<10=>0x0A - OTG_FS, OTG_HS<11=>0x0B - ETH<12=>0x0C - FSMC, SDIO, OTG_HS<13=>0x0D - DCMI<14=>0x0E - LTDC<15=>0x0F - EVENTOUT
//      <o4> Start output level <0=>0x00 - Low<1=>0x01 - High
//	<o6> Locked setup registers <0=>0x00 - Unlocked<1=>0x01 - Locked
#define GPIOA00_MODE			0
#define GPIOA00_TYPE			0
#define GPIOA00_SPEED			0
#define GPIOA00_PULL			0
#define GPIOA00_LEVEL			0
#define GPIOA00_AF			0
#define GPIOA00_LOCKED			0
//    </e>
0
И даже файл STARTUP.A51 имеет конфигурационное меню. Все проясняется…
0
У меня в ассемблерном файле *.А51 тоже появляется меню после строк

// <<< Use Configuration Wizard in Context Menu >>>
// <<< end of configuration section >>>

И пункты меню могу нарисовать. Но чтобы присвоить, надо обьявить функцию в С стиле. Пробовал по разному:
FUNC void Setup(void)
void Setup(void)
void func(void)
ответ один — SINTAX ERROR
0
В папке Кейл нашел проект, где Configuration Wizard расположен в А51 файле. И сишняя функция в нем не обьявлена. С ходу не разобраться, надо почитать, поэкспериментировать. Файл Start954.a51 в каталоге Examples\NXP LPC954\Blinky. Буду пробовать…
0
По просьбам читателей изменил названия заголовка на более подходящий
+1
добавил маску по настройке каждого пина. Теперь имеется возможность не конфигурить скажем GPIOA13 и GPIOA14 (используются для SW отладки). Достаточно выключить галочки напротив этих выводов. Еще убрал простыню копипастов, оформил все в небольшие функции.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.