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; } } |