滴水恩情 发表于 2025-1-15 14:23:34

STM32入门教程-示例步伐(按键控制LED&光敏传感器控制蜂鸣器)

1. LED  Blink(闪耀)

代码主体包罗:LED.c      key.c    main.c    delay.c(延时防按键抖动)

步伐代码如下(涉及RCC与GPIO两个外设):
1.使用RCC使能GPIO时钟

https://i-blog.csdnimg.cn/direct/dfa407f32b7e48a6a21925a85ff0bcaa.png
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                 //打开APB2时钟  2.GPIO-Init函数初始化GPIO

https://i-blog.csdnimg.cn/direct/0abcf7ef40cd45bd84efbccafdea0cd1.png
 使用该函数,需要首先举行布局体的初始化
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;                    //定义结构体变量
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //GPIO模式,赋值为推挽输出模式----GPIO模式共8种模式,4种输入,4种输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                //GPIO引脚,赋值为第0号引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //GPIO速度,赋值为50MHz



GPIO_Init(GPIOA, &GPIO_InitStructure);                    //将赋值后的构体变量传递给GPIO_Init函数
                                                            //函数内部会自动根据结构体的参数配置相应寄存器
                                                            //实现GPIOA的初始化 3.使用输出或输入函数控制GPIO口(设置端口的高低电平)


将I/O口置高电平---三种方法(库函数)
         GPIO_SetBits(GPIOA, GPIO_Pin_0);                    //将PA0引脚设置为高电平https://i-blog.csdnimg.cn/direct/41617ec4201c4e66b8c70b0fc6629173.png
         GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);            //将PA0引脚设置为高电平https://i-blog.csdnimg.cn/direct/9416193eeaad4b36bfe2101032242b56.png
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);        //将PA0引脚设置为高电平 
将I/O口置低电平---三种方法(库函数)
        GPIO_ResetBits(GPIOA, GPIO_Pin_0);                    //将PA0引脚设置为低电平https://i-blog.csdnimg.cn/direct/a32617773d7d483282d409427a8029d2.png
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);        //将PA0引脚设置为低电平https://i-blog.csdnimg.cn/direct/9416193eeaad4b36bfe2101032242b56.png
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);        //将PA0引脚设置为低电平
/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
               
                /*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
                GPIO_ResetBits(GPIOA, GPIO_Pin_0);                                        //将PA0引脚设置为低电平
                Delay_ms(500);                                                                                //延时500ms
                GPIO_SetBits(GPIOA, GPIO_Pin_0);                                        //将PA0引脚设置为高电平
                Delay_ms(500);                                                                                //延时500ms
               
                /*方法2:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定*/
                GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);                //将PA0引脚设置为低电平
                Delay_ms(500);                                                                                //延时500ms
                GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);                        //将PA0引脚设置为高电平
                Delay_ms(500);                                                                                //延时500ms
               
                /*方法3:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型*/
                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);                //将PA0引脚设置为低电平
                Delay_ms(500);                                                                                //延时500ms
                GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);                //将PA0引脚设置为高电平
                Delay_ms(500);                                                                                //延时500ms
2.蜂鸣器 buzzer        

原理与LED类似,都是打开对应的GPIO口,赋高低电平
1.使用RCC使能GPIO时钟

2.GPIO-Init函数初始化GPIO

3.使用输出或输入函数控制GPIO口(设置端口的高低电平)

int main(void)
{
        /*开启时钟*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //开启GPIOB的时钟
                                                                                                                        //使用各个外设前必须开启时钟,否则对外设的操作无效
       
        /*GPIO初始化*/
        GPIO_InitTypeDef GPIO_InitStructure;                                        //定义结构体变量
       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                //GPIO模式,赋值为推挽输出模式
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                //GPIO引脚,赋值为第12号引脚
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //GPIO速度,赋值为50MHz
       
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                        //将赋值后的构体变量传递给GPIO_Init函数
                                                                                                                        //函数内部会自动根据结构体的参数配置相应寄存器
                                                                                                                        //实现GPIOB的初始化
       
        /*主循环,循环体内的代码会一直循环执行*/
        while (1)
        {
                GPIO_ResetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为低电平,蜂鸣器鸣叫
                Delay_ms(100);                                                        //延时100ms
                GPIO_SetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为高电平,蜂鸣器停止
                Delay_ms(100);                                                        //延时100ms
                GPIO_ResetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为低电平,蜂鸣器鸣叫
                Delay_ms(100);                                                        //延时100ms
                GPIO_SetBits(GPIOB, GPIO_Pin_12);                //将PB12引脚设置为高电平,蜂鸣器停止
                Delay_ms(700);                                                        //延时700ms
        }
}
3.按键控制LED

key.c部分

类似的,在key.c中首先举行初始化按键端口初始化
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
/**
* 函    数:按键初始化
* 参    数:无
* 返 回 值:无
*/
void Key_Init(void)
{
        /*开启时钟*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //开启GPIOB的时钟
       
        /*GPIO初始化*/
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                                //将PB1和PB11引脚初始化为上拉输入
} 其次,按键获取键码,通过库函数来读取寄存器的值
GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
/**
* 函    数:按键获取键码
* 参    数:无
* 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下
* 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手
*/
uint8_t Key_GetNum(void)
{
        uint8_t KeyNum = 0;                //定义变量,默认键码值为0
       
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)                        //读PB1输入寄存器的状态,如果为0,则代表按键1按下
        {
                Delay_ms(20);                                                                                        //延时消抖
                while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);        //等待按键松手
                Delay_ms(20);                                                                                        //延时消抖
                KeyNum = 1;                                                                                                //置键码为1
        }
       
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)                        //读PB11输入寄存器的状态,如果为0,则代表按键2按下
        {
                Delay_ms(20);                                                                                        //延时消抖
                while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);        //等待按键松手
                Delay_ms(20);                                                                                        //延时消抖
                KeyNum = 2;                                                                                                //置键码为2
        }
       
        return KeyNum;                        //返回键码值,如果没有按键按下,所有if都不成立,则键码为默认值0
}

LED.c部分

将这两步封装为   初始化函数,第三步输出高低电平封装为功能函数
1.使用RCC使能GPIO时钟
2.GPIO-Init函数初始化GPIO
/**
* 函    数:LED初始化
* 参    数:无
* 返 回 值:无
*/
void LED_Init(void)
{
        /*开启时钟*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);                //开启GPIOA的时钟
       
        /*GPIO初始化*/
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                                //将PA1和PA2引脚初始化为推挽输出
       
        /*设置GPIO初始化后的默认电平*/
        GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);                                //设置PA1和PA2引脚为高电平
} /**
* 函    数:LED1开启
* 参    数:无
* 返 回 值:无
*/
void LED1_ON(void)
{
        GPIO_ResetBits(GPIOA, GPIO_Pin_1);                //设置PA1引脚为低电平
}

/**
* 函    数:LED1关闭
* 参    数:无
* 返 回 值:无
*/
void LED1_OFF(void)
{
        GPIO_SetBits(GPIOA, GPIO_Pin_1);                //设置PA1引脚为高电平
}

/**
* 函    数:LED1状态翻转
* 参    数:无
* 返 回 值:无
*/
void LED1_Turn(void)
{
        if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)                //获取输出寄存器的状态,如果当前引脚输出低电平
        {
                GPIO_SetBits(GPIOA, GPIO_Pin_1);                                        //则设置PA1引脚为高电平
        }
        else                                                                                                        //否则,即当前引脚输出高电平
        {
                GPIO_ResetBits(GPIOA, GPIO_Pin_1);                                        //则设置PA1引脚为低电平
        }
}

/**
* 函    数:LED2开启
* 参    数:无
* 返 回 值:无
*/
void LED2_ON(void)
{
        GPIO_ResetBits(GPIOA, GPIO_Pin_2);                //设置PA2引脚为低电平
}

/**
* 函    数:LED2关闭
* 参    数:无
* 返 回 值:无
*/
void LED2_OFF(void)
{
        GPIO_SetBits(GPIOA, GPIO_Pin_2);                //设置PA2引脚为高电平
}

/**
* 函    数:LED2状态翻转
* 参    数:无
* 返 回 值:无
*/
void LED2_Turn(void)
{
        if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)                //获取输出寄存器的状态,如果当前引脚输出低电平
        {                                                
                GPIO_SetBits(GPIOA, GPIO_Pin_2);                               //则设置PA2引脚为高电平
        }                                                
        else                                                             //否则,即当前引脚输出高电平
        {                                                
                GPIO_ResetBits(GPIOA, GPIO_Pin_2);                             //则设置PA2引脚为低电平
        }
}
main.c部分
int main(void)
{
        /*模块初始化*/
        LED_Init();                //LED初始化
        Key_Init();                //按键初始化
       
        while (1)
        {
                KeyNum = Key_GetNum();                //获取按键键码
               
                if (KeyNum == 1)                        //按键1按下
                {
                        LED1_Turn();                        //LED1翻转
                }
               
                if (KeyNum == 2)                        //按键2按下
                {
                        LED2_Turn();                        //LED2翻转
                }
        }
}




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: STM32入门教程-示例步伐(按键控制LED&光敏传感器控制蜂鸣器)