#include "relay.h" ////////////////////////////////////////////////////////////////////////////////// //This program is for educational purposes only, without the author's permission, may not be used for any other purpose //ALIENTEK STM32F407 Development Board //RELAY driver code //Hot Atomic @ALIENTEK //Forum: www.openedv.com //Date created: 2014/6/10 //Version: V1.0 //All rights reserved pirated reserved. //Copyright(C) Guangzhou wing electronic technology limited company 2014-2024 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// // Relay IO Initialize (KT mBMS-16S Rev1.0.3 schematic reference) void Relay_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // Enable Port C & Port D AHB1 clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); // Active-Low: Set high before configuring as OUT to prevent glitch GPIO_SetBits(GPIOC, GPIO_Pin_9); GPIO_SetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_15); /* 1. Charge Relay Control (PC9: CHARGE_CONTROL, Active-Low) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // Open-drain output GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); /* 2. Charge Relay Sense Input (PC8: CHARGE_CON_SEN) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /* 3. Discharge Relay Control (PD13: DISCHARGE_CONTROL, Active-Low) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // Open-drain output GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* 4. Discharge Relay Sense Input (PD12: DISCHARGE_CON_SEN) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); /* 5. Pre-charge Relay Control (PD15: PRECHARGE_CONTROL, Active-Low) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // Open-drain output GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); /* 6. Pre-charge Relay Sense Input (PD14: PRECHARGE_CON_SEN) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); CHG_RLY_OFF; DSG_RLY_OFF; PRE_CHG_RLY_OFF; } void Relay_On(u8 id) { switch (id) { case 0: case '0': DSG_RLY_ON; break; case 1: case '1': CHG_RLY_ON; break; case 2: case '2': PRE_CHG_RLY_ON; break; } } void Relay_Off(u8 id) { switch (id) { case 0: case '0': DSG_RLY_OFF; break; case 1: case '1': CHG_RLY_OFF; break; case 2: case '2': PRE_CHG_RLY_OFF; break; } } u8 Relay_Status(u8 id) { if ((id == 0) || (id == '0')) { // Discharge Relay Status: PD12 return GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12); } else if ((id == 1) || (id == '1')) { // Charge Relay Status: PC8 return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8); } else { // Pre-charge Relay Status: PD14 return GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14); } }