STM32学习


st意法半导体
m微控制器
32三十二位

一、STM32与ARM的关系
1.ARM做内核设计
内核:处理器、ARM11、Cortex-Mx/Ax、指令集、Thumb、Thumb-2

2.ST做IC设计/流片做芯片设计
芯片:内核、总线、外设

3.用户做嵌入式开发,做产品设计 软/硬件开发
产品:芯片(软件)、外围电路(硬件)

二、STM32命名规则 STM32F103ZET6
STM32产品
F产品类型(L超低功耗)
103特性(基础型芯片)
Z引脚数量144pin,C=48pin
8flash存储容量Kbytes,64KB E=512KB
T封装QFP
6温度范围=-40 to +85

三、STM32芯片资源
1.内核:32位Cortex-M3处理器,时钟高达72M
2.IO口:144引脚 112个IO,大部分IO都耐5V(模拟通道除外),支持调试:SWD和JTAG,SWD只要2根数据线。
3.存储器容量:512K FLASH,64K SRAM
4.时钟,复位和电源管理
5.低功耗
6.ADC
7.DAC
8.DMA
9.定时器
10.通信接口
IIC-2
USART-5
SPI-3
CAN-1
USB从机-1
SDIO

液晶模块的操作程序
sbit RS=P2^6;寄存器选择位
sbit RW=P2^5;读写选择位
sbit E=P2^7;使能信号位
sbit BF=P0^7;忙碌标志位

延时1ms
3j+2*i

函数功能:判断液晶模块的忙碌状态
返回值:result

bit BusyTest(void)
bit result;
rs=0; 根据规定,rs为低电平,rw为高电平,可以读状态
rw=1
e=1 e=1,才允许读写
nop() 空操作
nop()
nop()
nop() 空操作四个机器周期,给硬件反应时间
result=bf;将忙碌标志电平赋给result
e=0 将E恢复低电平
return result;

函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
void WriteInstruction(unsigned char dictate)
while(busytest()==1);
rs=0 根据规定,RS和R/W同时为低电平时,可以写入指令
rw=0
e=0 e置低电平(根据表8-6,写指令时,E为高脉冲,就是让E从0到1发生正跳变,所以应先置0

nop()
nop() 空操作两个机器周期,给硬件反应时间
p0=dictate;将数据送入P0口,即写入指令或地址
nop()
nop()
nop()
nop()
nop() 空操作四个机器周期,给硬件反应时间
e=1; E置高电平
nop()
nop()
nop()
nop() 空操作四个机器周期,给硬件反应时间
E=0; 当E由高电平跳变成低电平时,液晶模块开始执行命令

函数功能:指定字符显示的实际地址
入口参数:x
void writeAddress(unsigned char x)
writeinstruction(x|0x80) 显示未知的确定方法规定为80H+地址码

函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
void WriteData(unsigned char y)
while(BusyTest()==1);
RS=1; RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; E置低电平(根据表8-6,写指令时,E为高脉冲,就是让E从0到1发生正跳变,所以应先置0)

P0=y; 将数据送入p0口,即将数据写入液晶模块
nop()
nop()
nop()
nop() 空操作四个机器周期,给硬件反应时间
E=1; E置高电平
nop()
nop()
nop()
nop()
E=0; 当E由高电平跳变成低电平时,液晶模块开始执行命令

函数功能:对LCD的显示模式进行初始化设置

void LcdInitiate(void)
delaynms(15); 延时15ms,首次写指令时应给LCD一段较长的反应时间
writeinstruction(0x38);显示模式设置:16x2显示,5x7点阵,8位数据接口
delaynms(5); 延时5ms,给硬件一点反应时间
writeinstruction(0x38);
delaynms(5); 延时5ms,给硬件一点反应时间
writeinstruction(0x38);连续三次,确保初始化成功
delaynms(5);
writeinstruction(0x0c);显示模式设置:显示开,无光标,光标不闪烁
delaynms(5); 延时5ms,给硬件一点反应时间
writeinstruction(0x06);显示模式设置:光标右移,字符不移
delaynms(5); 延时5ms
writeinstruction(0x01);请屏幕指令,将以前的显示内容清楚
delaynms(5); 延时5ms

以下是DS18B20的操作程序
sbit DQ=P3^7;
unsigned char time; 设置全局变量,专门用于严格延时

函数功能:将DS18B20传感器初始化,读取应答信号
出口参数:flag

bit Init_DS18B20(void)
bit flag; 存储DS18B20是否存在的标志,flag=0;表示存在;flag=1,表示不存在
DQ=1; 先将数据线拉高
for(time=0;time<2;time++); 略微延时约6us
DQ=0; 再将数据线从高拉低,要求保持480~960us
for(time=0;time<200;time++); 略微延时约600us
DQ=1;
for(time=0;time<10;time++);延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ; 让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++);延时足够长时间,等待存在脉冲输出完毕
return (flag); 返回检测成功标志

函数功能:从DS18B20读取一个字节数据
出口参数:dat
unsigned char readOneChar(void)
unsigned char i=0;
unsigned char dat; 存储读出的一个字节数据
for(i=0;i<8;i++)
{
DQ=1; 先将数据线拉高
nop(); 等待一个机器周期
DQ=0; 单片机从DS18B20读数据时,将数据线从高拉低即启动读时序
dat>>=1;
nop(); 等待一个机器周期
DQ=1; 将数据线”人为“拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++); 延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80; 如果读到的数据是1,则将1存入dat
else
dat|=0x00; 如果读到的数据是0,则将0存入dat
将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++); 延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat); 返回读出的十进制数据

函数功能:向DS18B20写入一个字节数据
入口参数:dat
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
DQ=1; 先将数据线拉高
nop(); 等待一个机器周期
DQ=0; 将数据线从高拉低时即启动写时序
DQ=dat&0x01; 利用与运算取出要写的某位二进制数据,并将其送到数据线上等待DS18B20采样

for(time=0;time<10;time++); 延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; 释放数据线
for(time=0;time<1;time++); 延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; 将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++);稍作延时,给硬件一点反应时间
}

以下是与温度有关的显示设置

函数功能:显示没有检测到DS18B20

void display_error(void)
{
unsigned char i;
writeaddress(0x00); 写显示地址,将在第1行第1列开始显示
i=0; 从第一个字符开始显示
while(Error[i]!=‘\0’) 只要没有写到结束标志,就继续写
{
writeData(Error[i]); 将字符常量写入LCD
i++; 指向下一个字符
delaynms(100); 延时100ms较长时间,以看清关于显示的说明
}
while(1); 进入死循环,等待查明原因
}

STM32学习方法:
1,首先了解STM32的基本外设:GPIO输入输出,外部中断,定时器,串口
掌握后,对芯片入门了。
2,深了学习,就需要掌握STM32基本的外设接口、通信接口:SPI,IIC,WDG,FSMC,ADC/DAC,SDIO等,是stm32相对于其他芯片比如说51所具备特有的,需要研究研究这些接口,学习掌握它。有实验可以加深对外设使用熟练程度,掌握了这些基本的外设,对STM32来说已经达到了一定的高度。想要再增加求职的砝码,就需要探索以下高级的应用
3.高级功能应用,比如说在STM32上运行操作系统,常用的操作系统FreeRTOS、国产的RT-Thread,学会后我们还要学习文件系统FATFS,对于STM32这种高端芯片,所要实现的功能自然要高,比如MP3、音频、图片的解码、字库的显示需要通过文件系统管理我们的文件,我们STM32美观的界面(GUI)的时候,少不了一些GUI的开源的软件,像EMWIN、STMWIN、还有比较火的LittleVGL,应用非常广,可以把产品做的非常漂亮,可以加载GUI的程序进去,还有以太网LWIP物联网。
4.一步一个脚印,在学习基础、高端的功能中,免不了提高C语言能力,嵌入式高手的C语言能力也很强,只有C语言编程能力很强,在使用到芯片逻辑编程的时候代码编辑能力就会不一样。一定要加强C语言。其实在学完一款芯片之后你会发现,其实外设资源可以很快就学完,因为外设变来变去就是那些东西、那些配置,基本上在开发的时候,那些配置不会变。从这挪到那,从那挪到这,基本上配置不会变,但会变的是逻辑,是通过C语言编程能力体现出来,怎么样来加强呢?在8-STM32资料-C语言加油站也有书籍:C指针编程之道、我的第一本C语言编程书、C和指针;在STM32中呢,对指针、结构体、还有一些C语言的基础知识需要不断去巩固。这些在STM32程序应用开发中还是比较多的。不像51,只是对if else switch for这些的简单应用,STM32指针和结构体应用非常多、甚至有的还要链表,链表在逻辑开发和简单的应用开发中涉及较少,它只涉及操作系统、GUI这些复杂的东西会涉及到,这里我们重点突出了一下C语言能力,一定要重视,C语言能力不是光看,需要不断的去写,看了之后要写,写了之后又要看,反复的一个过程,突出一个多动手编程,那么一个好的程序员它不是说就是看出来的,它是不断不断的敲代码,大家一定要多动手去编写程序。前期大家属于初学者状态,可以跟着教程按部就班的去学习,学完之后自己要思考,怎么来举一反三,怎么在基础上进行变通,怎么来变就需要动手学了。

6.在学习的过程中免不了遇到很多问题,遇到问题之后首先在网上寻找,多去百度一下,首先自己要能描述遇到的问题,然后在网上把问题描述搜索一下,可能别人已经遇到了,有解决方法可以借鉴,可以尝试解决。如果还不能解决,咨询客服。遇到问题多百度多浏览论坛
普中科技论坛:www.prechin.net
ST官方论坛:www.stmcu.org

平时多浏览论坛,里面有很多精华的帖子,有总结的经验和帖子,总比自己花时间去玩手机比较好。

学习不要跳跃,由浅入深,不要求快,基础不牢地动山摇。

一、通信基础

同步有同步时钟 异步有波特率

1.按照二进制位数据来分:

串行相对并行数据慢,多个数据利用 一条线 发送 (用的多)
在这里插入图片描述

并行快,多个数据利用多条线发送
在这里插入图片描述

2.按照数据传输的方向来分:

单工通信:单向;主机从机,区分发送器以及接收器;只可以发送器给接收器发送数据;
在这里插入图片描述
双工通信:双向->半双工:不能同时进行收发(数据线一根IIC RS485)全双工:可以同时进行收发(数据线两根串口 SPI RS232)
在这里插入图片描述

二、UART

通用异步(波特率-时间)收发器,串行、异步通信总线
两线制(两根数据线RX TX),可以实现全双工的发送和接收

1.UART帧格式

空闲位是1 高电平
起始位1位发送0 低电平
数据位为最好发8位发送0/1 5-8位先发低位后发高位
校验位1位发送0/1 奇偶校验 可有可无
停止位1位发送1 1-1.5-2位电平
可以试想一下为什么数据位从低位开始发 因为低位永远是0
由于串口数据帧可以送到5-8位 所以高位不一定是第八个数据
问题
UART如何区别0011 和 01 和000111 和0000 1111呢 通过波特率来区别
因为串口收发没有同步时钟什么的 都是根据自己的波特率 如果一直累计误差 最终可能会收发错误
如何避免上述问题呢 主要是根据串口UART的发送机制 就是发一个数据要等一下 这样可以避免累计误差
在这里插入图片描述

三、RS232、RS485(UART电气层的处理 本质是UART)

1、解决串口UART的问题而生:

1)电气接口不统一:
UART只是对信号的时序进行了定义,没有定义接口的电气特性,没有连接器的标准;
也就是时序上我只是定义了高电平跟低电平 但是高电平是多少 低电平是多少 在每个板子 不同环境都有标准
2)抗干扰能力差:
TTL信号抗干扰能力差,容易出错
3)通信距离短:
一般只用在一个电路板上两个芯片通信

2、RS232协议:串行通讯标准化,还对信号电平加以规定

全双工 串行 异步:编程跟UART一样
接口:9线制,但是真正用的一般来说只有三根线:TX、RX、GND
信号:逻辑“1”高电平为-5V~-15V、逻辑“0”低电平为5V到15V

3、RS232存在问题

1)接口信号电平高、容易烧坏接口、要加电平转化芯片 成本高
2)通信速度较低
3)共模干扰
4)传输距离短(15m)
5)只可以点对点跟UART一样

4、RS485协议:可以一主多从(组网)比232传输距离远 抗干扰强 兼容TTL

半双工 串行 异步:注意写程序跟RS232、UART串口不一样、RS485发送就不能接收。
接口:两线制485+、485-可以有多个设备 只要地址不同一般都是modbus协议什么的 你知道的
信号:差分信号:两线电压差 逻辑“1”高电平电压差为 2V到6V、逻辑“0”低电平电压差为 -2V到-6V

四、IIC总线

同步、串行、半双工、多主机总线、近距离、低速、芯片与芯片之间的通信;
接口:两线制:SDA数据线、SCL时钟线 成本低
可以挂载多设备、主机是使用总线权力者、从机只可以听取从机、被主机管理;在这里插入图片描述

1. 通信步骤过程:

空闲都是高电平
1)主机发送起始信号启用总线、总线处于占用
2)主机发送一个字节byte数据指明从机地址和后续字节的传送方向(寻址方式)
发送7位地址决定跟哪个从机通信
还有1位是数据的方向 0主机给从机 1从机给主机
一共8位bit 一个字节
3)被寻址的从机发送应答信号回应主机
提取出主机发送的一个字节的数据的高7位 查看是不是主机寻找自己回应主机
4)发送器发送一个字节的数据
此发送器由上述2)步骤的方向决定 很简单的理解
5)接收器发送应答信号回应发送器
此接收器由上述2)步骤的方向决定 很简单的理解
6)。。。重复步骤4)5)可以发送任意多个字节 但是发送的第一个字节一定是步骤2)N)通信完成后主机发送停止信号释放总线 总线处于空闲

2、起始信号和终止信号

SCL为高电平时、SDA由高变低电平 表示 起始信号
SCL为高电平时、SDA由 低变高电平 表示 停止信号
起始信号和停止信号都是由主机发出,起始信号发出总线处于占用,终止信号发出总线处于空闲

3、字节发送和应答

每个字节为8位长度,由于长度固定 在UART长度在5-8,所以从低位到高位发送;
而IIC发送字节长度固定 所以从高到底;
每个数据发送完一个字节数据之后 接收器必须发送1位应答位来回应发送器;所以一共是9位
在这里插入图片描述

4、同步信号

IIC在进行数据传送时,SCL低电平写;高电平是读
SCL为低电平期间,发送器向数据线发送一位数据时可以允许SDA信号变化
SCL为高电平期间,接收器向数据线读取一位数据时不可以允许SDA信号变化
在这里插入图片描述

五、SPI总线

同步、串行、全双工、主从方式工作、高速(对比UART IIC等);
接口:至少是四线制:MISO(主入从出)、MOSI(主出从入)、SCLK(时钟)、CS(片选)
外设一多、从机一多、主机就要用多根线(多加了片选线)、从机还是四根线
可以挂载多设备、主机是使用总线权利者,从机只可以听取从机、被主机管理。
在这里插入图片描述

1、寻址方式:

当主设备需要和某个从设备进行通信时,
主设备需要先向对应从设备的片选线上发送使能信号(高电平或者低电平、根据从机而定)
表示选中从设备表示:(一般来说CS是高电平CS上面由一杠就是0,一般来说)

2、通信步骤过程:

重点:
先发高位后发低位;
一定不需要应答,不用等应答,他也不会应答;跟IIC不同,IIC有应答
发完不用应答就可以立马发下一个;
没有起始信号也没有停止信号没有应答 只有数据发送 发完继续发
数据发送:当第一个时钟线上升沿或者下降沿时,发送器发送数据
数据接收:当第一个时钟线上升沿或者下降沿时,发送器接收数据
也就是只有时钟沿,不在发就是在读,只不过第一个沿在发,下一个沿一定在读
换言之就是一个时钟周期可以进行收发一位bit数据,那么在8个时钟周期就是一个字节byte了
注意一个时钟周期就是上升沿,下降沿一次
MSB是高位的意思 LSB是低位的意思
在这里插入图片描述

3、工作方式

SPI总线有四种不同的工作方式取决于极性CPOL跟相位CPHA
CPOL为SCLK空闲时的状态
CPOL=0;空闲时为低电平
CPOL=1;空闲时为高电平
CPHA表示采样时刻
CPHA=0;每个周期的第一个时钟沿采样
CPHA=1;每个周期的第二个时钟沿采样
所以有四种情况
补充:
时钟极性(CPOL)定义了SCLK在空闲状态时的电平。如果CPOL为0,表示SCLK在空闲状态下为低电平;如果CPOL为1,表示SCLK在空闲状态下为高电平。时钟相位(CPHA)定义了数据采样和传输的时机。如果CPHA为0,表示数据在SCLK的上升沿进行采样,数据在SCLK的下降沿进行传输;如果CPHA为1,表示数据在SCLK的下降沿进行采样,数据在SCLK的上升沿进行传输,
至于四种模式的选择都是要根据从机芯片手册的,要主机配置成一样的

4、IIC跟SPI的异同

相同点:
1)串行,同步方式
2)均采用TTL电平,传输的距离和应用场景类似
3)均采用主从方式工作
不同点:
1)IIC为半双工、SPI为全双工
2)IIC有应答机制跟起始跟停止,SPI无应答
3)IIC寻址通过启用总线后第一个数据8位中的前七位地址来寻址,SPI通过向对应从机,片选使能
4)IIC的时钟极性和时钟相位固定,时序有一种,SPI的时钟极性和时钟相位不固定,时序有四种

相关推荐

  1. STM32学习计划】

    2024-06-12 07:20:03       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 07:20:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 07:20:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 07:20:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 07:20:03       20 阅读

热门阅读

  1. Oracle基本数据类型

    2024-06-12 07:20:03       8 阅读
  2. Oracle系统视图归纳总结及常用对象查询语句

    2024-06-12 07:20:03       7 阅读
  3. GIS之arcgis系列08:arcpy实现批量excel转矢量点

    2024-06-12 07:20:03       8 阅读
  4. uniapp使用webview内嵌H5的注意事项

    2024-06-12 07:20:03       5 阅读
  5. MFC四种方法编写多线程

    2024-06-12 07:20:03       5 阅读
  6. 使用net.sf.mpxj读取project的.mpp文件

    2024-06-12 07:20:03       10 阅读