野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11503|回复: 4

新人求教教学视频第12课,GPIO输出,使用固件库点亮LED

[复制链接]
发表于 2018-7-11 11:28:54 | 显示全部楼层 |阅读模式
第12课中最后有个作业,固件库实现流水灯,原来的作业只是点亮绿灯,为了方便对比,我把程序贴上来:
bsp_led.H 程序:
#ifndef  _BSP_LED_H
#define  _BSP_LED_H

#include "stm32f10x.h"

#define LED_B_GPIO_PIN      GPIO_Pin_1  //将蓝灯对应的PIN宏定义,提高可读性
#define LED_R_GPIO_PIN      GPIO_Pin_5  //将红灯对应的PIN宏定义,提高可读性
#define LED_G_GPIO_PIN      GPIO_Pin_0  //将绿灯对应的PIN宏定义,提高可读性

#define LED_R_GPIO_PORT     GPIOB
#define LED_G_GPIO_PORT     GPIOB
#define LED_B_GPIO_PORT     GPIOB       //前边的只定义了那个脚没有定义具体端口,在这里定义具体端口

#define LED_G_GPIO_CLK      RCC_APB2Periph_GPIOB  //将RCC.C文件中的APB2 CLK使能形参宏定义
#define LED_R_GPIO_CLK      RCC_APB2Periph_GPIOB
#define LED_B_GPIO_CLK      RCC_APB2Periph_GPIOB



//#define LED_ON              GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN)
//#define LED_OFF             GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN)
#define ON                   1 //定义带参宏
#define OFF                  0 //定义带参宏


#define LED_R(a)               if(a) GPIO_ResetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN); else GPIO_SetBits(LED_R_GPIO_PORT, LED_R_GPIO_PIN);//定义带参宏
#define LED_G(a)               if(a) GPIO_ResetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN); else GPIO_SetBits(LED_G_GPIO_PORT, LED_G_GPIO_PIN);//定义带参宏
#define LED_B(a)               if(a) GPIO_ResetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN); else GPIO_SetBits(LED_B_GPIO_PORT, LED_B_GPIO_PIN);//定义带参宏

void LED_GPIO_Config(void);
#endif /*_BSP_LED_H*/




bsp_led.C 程序:

void LED_GPIO_R_Config(void)
{
       
          GPIO_InitTypeDef   GPIO_InitStruct;          //定义初始化一个结构体,GPIO_InitStruct的名字可以任意,前面的GPIO_InitTypeDef对应头文件里面的结构体定义,所以格式命名不能随便修改
       
        RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);//注意:时钟的初始化要放到GPIO函数初始化之前,否则初始化无效果,也就是说先打开时钟端口才可以初始化
        RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
        RCC_APB2PeriphClockCmd(LED_B_GPIO_CLK, ENABLE);

        GPIO_InitStruct.GPIO_Pin    =  LED_R_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       
       
       
       
        GPIO_InitStruct.GPIO_Pin    =  LED_G_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       
       
        GPIO_InitStruct.GPIO_Pin    =  LED_B_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       
       
       
       
        GPIO_Init(LED_R_GPIO_PORT , &GPIO_InitStruct);//第二个变量是指针类型,对一个变量要取地址,用&符号
        GPIO_Init(LED_G_GPIO_PORT , &GPIO_InitStruct);
        GPIO_Init(LED_B_GPIO_PORT , &GPIO_InitStruct);       
}



main 函数程序:

#include "stm32f10x.h"

#include "bsp_led.h"

void delay(uint32_t count)
{
for(;count!=0;count--);

}

int main(void)
{
     LED_GPIO_R_Config();//首先调用初始化函数,后面再做动作;
       
       
        while(1)   //让三个灯一次亮起来
               
        {


                LED_R(ON);
                delay(9000000);
               
               
               
                LED_B(ON);
                delay(9000000);
               
               
               
                LED_G(ON);
                delay(9000000);
               
               
        }
       
}


这样下来的结果就是只有蓝色灯亮

















回复

使用道具 举报

 楼主| 发表于 2018-7-11 11:31:20 | 显示全部楼层
如果我把led.c里面的初始化程序修改一下,三个端口的初始化顺序修改一下,把绿灯放在最后,结果下来就是绿灯常亮

void LED_GPIO_R_Config(void)
{
        
          GPIO_InitTypeDef   GPIO_InitStruct;          //定义初始化一个结构体,GPIO_InitStruct的名字可以任意,前面的GPIO_InitTypeDef对应头文件里面的结构体定义,所以格式命名不能随便修改
        
        RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);//注意:时钟的初始化要放到GPIO函数初始化之前,否则初始化无效果,也就是说先打开时钟端口才可以初始化
        RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
        RCC_APB2PeriphClockCmd(LED_B_GPIO_CLK, ENABLE);

        GPIO_InitStruct.GPIO_Pin    =  LED_R_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
        
        GPIO_InitStruct.GPIO_Pin    =  LED_B_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
        
        
        GPIO_InitStruct.GPIO_Pin    =  LED_G_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
        
        
        
        
        
        
        
        GPIO_Init(LED_R_GPIO_PORT , &GPIO_InitStruct);//第二个变量是指针类型,对一个变量要取地址,用&符号
        GPIO_Init(LED_G_GPIO_PORT , &GPIO_InitStruct);
        GPIO_Init(LED_B_GPIO_PORT , &GPIO_InitStruct);        
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-11 11:38:29 | 显示全部楼层
qiuyuqiang001 发表于 2018-7-11 11:31
如果我把led.c里面的初始化程序修改一下,三个端口的初始化顺序修改一下,把绿灯放在最后,结果下来就是绿 ...

没办法,我把led.c的初始化程序修改,三个脚的初始化分开,程序如下:

#include "bsp_led.h"

void LED_GPIO_R_Config(void)
{
       
        GPIO_InitTypeDef   GPIO_InitStruct;  //定义初始化一个结构体,GPIO_InitStruct的名字可以任意,前面的GPIO_InitTypeDef对应头文件里面的结构体定义,所以格式命名不能随便修改
       
       
        RCC_APB2PeriphClockCmd(LED_R_GPIO_CLK, ENABLE);
       

        GPIO_InitStruct.GPIO_Pin    =  LED_R_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       
        GPIO_Init(LED_R_GPIO_PORT , &GPIO_InitStruct);//第二个变量是指针类型,对一个变量要取地址,用&符号
       
}

void LED_GPIO_G_Config(void)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
       
        RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);
       
        GPIO_InitStruct.GPIO_Pin    =  LED_G_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       
        GPIO_Init(LED_G_GPIO_PORT , &GPIO_InitStruct);
       
}

void LED_GPIO_B_Config(void)
{
  GPIO_InitTypeDef   GPIO_InitStruct;
       
        RCC_APB2PeriphClockCmd(LED_B_GPIO_CLK, ENABLE);
       
        GPIO_InitStruct.GPIO_Pin    =  LED_B_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       
        GPIO_Init(LED_B_GPIO_PORT , &GPIO_InitStruct);
       
}


main程序修改如下:


#include "stm32f10x.h"

#include "bsp_led.h"

void delay(uint32_t count)
{
for(;count!=0;count--);

}

int main(void)
{

       
        while(1)
               
        {

    LED_GPIO_R_Config();
    LED_R(ON);
    delay(9000000);
    LED_R(OFF);
               
                LED_GPIO_B_Config();
                LED_B(ON);
                delay(9000000);
                LED_B(OFF);
               
                LED_GPIO_G_Config();
                LED_G(ON);
                delay(9000000);
                LED_G(OFF);
               
        }
       
}



这样修改之后流水灯就可以实现了,我想知道的是前面的程序是哪儿出错了呢?




回复 支持 反对

使用道具 举报

发表于 2018-7-11 11:43:43 | 显示全部楼层
qiuyuqiang001 发表于 2018-7-11 11:31
如果我把led.c里面的初始化程序修改一下,三个端口的初始化顺序修改一下,把绿灯放在最后,结果下来就是绿 ...

初始化有问题,你修改了一次结构体的内容就应该调用一次GPIO_Init,不然使用的就只是最后一次修改后的值,只初始化一个灯正确是这样写
[mw_shl_code=c,true]

        GPIO_InitStruct.GPIO_Pin    =  LED_R_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
       GPIO_Init(LED_R_GPIO_PORT , &GPIO_InitStruct);//第二个变量是指针类型,对一个变量要取地址,用&符号

        GPIO_InitStruct.GPIO_Pin    =  LED_B_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;
        GPIO_Init(LED_G_GPIO_PORT , &GPIO_InitStruct);

        
        GPIO_InitStruct.GPIO_Pin    =  LED_G_GPIO_PIN;
        GPIO_InitStruct.GPIO_Mode   =  GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed  =  GPIO_Speed_50MHz;        
        GPIO_Init(LED_B_GPIO_PORT , &GPIO_InitStruct); [/mw_shl_code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-12 09:38:23 | 显示全部楼层
flyleaf 发表于 2018-7-11 11:43
初始化有问题,你修改了一次结构体的内容就应该调用一次GPIO_Init,不然使用的就只是最后一次修改后的值 ...

非常感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 19:07 , Processed in 0.031333 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表