分享个人使用STM32F103管脚配置代码

2019-10-15 08:01发布

本帖最后由 DongInker 于 2017-1-12 08:59 编辑

主要用于普通管脚输入输出配置,包含是否初始化管脚(GpioEn),如是输出管脚初始化的电平状态(UpPowVal)。

[mw_shl_code=applescript,true]#define GPIO_ClrBits(m,n) GPIO_ResetBits(m,n)
typedef struct
{
UInt16            GpioFlag;
UInt16            GpioEn;
UInt16            UpPowVal;
GPIO_TypeDef     *GPIO_PRT;
GPIO_InitTypeDef  GPIO_INIT;
}tGPIO_CFG;

enum{
PIN_KEY1,
PIN_KEY2,
PIN_BEEP,
PIN_LAMP,
PIN_315,
PIN_OUT,
};

tGPIO_CFG GpioCfgTable[]={
{PIN_KEY1      ,1  , 0,GPIOA ,GPIO_Pin_0  ,GPIO_Speed_50MHz ,GPIO_Mode_IN_FLOATING},
{PIN_KEY2      ,1  , 0,GPIOA ,GPIO_Pin_1  ,GPIO_Speed_50MHz ,GPIO_Mode_IN_FLOATING},
{PIN_BEEP      ,1  , 0,GPIOA ,GPIO_Pin_13 ,GPIO_Speed_50MHz ,GPIO_Mode_Out_OD     },//神州1号开发板管脚
{PIN_LAMP      ,1  , 0,GPIOB ,GPIO_Pin_2  ,GPIO_Speed_50MHz ,GPIO_Mode_Out_PP         },
{PIN_315       ,1  , 0,GPIOB ,GPIO_Pin_4  ,GPIO_Speed_50MHz ,GPIO_Mode_IN_FLOATING},
{PIN_OUT       ,1  , 0,GPIOA ,GPIO_Pin_7  ,GPIO_Speed_50MHz ,GPIO_Mode_Out_PP            },

{0               ,0  , 0,0     ,0           ,GPIO_Speed_50MHz ,GPIO_Mode_IN_FLOATING}};


static void GpioInit(void)
{        
        int i;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
        
#ifdef MCU_STM32F103VE
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
#endif

        AFIO->MAPR = (0x00FFFFFF & AFIO->MAPR)|0x04000000;//关闭JTAG

        for(i=0;GpioCfgTable.GPIO_PRT;i++)
                {
                if(GpioCfgTable.GpioEn)
                        {
                        if((GpioCfgTable.GPIO_INIT.GPIO_Mode == GPIO_Mode_Out_OD) || (GpioCfgTable.GPIO_INIT.GPIO_Mode == GPIO_Mode_Out_PP))
                                {
                                if(GpioCfgTable.UpPowVal)
                                        GPIO_SetBits(GpioCfgTable.GPIO_PRT,GpioCfgTable.GPIO_INIT.GPIO_Pin);
                                else
                                        GPIO_ClrBits(GpioCfgTable.GPIO_PRT,GpioCfgTable.GPIO_INIT.GPIO_Pin);
                                }
                        GPIO_Init(GpioCfgTable.GPIO_PRT, &GpioCfgTable.GPIO_INIT);
                        }
                }
}

/* InPort */
GLOBAL int GetKey1(void)
{
        if(GpioCfgTable[PIN_KEY1].GpioEn)
                {
                if(GPIO_ReadInputDataBit(GpioCfgTable[PIN_KEY1].GPIO_PRT,GpioCfgTable[PIN_KEY1].GPIO_INIT.GPIO_Pin) == 0)        
                  return 1;
                }
        return 0;
}

GLOBAL int GetKey2(void)
{
        if(GpioCfgTable[PIN_KEY2].GpioEn)
                {
                if(GPIO_ReadInputDataBit(GpioCfgTable[PIN_KEY2].GPIO_PRT,GpioCfgTable[PIN_KEY2].GPIO_INIT.GPIO_Pin) == 0)        
                  return 1;
                }
        return 0;
}

/* Out Port*/
GLOBAL void SetBeepIO(int val)
{
        if(GpioCfgTable[PIN_BEEP].GpioEn)
                {
                if(val)
                        GPIO_ClrBits(GpioCfgTable[PIN_BEEP].GPIO_PRT,GpioCfgTable[PIN_BEEP].GPIO_INIT.GPIO_Pin);
                else
                        GPIO_SetBits(GpioCfgTable[PIN_BEEP].GPIO_PRT,GpioCfgTable[PIN_BEEP].GPIO_INIT.GPIO_Pin);
                }
}

GLOBAL void SetLampIO(int val)
{
        if(GpioCfgTable[PIN_LAMP].GpioEn)
                {
                if(val)
                        GPIO_ClrBits(GpioCfgTable[PIN_LAMP].GPIO_PRT,GpioCfgTable[PIN_LAMP].GPIO_INIT.GPIO_Pin);
                else
                        GPIO_SetBits(GpioCfgTable[PIN_LAMP].GPIO_PRT,GpioCfgTable[PIN_LAMP].GPIO_INIT.GPIO_Pin);
                }
}[/mw_shl_code]



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。