GPIO_Config.c
说明一下,只要能精简代码行数,就值得用一个函数封装一下“重复的轮子”,这里用一个SetGPIO()来代替大片重复的结构体赋值语句(开机就执行一遍,无所谓执行效率了,可读性优先),是不是比库函数看起来清爽了很多?
#include "includes.h"
#include "GPIO_Config.h"
void SetGPIO(GPIO_TypeDef *Port,u16 pin,GPIOSpeed_TypeDef speed,GPIOMode_TypeDef mode)//设置GPIO
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = pin;
GPIO_InitStructure.GPIO_Speed = speed;
GPIO_InitStructure.GPIO_Mode = mode;
GPIO_Init(Port, &GPIO_InitStructure);
}
void GPIO_Configuration(void)//配置所有GPIO
{
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//仅使用SWD,释放其他调试口引脚
///*************************** 配置USB开始 *******************************
SetGPIO(Port_USB_DM, Pin_USB_DM, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_USB_DP, Pin_USB_DP, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_USB_EN, Pin_USB_EN, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
///*************************** 配置USB结束 *******************************
///*************************** 配置串口1开始 *******************************
SetGPIO(Port_TXD1, Pin_TXD1, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_RXD1, Pin_RXD1, GPIO_Speed_50MHz,GPIO_Mode_IPU);///输入上拉
///*************************** 配置串口0结束 *******************************
///*************************** 配置串口2开始 *******************************
SetGPIO(Port_TXD2, Pin_TXD2, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_RXD2, Pin_RXD2, GPIO_Speed_50MHz,GPIO_Mode_IPU);///输入上拉
///*************************** 配置串口1结束 *******************************
///*************************** 配置串口3开始 *******************************
/// SetGPIO(Port_TXD3, Pin_TXD3, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
/// SetGPIO(Port_RXD3, Pin_RXD3, GPIO_Speed_50MHz,GPIO_Mode_IPU);///输入上拉
///*************************** 配置串口2结束 *******************************
///**************************** 配置CAN开始 ********************************
///**************************** 配置CAN结束 ********************************
///**************************** 配置SPI1开始 ********************************
///SPI1:接2.4G模块BK2423(兼容nRF24L01)
GPIO_PinRemapConfig(GPIO_Remap_SPI1, ENABLE);
SPI_I2S_DeInit(SPI1);
SetGPIO(Port_SPI1, Pin_SPI1, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_BK2423_CS, Pin_BK2423_CS, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
SetGPIO(Port_BK2423_CE, Pin_BK2423_CE, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
//拉高SPI从机片选:
_SET_BK2423_CS;
Config_SPI(SPI_CPOL_High,SPI_CPHA_2Edge,SPI_BaudRatePrescaler_32);//恢复默认2.25M时钟,BCM5325(摩托3模式)
///**************************** 配置SPI1结束 ********************************
///**************************** 配置SPI2开始 ********************************
///SPI2:接IMU传感器模组
SPI_I2S_DeInit(SPI2);
SetGPIO(Port_SPI2, Pin_SPI2, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
//陀螺仪SPI口片选:
SetGPIO(Port_Gyro_CS, Pin_Gyro_CS, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
//地磁传感器SPI口片选:
SetGPIO(Port_Magnet_CS, Pin_Magnet_CS, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
//三轴加速度传感器SPI口片选:
SetGPIO(Port_Accel_CS, Pin_Accel_CS, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
//拉高SPI从机片选:
_SET_Gyro_CS;
_SET_Magnet_CS;
_SET_Accel_CS;
Config_SPI(SPI_CPOL_High,SPI_CPHA_2Edge,SPI_BaudRatePrescaler_32);//恢复默认2.25M时钟,BCM5325(摩托3模式)
///**************************** 配置SPI2结束 ********************************
///**************************** 配置SPI1开始 ********************************
///SPI3:接SPI接口Flash或SD卡
SPI_I2S_DeInit(SPI3);
SetGPIO(Port_SPI3, Pin_SPI3, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_SD_CS, Pin_SD_CS, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
//拉高SPI从机片选:
_SET_SD_CS;
Config_SPI(SPI_CPOL_High,SPI_CPHA_2Edge,SPI_BaudRatePrescaler_32);//恢复默认2.25M时钟,BCM5325(摩托3模式)
///**************************** 配置SPI1结束 ********************************
///************************** 配置I2C接口开始 ******************************
///I2C:(STM32的I2C靠不住,所以用IO模拟)
SetGPIO(Port_SCL1, Pin_SCL1, GPIO_Speed_50MHz,GPIO_Mode_Out_OD);
SetGPIO(Port_SDA1, Pin_SDA1, GPIO_Speed_50MHz,GPIO_Mode_Out_OD);
Set_SDA_1();
Set_SCL_1();
///************************** 配置I2C接口结束 ******************************
///************************** 配置PWM接口开始 ******************************
///4路空心杯电机:(分配到定时器输出管脚,都是输出高电平有效)
SetGPIO(Port_Moto1, Pin_Moto1, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_Moto2, Pin_Moto2, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_Moto3, Pin_Moto3, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
SetGPIO(Port_Moto4, Pin_Moto4, GPIO_Speed_50MHz,GPIO_Mode_AF_PP);
///************************** 配置PWM接口结束 ******************************
///********************** 配置普通数字输出口开始 ***************************
// ///外部看门狗喂狗:
// SetGPIO(Port_WDT, Pin_WDT, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
// _SET_WDT;
// _CLR_WDT;
//4个LED,和电机一一对应
SetGPIO(Port_LED1, Pin_LED1, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
SetGPIO(Port_LED2, Pin_LED2, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
SetGPIO(Port_LED3, Pin_LED3, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
SetGPIO(Port_LED4, Pin_LED4, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
//绿色LED:(原板是PB5,临时用我们的LED1顶替)
SetGPIO(Port_LED_GREEN, Pin_LED_GREEN, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
//红色LED:(原板是PB4,临时用我们的LED2顶替)
SetGPIO(Port_LED_RED, Pin_LED_RED, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
//蜂鸣器
SetGPIO(Port_BEEP, Pin_BEEP, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
// ///LED_RUN:
// SetGPIO(Port_LED_RUN, Pin_LED_RUN, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
// ///LED_ALARM:
// SetGPIO(Port_LED_ALARM, Pin_LED_ALARM, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
// ///LED_COMM:
// SetGPIO(Port_LED_COMM, Pin_LED_COMM, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
// ///LED_BEEP:
// SetGPIO(Port_LED_BEEP, Pin_LED_BEEP, GPIO_Speed_50MHz,GPIO_Mode_Out_PP);
///********************** 配置普通数字输出口结束 ***************************
///********************** 配置普通数字输入口开始 ***************************
///********************** 配置普通数字输入口结束 ***************************
///************************ 配置按键输入口开始 *****************************
//按键1:和串口2的RXD2共用
SetGPIO(Port_Key1, Pin_Key1, GPIO_Speed_50MHz,GPIO_Mode_IPU);
//按键2:本版未接(空间太小,不好走线)
SetGPIO(Port_Key2, Pin_Key2, GPIO_Speed_50MHz,GPIO_Mode_IPU);
///************************ 配置按键输入口结束 *****************************
///************************* 配置ADC输入口开始 *****************************
SetGPIO(Port_VBat, Pin_VBat, GPIO_Speed_50MHz,GPIO_Mode_AIN);//电池电压ADC
SetGPIO(Port_IFB1, Pin_IFB1, GPIO_Speed_50MHz,GPIO_Mode_AIN);//电机1电流测量ADC
SetGPIO(Port_IFB1, Pin_IFB2, GPIO_Speed_50MHz,GPIO_Mode_AIN);//电机2电流测量ADC
SetGPIO(Port_IFB1, Pin_IFB3, GPIO_Speed_50MHz,GPIO_Mode_AIN);//电机3电流测量ADC
SetGPIO(Port_IFB1, Pin_IFB4, GPIO_Speed_50MHz,GPIO_Mode_AIN);//电机4电流测量ADC
///************************* 配置ADC输入口结束 *****************************
//原版有,这里没有的管脚:随便定义几个空脚
//控制单键电子开关:
SetGPIO(PM_GPIO_SYSOFF_PORT, PM_GPIO_SYSOFF, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
//BQ24075使能脚1:
SetGPIO(PM_GPIO_EN1_PORT, PM_GPIO_EN1, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
//BQ24075使能脚2:
SetGPIO(PM_GPIO_EN2_PORT, PM_GPIO_EN2, GPIO_Speed_10MHz,GPIO_Mode_Out_PP);
//BQ24075充电完成状态指示
SetGPIO(PM_GPIO_IN_CHG_PORT, PM_GPIO_IN_CHG, GPIO_Speed_2MHz,GPIO_Mode_IPU);
//BQ24075输出良好指示
SetGPIO(PM_GPIO_IN_PGOOD_PORT, PM_GPIO_IN_PGOOD, GPIO_Speed_2MHz,GPIO_Mode_IN_FLOATING);
//锂电测量:(原版分压1/3,我们分压1/2) 前面已经定义了ADC_BAT(PC4)
// SetGPIO(PM_GPIO_BAT_PORT, PM_GPIO_BAT, GPIO_Speed_10MHz,GPIO_Mode_IN_FLOATING);
}
|