//单片机:
是典型的嵌入式微控制器,英文MCU;是一种集成电路芯片,采用超大规模集成电路技术把FPU,RAM,ROM,I/O口中断系统,定时器计数器等功能集成到一块硅片上,构成的小而完善的计算机系统。
//中央处理器(FPU)(168MHz)
//随机存储器(RAM)
//只读存储器(ROM)
//定时器:
重要 DAC:数模转换器
//基本定时器:
①起到计数、延时功能;②作为DAC外部触发
//通用定时器
①完美继承基本定时器的所有功能;
②输出比较功能:输出一段有规律的波形(PWM波):控制LED亮度、控制电机转速、舵机转向等
③输入捕获功能:当检测到外界边沿变化,接收外界过来的波形:红外编码、超声波测距、获取按键时长等等
//高级定时器:
①完美继承基本定时器和通用定时器的所有功能;
②增加了死区和刹车 --- 针对电机驱动
//系统滴答定时器
用来计数、延时;其实可以利用系统滴答提供时基(实时操作系统)
//看门狗:
检测程序是否正常运行,如程序异常则产生复位
如果程序运行正常的话,在规定时间内进行喂狗,则单片机不会产生复位
//RTC:
实时时钟 --- 日历、闹钟
//ADC:
模数转换器
//单片机最小系统
//电源电路:
3.3V
//振荡电路:
外接晶振: 外部高速晶振: 8Mhz 12Mhz 25Mhz 外部低速晶振: 32.768Khz
内部RC震荡电路: 单片机内部震荡源 缺点:RC震荡源偏频很大 频率:40Khz左右 实测:30Khz - 60Khz 看门狗(不需要那么准确)
//复位电路:
复位方式有: 硬件复位、软件复位、上电复位、看门狗复位
//如何获取单片机的详细信息:
官网下载数据手册
//假如配置了开漏输出,但现在往输出数据寄存器里面写了一个1,接下来会发生什么?
不会输出任何数据,配置为开漏输出,只能输出0(低电平),不能输出1(高电平)。
如配置开漏输出,输出寄存器写1,则导致p-mos完全关闭,令输出功能完全关闭。
//配置输出模式之后,输入功能能不能正常工作?
能,输入缓冲器被打开(施密特触发器开启),输入功能正常使用
//配置输入模式之后,输出功能能不能正常工作?
不能,输出缓冲器被关闭,输出功能关闭
//流水灯:
#include "led.h"
/*
函数功能:LED灯IO初始化G
返回值:void
形参:void
函数说明:
LED1 ---- PC4 ---- 通用推挽输出
LED2 ---- PC5 ---- 通用推挽输出
LED3 ---- PC6 ---- 通用推挽输出
LED4 ---- PC7 ---- 通用推挽输出
*/
void Led_Init(void)
{
//打开GPIOC的时钟
RCC->AHB1ENR |= 1 << 2;
//配置IO模式--通用推挽输出
GPIOC->MODER &= ~(3 << 8); //清零
GPIOC->MODER |= 1 << 8; //PC4配置为通用输出
GPIOC->MODER &= ~(3 << 10);//5引脚清零
GPIOC->MODER |= 1 << 10;//PC5配置为通用型输出
GPIOC->MODER &= ~(3 << 12);//6引脚清零
GPIOC->MODER |= 1 << 12;//配置PC6为通用型输出
GPIOC->MODER &= ~(3 << 14);//7引脚清零
GPIOC->MODER |= 1 << 14;
//配置IO输出类型--推挽
GPIOC->OTYPER &= ~(1 << 4);//4
GPIOC->OTYPER &= ~(1 << 5);//5
GPIOC->OTYPER &= ~(1 << 6);//6
GPIOC->OTYPER &= ~(1 << 7);//7
//配置IO速度
GPIOC->OSPEEDR |= 2 << 8;//4
GPIOC->OSPEEDR |= 2 << 10;//5
GPIOC->OSPEEDR |= 2 << 12;//6
GPIOC->OSPEEDR |= 2 << 14;//7
//配置上下拉
GPIOC->PUPDR &= ~(3 << 8);//4
GPIOC->PUPDR &= ~(3 << 10);//5
GPIOA->PUPDR &= ~(3 << 12);//6
GPIOC->PUPDR &= ~(3 << 14);//7
//配置LED默认电平为熄灭
GPIOC->ODR |= 1 << 4; //4
GPIOC->ODR |= 1 << 5;//5
GPIOC->ODR |= 1 << 6;//6
GPIOC->ODR |= 1 << 7;//7
}
/*
函数名称:流水灯
返回值:void
形参:
u8 flag 控制流水灯方向 DOWN--0 UP--1
u16 nms 控制流水灯速度 50--1000ms
函数功能:创造流水灯,并改变方向和速度
*/
void Water_Light(u8 flag,u16 nms)
{
static u8 cnt = 0;
cnt++;
delay_ms(nms); //速度
if(flag == DOWN) //方向向下
{
switch(cnt)
{
case 1:LED1_ON;break;
case 2:LED2_ON;break;
case 3:LED3_ON;break;
case 4:LED4_ON;break;
case 5:LED_OFF;break;
}
}
else //方向向下
{
switch(cnt)
{
case 1:LED4_ON;break;
case 2:LED3_ON;break;
case 3:LED2_ON;break;
case 4:LED1_ON;break;
case 5:LED_OFF;break;
}
}
cnt %= 5;
}
//延时:
#include "delay.h"
/*
*/
void delay_us(u32 nus)
{
while(nus--)
{
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
void delay_ms(u32 nms)
{
while(nms--)
{
delay_us(1000);
}
}
//蜂鸣器:
#include "buzzer.h"
/*
返回值:void
形参:void
函数名:Buzzer_Init
函数功能:蜂鸣器管脚初始化
函数说明:
Buzzer----PE0-----通用推挽输出
*/
void Buzzer_Init(void)
{
//打开时钟
RCC->AHB1ENR |= 1 << 4;
//初始化PE0
GPIOE->MODER &= ~(3 << 0);
GPIOE->MODER |= 1 << 0;
GPIOE->OTYPER &= ~(1 << 0);
GPIOE->OSPEEDR |= 2 << 0;
GPIOE->PUPDR &= ~(3 << 0);
//默认电平
GPIOE->ODR &= ~(1 << 0);
}
//开机提醒
void Star_Buzzer(void)
{
Buzzer_On;
delay_ms(50);
Buzzer_Off;
}
//GPIO定义:
通用性输入输出接口;
GPIO是单片机与外界进行信息交换的唯一窗口;
//stm32的GPIO口的数量:
数据手册的第二大点;
//GPIO的命名方式:
端口号 + 管脚号
//GPIO口的八大模式:
输入:
上拉输入 数字量 带有上拉功能 弱上拉 IO默认电平为高电平
下拉输入 数字量 带有下拉功能 弱下拉 IO默认电平为低电平
浮空输入 数字量 不带有上下拉功能 如果没有特殊需求,IO输入一般配置为浮空
模拟输入 模拟量 接收模拟量,需要借助ADC转换
输出:
通用推挽输出;通用开漏输出;复用推挽输出;复用开漏输出
通用:作为普通IO口,实现普通IO输出的功能
复用:复用输出一般与片上外设有关,如片上外设需要与外界进行信息交换,则对应IO需要配置为复用模式
推挽:IO口既可以输出0(低电平),也可以输出1(高电平)
开漏:IO口只能输出0(低电平),不能输出1(高电平)
//GPIO寄存器的操作方法:
GPIO端口号->寄存器名
//GPIO相关寄存器:
GPIO端口模式寄存器(MODER)
GPIO端口输出类型寄存器(OTYPER)
GPIO端口输出速度寄存器(OSPEEDR)
GPIO端口上拉/下拉寄存器(PUPDR)
GPIO端口输入数据寄存器(IDR)
GPIO端口输出数据寄存器(ODR)
#define KEY1 (GPIOA->IDR & 1 << 0)
#define KEY2 (GPIOE->IDR & 1 << 2)
#define KEY3 (GPIOE->IDR & 1 << 3)
#define KEY4 (GPIOE->IDR & 1 << 4)
//按键扫描:
/*
函数功能:扫描并返回按下的键值:
返回值:u8
形参:void
函数说明:
KEY1--------------------key1按下
!KEY2-------------------key2按下
!KEY3-------------------key3按下
!KEY4-------------------key4按下
*/
u8 key_scan(void)
{
static u8 flag = 0;
if(KEY1 || !KEY2 || !KEY3 || !KEY4 && !flag) //按下按键的过程,条件符合代表键位被按下
{
delay_ms(50);
flag = 1;
if(KEY)
{
return 1;
}
else if(!KEY2)
{
return 2;
}
else if(!KEY3)
{
return 3;
}
else if(!KEY4)
{
return 4;
}
}
else if(!KEY1 && KEY2 && KEY3 && KEY4 && flag) //松开按键的过程,符合条件代表键位松开
{
flag = 0;
delay_ms(50);
}
}