# 嵌入式基础
# 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,外环一般较慢,内环一般较快。外环输出作为内环输入。