2021/10/12 智能家具嵌入式实训第二天 GPIO+蜂鸣器反转

1.项目中灯的作用

1.1 电子产品中常见的灯 -- LED灯

作用:

电源指示灯:电视机、路由器等等

状态指示灯:指示产品是否正常工作

通信

1.2 智能云家居中灯的作用与电路分析

作用:电源指示灯,状态指示灯(用户可以编写代码控制)

 

打开开发板原理图

红灯:

 

 

 

 

 

低电平亮,高电平灭 形成电压差

 

与MCU相连接的部分

 

 

 

 

 

 

GPIO

 STM32F103ZE GPIO口

 

 

 

 

 

 

 

STM32ZET6集成了多少GPIO口?

 7x16=112个

什么是GPIO口?

GPIO:general purpose input output(通用输入/输出端口),是一款端口拓展器

特点:功耗低、封装小、成本低、布线简单

 

  GPIO口如何表示(命名规则)?


PE2(端口号+管脚号) 

 

GPIO口的作用

 

 

 

 

IO功能:通用的数字输入输出接口

STM32F103:  逻辑0 --0+0.1V

逻辑1 -- 3+0.3V

AFIO复用功能:把IO复用为其他外设功能,引脚可以称为复用IO

 

 

 

 GPIO的工作模式

Input:输入检测

(输入电压:0v~3.3V---数值)

极端输入:3.3V    0V(逻辑1/逻辑0)

模拟输入:ADC(12位/8位/16位)(数据手册 器件一览)

 

 

 

 

 

 

 

上拉输入:增加高电平的驱动能力;

下拉输入:增加低电平的驱动能力;

浮空输入:不具备高低电平驱动能力,直接输入的电压进行转换;

模拟输入:检测模拟电压,数据传给ADC做转换;

(TTL肖特基触发器:把高低电平电压值转换为逻辑值)

 

l  输入配置理论

(参考手册 8.1.7 输入配置)

Output:输出控制

逻辑值:1/0:p-mos/n-mos:电压值:3.3V/0V 

中间值:PWM/DAC

 

 

 

 

 

推挽输出:直接把逻辑值输出成高低电平;

开漏输出:只能输出低电平,输出为1时是高阻态(未知状态,电路上电压由电路来决定);经常应用在总线,需要增加上拉电阻配合使用;具有读取的功能;

复用:IO复用其他外设功能时选择复用模式;

通用:只是把IO做普通输出的功能;

 

& 思考:控制LED灯的管脚可以使用GPIO口吗?使用哪种模式?

 

寄存器写法配置GPIO口

 

寄存器:片上外设存储“相应配置数据/状态数据/数据值”的空间

寄存器分类:

  配置寄存器:配置工作模式

       数据寄存器:保存发送的数据和接收的数据。

       状态寄存器:保存当前设备工作状态

GPIO寄存器:(参考手册)

 

 

 

 

 

 

 

 

 

时钟寄存器

 

 

 

 

 

 

 

 

 

 

STM32中寄存器一般为32位数据,不同的参数存储在不同的数据位下面,可进行位操作进行处理:

清0:                          GPIOx_CRL &=~(0x0F<<n);

置1:                          GPIOx_CRL |=(0x3<<n);

判断某一位是0/1:     (GPIOx_IDR &(0x01<<n))

 

 

软件编程驱动LED灯

软件:

(1)提供时钟:RCC   APB2外设时钟使能寄存器

(2)配置IO功能(0011 -- 通用推挽输出)

(3)操作输出数据寄存器:控制外部输出的高低电平

/* 寄存器法 */

        // 1.时钟使能 -- GPIOE端口时钟

        RCC->APB2ENR |= (0x1<<6);

        // 2.模式配置(通用推挽输出)

        GPIOE->CRL &= ~(0xFFFF<<8); //清零 -- [23:8]位

        GPIOE->CRL |= (0x3333<<8);  //置位           

        // 3.初始状态

        if(condition == OFF)

            GPIOE->ODR |= (0xF<<2);

        else

            GPIOE->ODR &= ~(0xF<<2); 

sss

 

 

 

 

 

软件编程驱动蜂鸣器和按键

& 硬件分析

 蜂鸣器:有源蜂鸣器和无源蜂鸣器 -- 源(起振源)

         有源 -- 直接通电,直接工作。

         无源 -- 接方波

 

 

 

蜂鸣器有有源和无源,有源直接高电平就向,而无源需要高低电平,。那个是取反第一次过来为0第二次过来就为1.一直如此,,

 

 

 

 

按键电路设计

 

 

 

按键按下和未按下的状态?

KEY1按下高电平,没有按下低电平

KEY2按下低电平,没有按下高电平

KEY3按下低电平,没有按下高电平

KEY4按下低电平,没有按下高电平

 

获取按键状态

与MCU连接

 

 

 

 

 

 

软件编程

蜂鸣器配置:

//1. 时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

              //2. 配置模式

              GPIO_InitTypeDef GPIO_InitStructure;

              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

              GPIO_Init(GPIOC,&GPIO_InitStructure);

              //3. 初始状态

      BEEP(OFF);

按键配置:

//时钟使能

              RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE);

              //模式配置

    GPIO_InitTypeDef GPIO_InitStructure = {0};

              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

              GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

              GPIO_Init(GPIOA,&GPIO_InitStructure);        

   

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;

    GPIO_Init(GPIOC,&GPIO_InitStructure);

应用:点击一次按键,蜂鸣器翻转一次

uint8_t Key_Val = 0;        

         if(KEY1)//检测到KEY1被按下

         {

                   Delay_nop_nus(10);  //延时消抖

                   if(KEY1)            //真的有人按下按键

                   {

                            while(KEY1);    //松手检测

                            Key_Val = 1;   

                   }

         }

posted @ 2021-10-12 14:47  halfup  阅读(338)  评论(2编辑  收藏  举报