文章目录
概要
使用Stm32F103ZET6型号芯片开发项目中灯led、IO口、抵达定时器SysTick的配置使用。
整体架构流程
提示:这里可以添加技术整体架构
例如:
在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。
灯LED
灯的作用:
灯亮 --人眼能看到 --通过灯的状态来检查错误
1、电源指示–先告诉你 你接电了没
2、状态指示 --红绿黄 错误 运行 暂停
–通过闪烁 来判断代码是否卡死,灯如何亮? --led 灯是发光二极管–利用单向导通 --可以分析物理导线接线方向,能知道单向导通方向。
LED 灯电路分析
在哪查看电路分析???
原理图:模拟实际电路的连接方式的一种原理示意图。即我这里用的是STM32开发板原理图
LED1 -LED2- LED3-LED4 —在原理图当中 叫网络标签。
在原理图当中,相同的网络标签表示连接在一起。
另一端接在了 单片机的引脚上面。
STM32F103 的 IO 口 --IN /OUT 输入输出的接口
IO口
IO口对外输出一个控制信号,接收(采集)外部的信号。它就是我们 stm32 单片机 与 外部连接的 桥梁。 —Z 型号总共有 144 根 引脚数,有些不是 I/O。
资源和命名方式
SM32 当中以 A B C D E F G…来命名端口 ,一个端口 16 个引脚 (0-15)。
PE2-- P:port E:E 端口号 2:2 号引脚
LED1–PE2 LED2–PE3 LED3–PE4 LED4–PE5
如何控制 PE2 PE3 PE4 PE5, 4 个引脚(管脚)输出低电平 GND 0V,灯就会的点亮。
stm32 中 GPIO 的内部结构以及工作模式
GPIO --通用 目的 IO 口 --具体查看对应类型的参考手册
R -register 英文是寄存器的意思,什么是寄存器????
寄存器也是一种存储器,他能存数据也能存功能指令–掉电丢失;往固定寄存器当中固定的位写入固定得数据,就能实现对应的功能;CR 配置寄存器: ----就是配置模式的 —(输入输出模式),DR 数据寄存器:存放数据的,可以写入也能读取
别的外设还会有:
SR 状态寄存器:通过状态标志位,显示外设运行的情况
判断 io 口是对外输出信号控制,还是接收采集信号。输入输出一共有八种模式:输入浮空、上拉输入、下拉输入、模拟输入;开漏输出、推挽式输出、开漏复用输出、推挽式复用输出。
需要查看其内部结构图:
对灯进行控制 —输出信号也就是输出模式(输出模式: 根据控制信号来源不同,分为通用,以及复用)
推挽模式 — 控制信号 1 能够输出高点平 3.3v 控制信号 0 输出低电平 0v。
开漏模式 — 控制信号为 1 内部高阻态相当于断路 控制信号 0 只能输出低电平,想要输出高电平 ,
外部接上拉电阻。------只输出低电平,控制信号为 1 ,进入高阻态,但是他能输入采集。
复用:控制信号来源不同。—片上外设
想要灯亮,需要空 PE2、PE3、PE4、PE5 输出低电平 — 输出模式 ,推挽 开漏。
输入模式:
浮空:空闲时不确定,能够 输入 高电平 以及 低电平。
上拉:空闲时为高电平,能够 输入 高电平 以及 低电平。
下拉:空闲时为低电平,能够 输入 高电平 以及 低电平。
模拟:单独给 ADC
我们的电子设备,是数字信号,TTL 电平 --电平标准:逻辑值 0 0-0v,逻辑值 1 3.3v-5v(TTL 电平)。PE -GPIOE
控制 PE2345 --GPIOE
1、–选择模式:推挽或开漏
2、—目的:io 口输出低电平 也就是控制信号输出为 0 (输出寄存器对应的位为 0)
如何去选择模式(如何配置模式)???以及让控制信号输出为 0 ???
去操作对应寄存器。
寄存器与配置
寄存器是一种存贮器,能存数据,还能存指令。也就是说开发单片机就是操作寄存器。
GPIOX_CRL x 可以是 A…B…E. 对应端口。 一个端口有多少引脚? 0-15 一共有 16 个。低寄存器 GPIOE_CRL 一个寄存器 32 位。 4 位 去配置一个引脚 ,那么一个寄存器能配置8 个PE0 -7 号引脚。
所以有了高寄存器 GPIOE_CRH . PE8-15. 即PE2345 --选择 低配置寄存器。
需要通过位运算去修改配置为 推挽输出 —就需要找到 对应的位 然后修改为 0011。X&0=0 与零清零,X|1=1 或 1 置 1。我们操作寄存器,用哪个部分操作哪个部分,其他部分保持不变。例如:
PE2 : GPIOE->CRL &= ~(0xf<<8); //清 0
GPIOE->CRL |= 0X3<<8; //置位 (0x3 0011 -推挽输出)
GPIOE->ODR |=1<<2; 置 1
GPIOE->ODR &=~(1<<2); 清零
时钟
通过寄存器打开时钟。RCC->APB2ENR |=1<<6; 使能时钟。
软件编程驱动 LED 灯
//开启GPIOE的时钟,参考手册6.3.7 RCC_APB2ENR寄存器第6位置1
RCC->APB2ENR |=1<<6;
//PE2345 参考手册8.2.1GPIOE_CRL 寄存器对应位 目标值0011 --推挽模式
//清零 使用那几位就操作哪几位 其他位不能变
//参考手册8.2.1,为什么左移8位,PE2345在crl寄存器里 8-11、12-15、16-19、20-24位
GPIOE->CRL &=~(0xf<<8);
//目标值 0011 (十六进制0x3)
GPIOE->CRL |=(0x3<<8);
//PE2345 输出数据寄存器对应的位 置1
GPIOE->ODR |=1<<2;
通过操作具体的寄存器改变电压,以宏定义的模方式
//输出低电平 led灯亮
#define LED1_TOGGLE GPIOE->ODR ^=1<<2;
#define LED1_OFF GPIO_SetBits(GPIOE,GPIO_Pin_2);
#define LED1_ON GPIO_ResetBits(GPIOE,GPIO_Pin_2);
延时函数使用嘀嗒定时器
嘀嗒定时器对应的中断服务函数SysTick_Handler,需要重定向
//定义任务的时间点
u16 Led_Time=0;
u16 Key_Time=0;
void SysTick_Handler(void)
{
Led_Time++;
Key_Time++;
}
根据他的参数SysTick_Config(72000);(1毫秒) t=72000/72m=0.001s 也就是1ms触发一次。
//系统嘀嗒定时器初始化
//用内核提供的函数
SysTick_Config(72000);//1ms触发一次系统嘀嗒定时器中断
//寄存器版本:
//寄存器配置
SysTick->CTRL |=1<<0;
SysTick->CTRL |=1<<1;
SysTick->CTRL |=1<<2;
SysTick->LOAD =72000-1;//重装载值
NVIC_SetPriority(SysTick_IRQn,0); //设置优先级
系统定时器是一个向下计数 24 位的计数器。
想要配置它 需要到内核当中的寄存器找。处理器有一个 24bit (16777216)的定时器—SysTick,它从重装载值向下计数到 0,然后在新的时钟边沿上,加载装载值到计数器,然后继续计数。 ------对用内核里面的寄存器来说
按键驱动
按键电路图分析:
判断按键是否按下?
电平变化 传给 单片机的 io 口,检测 io 口的电平变化 -输入信号采集—输入模式。
问题: 分析电平怎么变化?
电平变化是一个突然的过程,从0V激增至3.3V,但是有一个很短的变化时间。
KEY1 --不按 低电平 按下 高电平
KEY2 --不按 高电平 按下 低电平
KEY3 --不按 高电平 按下 低电平
KEY4 --不按 高电平 按下 低电平
IO口去判断: KEY1 --PA0 KEY2–PC4 KEY3–PC5 KEY4–PC6
PA0 输入模式 --浮空输入
GPIOA->CRL &= ~(0XF<<0)
GPIOA->CRL |=0X4<<0;
高低电平的变化在哪里看?
在输入数据寄存器中去查看。
(GPIOA->IDR & 1 <<0) == 0 检测为低电平
(GPIOA->IDR & 1 <<0) != 0 检测为高电平
If((GPIOA->IDR & 1 <<0) != 0 )
{
灯亮;
蜂鸣器响;
}
总体上就是:
标签:输出,高电平,--,按键,低电平,STM32,开关,GPIOE,寄存器 From: https://blog.csdn.net/qq_50866235/article/details/1434677581、开启时钟
2、配置模式 清零 置位
3、odr 输出寄存器控制灯 亮灭 idr 输入信号检测高低电平