# 嵌入式基础

# 1、文件配置

  • 工程文件

    • DOC--用于说明该工程内容

    • Libraries固件库

      • CMSIS内核文件

      • START_UP启动文件

      • FWLIB外设文件

    • USER文件,里面存储main函数及其头文件(应用程序)

  • Keil中文件

    • DOC文档,同上
    • CMSIS内核配置相关文件
    • FWLIB外设
    • START_UP 启动文件
    • USER应用程序
  • 配置步骤: 1、keil中创建工程文件到project(第二个project)下。

    2、在工程文件中添加上述几个文件夹(点三个颜色的方框按钮即可添加文件),把对应文件里的.c文件加到对应文件夹里就行了。

    3、打开魔法棒工具,选择C/C++项,加入头文件所在路径。

    4、尝试编译,如果不行就是config文件没有声明,再开魔法棒工具,选择C/C++项,添加宏定义即可。

# 2、GPIO

​ 经典一引脚设备:LED、按键、蜂鸣器(高电平响,低电平不响)、温度传感器。

# (1)GPIO的八种输入输出模式:

  • 输出
    • 推挽输出:PN-mos管全有用,输出1为高电平,输出0为低电平
    • 开漏输出:P-mos管没有用了,输出1为高阻态(就是没有电平),输出0为低电平
    • 复用推免/开漏输出:再USART、IIC、SPI协议中用到
  • 输入
    • 上拉输入:初始高电平
    • 下拉输入:初始低电平
    • 浮空输入:初始随机,随外界
    • 模拟输入:单独经过模拟通道

# (2)GPIO的输出速度

​ stm32中有三个速度:2MHZ、10MHZ、50MHZ。简单外设建议使用2MHZ的输出速度;复用IIC、SPI等通信信号时,建议使用10MHZ或50MHZ以提高响应速度。

# (3)GPIO基础使用(输出)

​ 其实就是配置相应的高低电平,如果led接3.3和单片机引脚,那么在相应的引脚配置低电平就可以实现开led,否则实现熄灭led。

​ GPIO结构体如下:

Typedef struct
{
	uint16_t GPIO_Pin;		//GPIO引脚
	GPIOSpeed_Typedef GPIO_Speed;	//GPIO输出速度
	GPIOMode_TypeDef GPIO_Mode;		//GPIO输入/输出模式
}GPIO_InitTypeDef;

​ 使用过程:

​ 1、打开时钟(初始化时钟)

​ 2、打开引脚(初始化引脚)

​ 编程过程: ​ 1、新建LED文件夹,在文件夹中新建led.c和led.h文件

​ 2、在led.c文件(引用stm32库函数,引用led.h)中新建ledinit初始化函数,并在.h文件中声明。

​ 3、初始化函数中包含两部分:时钟初始化和引脚初始化。引脚初始化先声明一个GPIO结构体,再设置结构体的Mode(要控制高电平,所以推挽模式)Pin``Speed这三项,最后调用引脚初始化函数;时钟初始化即找清楚是哪个时钟后调用即可。

​ 4、在魔法棒工具中添加led,h的头文件路径

​ 5、设置高低电平代码:

GPIO_ResetBits(GPIOA,GPIO_Pin_1);//这是设置低电平
GPIO_SetBits(GPIOA,GPIO_Pin_1);//这是设置高电平

# (4)GPIO基础使用(输入)

//开关的GPIO初始化同LED
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0;//读取低电平,假设开关所连引脚是A0

# 3、中断

# 4、通信

  • 基本概念

    ​ 数据的传输方式:串行通信(USART,IIC,SPI)和并行通信(FSMC)。并行通讯唯一的好处:比较快;其余不论是成本还是距离都不如串行好。

    ​ 数据的通信方式:单工通信(发送端到接收端)IIC、打印机、半双工通信(发送端和接收端都能发送和接收,但同时只能单向)、全双工通信(发送端和接收端都能同时发送和接收)SPI总线、USART

    ​ 通信的同步方式:分为异步通信和同步通信。异步通信:没有时钟,发送和接收之前需要进行一下同步,即有一个起始位和终止位;同步通信:发送方和接收方存在一个同步的时钟SCLK,高电平时传输数据。异步通信是以字符(一个字节一个字节传输的),效率低而简单,但是存在间隔,而同步通信是以字节块(多个字节)传输的,效率高而复杂,并且没有间隔。

    ​ 数据的通信速率:比特率bits/s(用于IIC、SPI),波特率每秒传输的码元数(用于串口)。一个二进制位代表一个码元:例如0V代表0,3.3V代表1。

  • 异步串口通讯

    • 一般传感器与单片机的通信是TTL电平(电脑USB是232电平)。

    • 串口数据包组成:

      • 起始位(低电平)

      • 数据位

      • 校验位(奇校验、偶校验、1校验、0校验、无校验)

        奇校验就是看1的个数是否为奇数,如果是就补0,否则补1;

        偶校验看1的个数是否为偶数,如果是就补0,否则补1;

        1校验0校验就是固定补0或1;

      • 停止位:结束的标识。可以1位2位0.5位1.5位都可以(高电平),正常使用1停止位。

  • 串口结构体

    • USART指的是同/异步串口,UART指的是只能异步串口,S代表signal,也是SCLK的S

    • TX是发送,RX是接收

    • 结构体在uart.h下,有两种,带clock的是同步,不带的是异步。

      uint32_t USART_BaudRate;		//波特率,一般为115200/9600
      uint32_t USART_WordLength;		//字长
      uint32_t USART_WordLenth;		//停止位,可以设置0.5、1、1.5、2
      uint32_t USART_Parity;			//校验位
      uint32_t USART_Mode;			//模式:收/发
      uint32_t USART_HardwareFlowControl;//硬件流控制
      //以下为同步才有
      uint32_t USART_Clock;			//同步时钟,配置是否打开
      uint32_t USART_CPOL;			//极性,配置串口空闲是低电平还是高电平
      uint32_t USART_CPHA;			//相位,配置选择边沿
      uint32_t USART_LastBit;			//最后一位时钟,配置使能还是关闭
      
  • 串口发送的配置

    • 配置时钟:GPIO的时钟、串口的时钟、引脚复用的时钟
    • 配置GPIO的结构体(引脚是TX还是RX)
    • 配置串口的结构体
    • 发送

串级pid,外环一般较慢,内环一般较快。外环输出作为内环输入。