裸机篇---STM32F407之GPIO
裸机篇---STM32F407之GPIO
实验目的:
1. 本实验主要是学习GPIO的基本功能。
实验内容:
1. 创建一个周期为100ms的软件定时器(SysTick实验有讲解)。
2. 主程序中检测软件定时器时间是否到,时间到了翻转四个LED。
程序设计流程思路:

依据流程图,程序设计如下:
第一:初始化GPIO
1 /* 2 ********************************************************************************************************* 3 * 函 数 名: bsp_InitLed 4 * 功能说明: 配置LED指示灯相关的GPIO, 该函数被 bsp_Init() 调用。 5 * 形 参: 无 6 * 返 回 值: 无 7 ********************************************************************************************************* 8 */ 9 void bsp_InitLed(void) 10 { 11 GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO结构体变量 12 13 /* 打开GPIO时钟 */ 14 RCC_AHB1PeriphClockCmd(RCC_ALL_LED, ENABLE); 15 16 /* 17 配置所有的LED指示灯GPIO为推挽输出模式 18 由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮. 19 这是我不希望的,因此在改变GPIO为输出前,先关闭LED指示灯 20 */ 21 bsp_LedOff(1); // 关闭LED1 22 bsp_LedOff(2); // 关闭LED2 23 bsp_LedOff(3); // 关闭LED3 24 bsp_LedOff(4); // 关闭LED4 25 26 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /* 设为输出口 */ 27 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /* 设为推挽模式 */ 28 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; /* 上下拉电阻不使能 */ 29 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* IO口最大速度 */ 30 31 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED1; // 获取当前引脚位 32 GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure); // 初始化LED1端口 33 34 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED2; 35 GPIO_Init(GPIO_PORT_LED2, &GPIO_InitStructure); // 初始化LED2端口 36 37 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED3; 38 GPIO_Init(GPIO_PORT_LED3, &GPIO_InitStructure); // 初始化LED3端口 39 40 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED4; 41 GPIO_Init(GPIO_PORT_LED4, &GPIO_InitStructure); // 初始化LED4端口 42 }
第二:点亮LED功能设置
1 /* 2 ********************************************************************************************************* 3 * 函 数 名: bsp_LedOn 4 * 功能说明: 点亮指定的LED指示灯。 5 * 形 参: _no : 指示灯序号,范围 1 - 4 6 * 返 回 值: 无 7 ********************************************************************************************************* 8 */ 9 void bsp_LedOn(uint8_t _no) 10 { 11 _no--; 12 13 if (_no == 0) 14 { 15 GPIO_PORT_LED1->BSRRH = GPIO_PIN_LED1; // 对应的BSRRH置1,则LED1亮 16 } 17 else if (_no == 1) 18 { 19 GPIO_PORT_LED2->BSRRH = GPIO_PIN_LED2; // 对应的BSRRH置1,则LED2亮 20 } 21 else if (_no == 2) 22 { 23 GPIO_PORT_LED3->BSRRH = GPIO_PIN_LED3; // 对应的BSRRH置1,则LED3亮 24 } 25 else if (_no == 3) 26 { 27 GPIO_PORT_LED4->BSRRH = GPIO_PIN_LED4; // 对应的BSRRH置1,则LED4亮 28 } 29 }
第三:熄灭指定的LED灯
/* ********************************************************************************************************* * 函 数 名: bsp_LedOff * 功能说明: 熄灭指定的LED指示灯。 * 形 参: _no : 指示灯序号,范围 1 - 4 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_LedOff(uint8_t _no) { _no--; if (_no == 0) { GPIO_PORT_LED1->BSRRL = GPIO_PIN_LED1; // 对应的BSRRL置1,则LED1灭 } else if (_no == 1) { GPIO_PORT_LED2->BSRRL = GPIO_PIN_LED2; // 对应的BSRRL置1,则LED2灭 } else if (_no == 2) { GPIO_PORT_LED3->BSRRL = GPIO_PIN_LED3; // 对应的BSRRL置1,则LED3灭 } else if (_no == 3) { GPIO_PORT_LED4->BSRRL = GPIO_PIN_LED4; // 对应的BSRRL置1,则LED4灭 } }
第四:翻转LED
/* ********************************************************************************************************* * 函 数 名: bsp_LedToggle * 功能说明: 翻转指定的LED指示灯。 * 形 参: _no : 指示灯序号,范围 1 - 4 * 返 回 值: 按键代码 ********************************************************************************************************* */ void bsp_LedToggle(uint8_t _no) { if (_no == 1) { GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1; // 对应的ODR置1,则LED1翻转 } else if (_no == 2) { GPIO_PORT_LED2->ODR ^= GPIO_PIN_LED2; // 对应的ODR置1,则LED2翻转 } else if (_no == 3) { GPIO_PORT_LED3->ODR ^= GPIO_PIN_LED3; // 对应的ODR置1,则LED3翻转 } else if (_no == 4) { GPIO_PORT_LED4->ODR ^= GPIO_PIN_LED4; // 对应的ODR置1,则LED4翻转 } }
第五:获取LED灯的状态
1 /* 2 ********************************************************************************************************* 3 * 函 数 名: bsp_IsLedOn 4 * 功能说明: 判断LED指示灯是否已经点亮。 5 * 形 参: _no : 指示灯序号,范围 1 - 4 6 * 返 回 值: 1表示已经点亮,0表示未点亮 7 ********************************************************************************************************* 8 */ 9 uint8_t bsp_IsLedOn(uint8_t _no) 10 { 11 if (_no == 1) 12 { 13 if ((GPIO_PORT_LED1->ODR & GPIO_PIN_LED1) == 0) // 获取GPIO寄存器状态 14 { 15 return 1; 16 } 17 return 0; 18 } 19 else if (_no == 2) 20 { 21 if ((GPIO_PORT_LED2->ODR & GPIO_PIN_LED2) == 0) // 获取GPIO寄存器状态 22 { 23 return 1; 24 } 25 return 0; 26 } 27 else if (_no == 3) 28 { 29 if ((GPIO_PORT_LED3->ODR & GPIO_PIN_LED3) == 0) // 获取GPIO寄存器状态 30 { 31 return 1; 32 } 33 return 0; 34 } 35 else if (_no == 4) 36 { 37 if ((GPIO_PORT_LED4->ODR & GPIO_PIN_LED4) == 0) // 获取GPIO寄存器状态 38 { 39 return 1; 40 } 41 return 0; 42 } 43 44 return 0; 45 }

浙公网安备 33010602011771号