/* ********************************************************************************************************* * * 模块名称 : LED指示灯驱动模块 * 文件名称 : bsp_led.c * 版 本 : V1.0 * 说 明 : 驱动LED指示灯 * * 修改记录 : * 版本号 日期 作者 说明 * V1.0 2013-02-01 armfly 正式发布 * * Copyright (C), 2013-2014, 安富莱电子 www.armfly.com * ********************************************************************************************************* */ #include "bsp.h" /* 该程序适用于安富莱STM32-V4 开发板 如果用于其它硬件,请修改GPIO定义 如果用户的LED指示灯个数小于4个,可以将多余的LED全部定义为和第1个LED一样,并不影响程序功能 */ /* 按键口对应的RCC时钟 */ #define RCC_ALL_LED (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF) #define GPIO_PORT_LED1 GPIOA #define GPIO_PIN_LED1 GPIO_Pin_15 #define GPIO_PORT_LED2 GPIOC #define GPIO_PIN_LED2 GPIO_Pin_10 #define GPIO_PORT_LED3 GPIOC #define GPIO_PIN_LED3 GPIO_Pin_11 #define GPIO_PORT_LED4 GPIOC #define GPIO_PIN_LED4 GPIO_Pin_12 #define GPIO_PORT_LED5 GPIOD #define GPIO_PIN_LED5 GPIO_Pin_0 #define GPIO_PORT_LED6 GPIOD #define GPIO_PIN_LED6 GPIO_Pin_1 #define GPIO_PORT_LED7 GPIOF #define GPIO_PIN_LED7 GPIO_Pin_5 #define GPIO_PORT_LED8 GPIOF #define GPIO_PIN_LED8 GPIO_Pin_4 #define GPIO_PORT_LED9 GPIOF #define GPIO_PIN_LED9 GPIO_Pin_3 #define GPIO_PORT_LED10 GPIOF #define GPIO_PIN_LED10 GPIO_Pin_2 #define GPIO_PORT_LED11 GPIOF #define GPIO_PIN_LED11 GPIO_Pin_1 #define GPIO_PORT_LED12 GPIOF #define GPIO_PIN_LED12 GPIO_Pin_0 #define GPIO_PORT_LED13 GPIOE #define GPIO_PIN_LED13 GPIO_Pin_5 #define GPIO_PORT_LED14 GPIOE #define GPIO_PIN_LED14 GPIO_Pin_4 /* ********************************************************************************************************* * 函 数 名: bsp_InitLed * 功能说明: 配置LED指示灯相关的GPIO, 该函数被 bsp_Init() 调用。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitLed(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 打开GPIO时钟 */ RCC_APB2PeriphClockCmd(RCC_ALL_LED, ENABLE); /* 配置所有的LED指示灯GPIO为推挽输出模式 由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮. 这是我不希望的,因此在改变GPIO为输出前,先关闭LED指示灯 */ bsp_LedOff(1); bsp_LedOff(2); bsp_LedOff(3); bsp_LedOff(4); bsp_LedOff(5); bsp_LedOff(6); bsp_LedOn(7); bsp_LedOff(8); bsp_LedOff(9); bsp_LedOff(10); bsp_LedOff(11); bsp_LedOff(12); bsp_LedOff(13); bsp_LedOff(14); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 推挽输出模式 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED1; GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED2; GPIO_Init(GPIO_PORT_LED2, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED3; GPIO_Init(GPIO_PORT_LED3, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED4; GPIO_Init(GPIO_PORT_LED4, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED5; GPIO_Init(GPIO_PORT_LED5, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED6; GPIO_Init(GPIO_PORT_LED6, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED7; GPIO_Init(GPIO_PORT_LED7, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED8; GPIO_Init(GPIO_PORT_LED8, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED9; GPIO_Init(GPIO_PORT_LED9, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED10; GPIO_Init(GPIO_PORT_LED10, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED11; GPIO_Init(GPIO_PORT_LED11, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED12; GPIO_Init(GPIO_PORT_LED12, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED13; GPIO_Init(GPIO_PORT_LED13, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED14; GPIO_Init(GPIO_PORT_LED14, &GPIO_InitStructure); } /* ********************************************************************************************************* * 函 数 名: bsp_LedOn * 功能说明: 点亮指定的LED指示灯。 * 形 参: _no : 指示灯序号,范围 1 - 4 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_LedOff(uint8_t _no) { _no--; if (_no == 0) { GPIO_PORT_LED1->BRR = GPIO_PIN_LED1; } else if (_no == 1) { GPIO_PORT_LED2->BRR = GPIO_PIN_LED2; } else if (_no == 2) { GPIO_PORT_LED3->BRR = GPIO_PIN_LED3; } else if (_no == 3) { GPIO_PORT_LED4->BRR = GPIO_PIN_LED4; } else if (_no == 4) { GPIO_PORT_LED5->BRR = GPIO_PIN_LED5; } else if (_no == 5) { GPIO_PORT_LED6->BRR = GPIO_PIN_LED6; } else if (_no == 6) { GPIO_PORT_LED7->BRR = GPIO_PIN_LED7; } else if (_no == 7) { GPIO_PORT_LED8->BRR = GPIO_PIN_LED8; } else if (_no == 8) { GPIO_PORT_LED9->BRR = GPIO_PIN_LED9; } else if (_no == 9) { GPIO_PORT_LED10->BRR = GPIO_PIN_LED10; } else if (_no == 10) { GPIO_PORT_LED11->BRR = GPIO_PIN_LED11; } else if (_no == 11) { GPIO_PORT_LED12->BRR = GPIO_PIN_LED12; } else if (_no == 12) { GPIO_PORT_LED13->BRR = GPIO_PIN_LED13; } else if (_no == 13) { GPIO_PORT_LED14->BRR = GPIO_PIN_LED14; } } /* ********************************************************************************************************* * 函 数 名: bsp_LedOff * 功能说明: 熄灭指定的LED指示灯。 * 形 参: _no : 指示灯序号,范围 1 - 4 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_LedOn(uint8_t _no) { _no--; if (_no == 0) { GPIO_PORT_LED1->BSRR = GPIO_PIN_LED1; } else if (_no == 1) { GPIO_PORT_LED2->BSRR = GPIO_PIN_LED2; } else if (_no == 2) { GPIO_PORT_LED3->BSRR = GPIO_PIN_LED3; } else if (_no == 3) { GPIO_PORT_LED4->BSRR = GPIO_PIN_LED4; } else if (_no == 4) { GPIO_PORT_LED5->BSRR = GPIO_PIN_LED5; } else if (_no == 5) { GPIO_PORT_LED6->BSRR = GPIO_PIN_LED6; } else if (_no == 6) { GPIO_PORT_LED7->BSRR = GPIO_PIN_LED7; } else if (_no == 7) { GPIO_PORT_LED8->BSRR = GPIO_PIN_LED8; } else if (_no == 8) { GPIO_PORT_LED9->BSRR = GPIO_PIN_LED9; } else if (_no == 9) { GPIO_PORT_LED10->BSRR = GPIO_PIN_LED10; } else if (_no == 10) { GPIO_PORT_LED11->BSRR = GPIO_PIN_LED11; } else if (_no == 11) { GPIO_PORT_LED12->BSRR = GPIO_PIN_LED12; } else if (_no == 12) { GPIO_PORT_LED13->BSRR = GPIO_PIN_LED13; } else if (_no == 13) { GPIO_PORT_LED14->BSRR = GPIO_PIN_LED14; } } /* ********************************************************************************************************* * 函 数 名: bsp_LedToggle * 功能说明: 翻转指定的LED指示灯。 * 形 参: _no : 指示灯序号,范围 1 - 4 * 返 回 值: 按键代码 ********************************************************************************************************* */ void bsp_LedToggle(uint8_t _no) { if (_no == 1) { GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1; } else if (_no == 2) { GPIO_PORT_LED2->ODR ^= GPIO_PIN_LED2; } else if (_no == 3) { GPIO_PORT_LED3->ODR ^= GPIO_PIN_LED3; } else if (_no == 4) { GPIO_PORT_LED4->ODR ^= GPIO_PIN_LED4; } } /* ********************************************************************************************************* * 函 数 名: bsp_IsLedOn * 功能说明: 判断LED指示灯是否已经点亮。 * 形 参: _no : 指示灯序号,范围 1 - 4 * 返 回 值: 1表示已经点亮,0表示未点亮 ********************************************************************************************************* */ uint8_t bsp_IsLedOn(uint8_t _no) { if (_no == 1) { if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 0) { return 1; } return 0; } else if (_no == 2) { if ((GPIO_PORT_LED2->ODR & GPIO_PIN_LED2) == 0) { return 1; } return 0; } else if (_no == 3) { if ((GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 0) { return 1; } return 0; } else if (_no == 4) { if ((GPIO_PORT_LED4->ODR & GPIO_PIN_LED4) == 0) { return 1; } return 0; } return 0; } void bsp_LedAllOff(void) { bsp_LedOff(1); bsp_LedOff(2); bsp_LedOff(3); bsp_LedOff(4); bsp_LedOff(5); bsp_LedOff(6); bsp_LedOff(7); bsp_LedOff(8); bsp_LedOff(9); bsp_LedOff(10); bsp_LedOff(11); bsp_LedOff(12); bsp_LedOff(13); bsp_LedOff(14); } static void ChannelLedAllOff(void) { bsp_LedOff(1); bsp_LedOff(2); bsp_LedOff(3); bsp_LedOff(4); bsp_LedOff(5); bsp_LedOff(6); } static void ResLedAllOff(void) { bsp_LedOff(7); bsp_LedOff(8); bsp_LedOff(9); bsp_LedOff(10); bsp_LedOff(11); bsp_LedOff(12); bsp_LedOff(13); bsp_LedOff(14); } //---------------------------------------- // ch = 1,2,3,4,5,6 //--------------------------------------- void bsp_ChannelSelect(uint8_t _ch) { static uint8_t s_ucOldCh=255; if(_ch==s_ucOldCh) { ChannelLedAllOff(); bsp_RealyAllOff(); s_ucOldCh=255; } else { s_ucOldCh = _ch; ChannelLedAllOff(); bsp_LedOn(_ch); bsp_RelayOn(_ch); } } void bsp_ResSelect(uint8_t _res) { ResLedAllOff(); //printf("_res:%d\r\n",_res); bsp_LedOn(_res); bsp_SelectRes(_res); } /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/