裸机篇---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 }

 

posted @ 2017-11-01 23:53  50萌主  阅读(876)  评论(0)    收藏  举报