嵌入式——单片机

一、前言

1.1 原理图连接方式

  •     用连接线连接
  •     用网络标号

 1.2 单片机开发模式

  1. 汇编
  2. c
  3. 使用库

           标准库-移植性差,F1系和F4不通用,但F1里面通用

           HAL库-移植性高,不是所有的芯片有HAL库

  1.3 工程模板

      

  • doc 说明文档
  • libraries 固件库

               cmsis内核文件

               fwlib 外设文件

               start_up启动文件(64K—hd.s)

  • Project工程文件
  • User 应用文件

1.4 keil新建工程

  • 使用keil新建工程,保存在上面的project文件夹中
  • 在keil中新建文件件

  • 双击新建文件夹,添加.c文件

  • 添加头文件

        注意只能添加头文件上一级文件夹

  • 处理特殊文件 stm32f10x_conf.h

       全局宏定义,打开stm32f10x.h,找到 #include "stm32f10x_conf.h"语句

1.5 烧入程序

  • 串口

       安装驱动

       使用mcufly软件

  • stlink

       安装stlinkV2驱动

       配置魔术棒

1.6 系统结构

二、基本GPIO控制

2.1 GPIO

2.2 IO工作八种模

  • 输出模式:推挽输出、开漏输出、复用开漏、复用推挽

        开漏输出:p-mos管无效,底电平才有驱动能力,输出时引脚时高阻态,iic引脚,

                          想要输出高电平可以外置上拉电阻

        复用开漏/复用推挽:引脚不再是通用的输入输出,而是USART、IIC、SPI等片上外设等通用引脚时。选择复用功能

  • 输入模式:上拉输入、下拉输入、浮空输入、模拟输入

2.3 GPIO输出速度 

      输出速度指的是IO驱动电路的响应速度,不是信号输出速度

      高速时:功耗大,噪声大、电磁干扰强

      低速时:相反

      2、10、50MHz

三、点亮LED/蜂鸣器

  •  初始化时钟
  •  初始化引脚
#include "led.h"
#include "stm32f10x.h"  //单片机整个库

void LED_Init(){
	
	//
	GPIO_InitTypeDef led_initstruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	led_initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
	led_initstruct.GPIO_Pin=GPIO_Pin_1;
	led_initstruct.GPIO_Speed=GPIO_Speed_2MHz;
  
	GPIO_Init(GPIOA,&led_initstruct);
	
}

       参考GPIO.h RCC.h或GPIO.c RCC.c

  •  输出高低电平
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
int  main()
{
  //引脚时钟初始
	
	 LED_Init();

   while(1)
	 {		
			GPIO_ResetBits(GPIOA,  GPIO_Pin_1);       //亮灯	 
	 }
		 
}

四、按键

  •  初始化时钟
  •  初始化引脚
#include "key.h"
#include "stm32f10x.h"

void key_Init(void){
	
	GPIO_InitTypeDef key_init;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
	
	
	key_init.GPIO_Mode=GPIO_Mode_IPU;
	key_init.GPIO_Pin=GPIO_Pin_0;
	key_init.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOA,&key_init);
	
	key_init.GPIO_Mode=GPIO_Mode_IPU;
	key_init.GPIO_Pin=GPIO_Pin_13;
	key_init.GPIO_Speed=GPIO_Speed_10MHz;
  GPIO_Init(GPIOC,&key_init);
}
  •  读入高低电平
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "key.h"

int  main()
{
  //初始化
	
   LED_Init();
   key_Init();
   while(1)
	 {	
		  if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0)      //可以加一下软件去抖
			     GPIO_ResetBits(GPIOA,  GPIO_Pin_1);           //亮灯	 
		  if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)==0)
			     GPIO_SetBits(GPIOA,  GPIO_Pin_1);    
	 }
		 
}

五、继电器

1.硬件电路保护

        稳压二极管和光耦隔离,三极管放大电路

2.步骤(led)

  •  初始化时钟
  •  初始化引脚
  •  输出高低电平

六、震动传感器

1.用于防盗报警、智能小车

2.步骤(按键)

  •  初始化时钟
  •  初始化引脚
  •  读取高低电平

七、433M无线模块

八、中断

STM32中断通道包含多个EXTI(外部中断)、TIM、ADC、USART、SPI、I2C、RTC、PVD等多个外设(中断),使用NVIC进行统一管理中断,

1.NVIC

        抢占中断优先级和响应中断优先级

        misc.h文件

2.EXTI(边沿检测及控制、外部中断)

EXTI基本结构

外部中断控制器框图

3.常用的寄存器

  • EXTI_IMR  (External Interrupt/Event Controller_Interrupt Mask Register) 中断屏蔽寄存器
  • EXTI_EMR (External Interrupt/Event Controller_Event Mask Register) 事件屏蔽寄存器
  • EXTI_RTSR (External Interrupt/Event Controller_Rising Trigger Selection Register) 上升沿触发选择寄存器
  • EXTI_FTSR (External Interrupt/Event Controller_Falling Trigger Selection Register) 下降沿触发选择寄存器
  • EXTI_SWIER (External Interrupt/Event Controller_Software Interrupt Event Register) 软件中断事件寄存器  
  • EXTI_PR (External Interrupt/Event Controller_Pending Register) 挂起寄存器        

4.EXTI的配置

  1. 文件:exti.h
  2. 触发方式 上升沿、下降沿、双边沿、软件触发
  3. 通道数:16个GPIO_Pin  PVD输出、RTC闹钟、USB唤醒、
  4. 触发相应方式:中断相应/事件相应(上图右下线路)
  5. 事件相应:触发一个事件,CPU信号不会通过CPU,直接触发一个其他外设,比如:ADC转换
  6.  AFIO(选择器)只能选择 PA1 PB1 PC1 其中选择一个到通道1上
  7. 在stm32中:AFIO主要有两个任务:复用功能引脚重映射、中断引脚选择(GPIO_EXTILineConfig调用AFIO硬件的接口),区分复用功能和复用功能的重映射,复用:不再是通用输入输出(设置引脚模式)
  8.  步骤:
  • 配置GPIO、EXTI外设时钟     
  • 映射物理引脚到中断线-->GPIO_EXTILineConfig
  • 配置引脚和EXTI中断条件
  • NVIC分组函数
  • 初始化NVIC嵌套中断控制器
  • 中断服务函数

注:为什么NVIC不用开启时钟

        NVIC是ARM Cortex-M内核的一部分,直接集成在处理器核心中,而非独立的外设23。内核模块(如NVIC、SysTick)的运作依赖于系统时钟(如HSI/HSE),但无需手动配置时钟使能

        9.weak 弱定义,如果用户没有自定义中断函数,则系统默认执行系统自定义函数,如果用户有定义,则优先执行用户定义的函数

        11.作业

        外部中断震动传感器控制led灯

九、串口USART

1.常见的通信方式

串口和并行

全双工、半双工、单工通信

同步通信和异步通信针对串行通信的

异步:双方工作时钟是独立的,但事前要约定

码率和比特率  b=B*log2 N

2.常见的通信的协议

3.串口基础知识

ch340(usb电平转换成TTL电平)

4.USART

5.步骤

  • 开启引脚和USART的时钟
  • 初始化引脚和USART
  • 串口使能->UE标志位
  • 配置中断和NVIC(可选)
  • 中断服务函数
  • 调用USART_SendData()发送字符

十、printf重定向

        将原本要输出到标准输出流转到usart上,printf实际上是调用了fputc函数

        重写fputc

        

int fputc(int c,FILE *P)   //若函数
{
    USART_SendData(USART1,(u8)c);
    While(//等待发送数据寄存器内容为空);
    return c;

}

十一、蓝牙

1.名称

        HC-05

2.引脚

PIN 引脚说明
1START
状态引出引脚(未连接时输出低电平,
连接时输出高电平)
2RXE接收端
3TXE发送端
4GND
5VCC5V
6EN使能端,需要进入命令模式时接3.3V

3.基础知识

  1. 原始模式VS正常模式
特性正常模式(数据通信模式)原始模式(AT命令模式)
主要功能数据传输(透传)参数配置(AT指令)
默认状态上电后自动进入需手动触发EN引脚进入
数据响应直接转发输入数据响应AT指令(如OK
指示灯状态蓝灯闪烁(待机)或常亮(已连接)红灯闪烁(配置中)或无变化
用户交互通过串口发送应用数据通过串口发送AT命令
退出方式无需特殊操作发送重启命令(如AT+RESET)或断电重启

关键区别在于:正常模式用于实时通信,而原始模式用于模块管理。两者不能同时激活;模块必须在AT命令模式下完成配置后,才能切换到正常模式进行高效数据传输。

2.进入原始模式的两种方法

  • 按键或EN引脚拉高(接入3.3V),此时灯是慢闪,进入AT模式,波特率默认是 38400
  • HC-05上电开机,红灯快闪,按住按键或EN引脚拉高 (接入3.3V),HC-05进入AT命令模式,默认波特率是9600;

注:仅触发期间有效​(松开即退出)

4.基本配置

(所有AT命令都必须换行)
  • 正常模式下是9600AT模式波特率固定为 384008数据位,1位停止位,无奇偶校验的通信方式
  • 发送 AT\r\n , 回复 OK
  • 发送 AT+UART?\r\n ,回复 +UART9600,0,0    //设置 UART 波特率为 9600,使用 1 位停止位,无奇偶校验。
  • 发送 AT+UART=115200,0,0\r\n, 回复OK

通过上述步骤波特率即配置成功。

  • 发送 AT+NAME=" XXXX" ,修改蓝牙模块名称为XXXX
  • 发送 AT+ROLE=0 ,蓝牙模式即为从模式
  • 发送 AT+CMODE=1 ,蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接
  • 发送 AT+PSWD=1234 ,蓝牙配对密码为 1234
  • 发送 AT+UART=9600,0,0 ,蓝牙通信串口波特率为
  • 9600,停止位1位,无校验位

配置完成,需要重启一次

十二、ESP826601s

1原理图

2..三种工作模式

  • STA(station),终端模式,连接路由器
  • AP模式,热点模式
  • STA+AP模式

3启动方式

模式

CH-PD

(EN)

RSTGPIO0GPIO2
下载方式高(低电平有效)
运行模式

注:在复位或上电前将GPIO0拉低会进入下载模式

4.下载固件接线

5.运行模式接线

6.先跳过

十三、定时器

1、基本组成

        上来说就是用来定时的机器,是存在于STM32单片机中的一个外设。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、 TIM7),如下图所示:

注:STMf103c8T6有TIM1、TIM2、TIM3、TIM4,基本定时器只能向上计数。高级定时器功能是为三项无刷电机设计的

2.基本功能

        16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时,不仅具备基本的定时中断功能,而且还包含内外时钟源选择输入捕获输出比较、编码器接口、主从触发模式等多种功能,定时器最基本的功能就是计数

3.基本定时器框架图

可以将更新事件通过DAC主模式映射到TRGO,不用cpu处理中断,减轻CPU负担

  • 计数器寄存器(TIMx_CNT) :向上计数、向下计数或者中心对齐计数;
  • 预分频器寄存器(TIMx_PSC) :可将时钟频率按1到65535之间的任意值进行分频,可在运行时改变其设置值;
  • 自动装载寄存器(TIMx_ARR)
  • 影子寄存器(图中有阴影的部分)的存在起到一个缓冲的作用,用户值-> 寄存器->影子寄存器->起作用,如果不使用影子寄存器则用户值在写到寄存器之后则立马起作用

  • 定时器时间 = (PSC +1)*(ARR+1) / 72M

4.计数模式

5.通用定时器

    框图可以整体分成四部分

        ①时钟产生器部分

        ②时基单元部分

        ③输入捕获部分

        ④输出比较部分

6.定时中断基本结构

7.时钟树

8、步骤

  • 开启时钟
  • 选择时钟来源
  • 初始化定时器(时基)
  • 进行中断配置
  • 初始化中断管理NVIC(10x.h)
  • 使能定时器(开始)
  • 中断服务函数(启动文件)
  • 统计时间时,定时中断不够一个周期时可以读取计数器

9.输入捕获(优)|定时中断

(1)超声波HCSR04

  • 采用IO触发测距,给至少10us的高电平信号。
  • 模块自动发送8个40KHz的方波,自动检测是否有信号返回。
  • 有信号返回,通过IO输出一高电平,高电平持续时间就是超声波从发射到返回的时间声波从发射到返回的时间
  • 计算距离(声波速度)

HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。

(2)硬件接线

        四根杜邦线,VCC连接单片机3.3-5V(推荐5V供电),GND接到板子的GND,Trig 为外部触发信号输入,输入 一个10us的高电平即可触发模块测距,Echo即为回响信号输出,测距结束时此管引脚输出一个低电平,电平宽度反映超声波往返时间之和。

(3)定时中断思路:

        Echo为高电平开始利用定时器开始计时

        Echo为底电平开始利用定时器停止计时

(4)输入捕获(IC)

        

从模式为了CNT自动清0,否则的话只能通过捕获中断来清0;

步骤:

  • 开启RCC和GPIO时钟
  • 配置GPIO
  • 配置时基
  • 配置输入捕获
  • 从模式的触发源,选择触发后执行Reset操作
  • 使能定时器

10.主从模式

主模式:将定时器内部的信号映射到TRGO引脚用于控制其他定时器的运行

从模式:接受其他定时器的信号或自身的定时器的信号,控制自身定时器的运行,比如CNT清0操作,可以将TI1FP1映射TRGI,控制RESet的标志位

void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);

void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);

11.输出比较

(1)基础知识

注意有效电平

  • 输出比较结构体
typedef struct
{
uint16_t TIM_OCMode; //PWM模式1或者模式2
uint16_t TIM_OutputState; //输出使能 OR失能
uint16_t TIM_OutputNState;//高级定时器互补通道N的状态
uint16_t TIM_Pulse; //比较值,写CCRx
uint16_t TIM_OCPolarity; //有效电平时高电平还是低电平
uint16_t TIM_OCNPolarity;//高级定时器互补通道N的极性
uint16_t TIM_OCIdleState;//空闲状态下电平
uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
  • 使能输出比较预装载
void TIM_OC2PreloadConfig(TIM_TypeDef*TIMx, uint16_t TIM_OCPreload);
  • 使能自动重装载的预装载寄存器允许位
void TIM_ARRPreloadConfig(TIM_TypeDef*TIMx, FunctionalState NewState);

注:preXXX 预装载

(2)SG90舵机

控制sg90舵机旋转也比较简单,只需要给它输出PWM 波,修改占空比就可以调整角度。sg90的控制一般需要 一个20ms 左右的时基脉冲,脉冲的高电平部分一般在 0.5ms~2.5ms。高电平持续间与旋转角度的对应关系

 

十四、IIC

1.特点

  • SCL和SDA
  • 同步、半双工
  • 带数据应答
  • 一主多从(从机不能在未经允许的情况下控制总线)、多主多从(想通信的设备选布我是主机,如果发生冲突时采用仲裁的方式获得总线的控制权)
  • 设备的SCL和SDA均要配置成开漏输出模式,开漏输出模式也可以输入
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
  • scl时钟线任何时刻都只能被动的读取,不能控制时钟线
  • SDA数据线从机不允许主动发起对SDA的控制,(从机应答、主机)

同步时序的好处:可以暂停通讯,可以极大的降低单片机对硬件电路依赖,因此iic可以用软件模拟iic通讯

2.I2C时许基本单元

  • 起始和终止条件

  • 发送

  • 接收(主句释放SDA)

注意:实线主机、虚线从机

低电平放数据、高电平读数据

  • 应答(发送一位或接收一位)

发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

从机得不到主机的应答会主动放弃传送数据(释放SDA)

3.iiC时序(完整时序)

  • 指定地址写

对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

  • 当前地址读

对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

  • 指定地址读

对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

4.软件iic

5.硬件iic

1.特点

  • 支持多主多从模式--固定主机模式和可变主机模式(stm32采用的是可变)
  • 支持7/10位地址模式--第一个字节前五位11110时代表10位地址
  • 支持DMA
  • 最高400KHZ

2.硬件图

3.基本结构

gpio口时开漏输出模式也可以输入

常用的寄存器:CR控制寄存器、DR数据寄存器、SR状态寄存器

十五、spi

      由于iic采用的若上拉模式,会导致低电平到高电平速度比较慢,所以限制了最高速度,spi的速度远远高于iic速度,但是存在引脚数量多且存在浪费资源的可能

1.四根通信线 SCK、MOSI 、MISO、SS(一个从机一根)

2.同步、全双工

3.一主多从

4.所有的SCK、MOSI、MISO都连接在一起、输出引脚配置成推挽输出、输入引脚配置成推挽输入或浮空输入,MISO可能存在冲突,所以规定ss引脚失效时,MISO必须切换成高阻态

5.原理图

  • spi通信基础是交换一个字节,所以存在浪费的情况,全双工可以忽略
  • 时钟高电平时所有寄存器左移、低电平时移出来的最高位移到对方的最低位

6.SPI的时序图

  • 起始和终止

  • 四种模式

十六、DMA

十七、ADC

十八、看门狗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值