1.1 字符串接收函数
发送方结束标志是你接收方判断的依据,也可以说是属于协议的一部分。
我们这里使用串口助手数据发送自动添加了\r\n,所以我们将它们看成结束标志。
1.2 数据传输方式
计算机与外部进行沟通只有并行和串行两种方式,计算机只能知道断电和上电,一根线同一时间只有断电或者上电,多根线就存在断电和上电同时存在。
所以一根线的时候称之为串行通信,多条线就是并行通信。
同样速度下一条线传输和8条线传输,谁快?8条,也就说并行传输数据的速度快,但是成本更高
一般情况下对传输速度有要求的地方,比如说:屏幕显示,这些地方使用的都是并行。
串行传输一般在远程地方更合适一些。
1.2.1 串行通信的连接方式
一共有三种:单工、半双工、全双工
- 单工只能发送或者只能接收。
- 能收发但是不能同时进行。
- 能同时进行收发操作。
我们的串口使用的是哪一种方式??半双工,虽然USART是全双工异步通信的设备,但是程序和硬件上不支持它这样做,所以选择的是半双工方式工作
1.2.2 同步和异步
同步:使用同一个时钟(产生时钟频率的设备是一个)。
异步:使用的时钟不是同一个,但是频率是一样的。
1.3 USART特性
串口现在好用吗??接收数据要等待,如果没有数据过来不做其它事情,这样是不合理的,有什么办法可以处理这件事?中断
2.1 中断的简介
2.1.1 中断是什么?
中断是一种处理事件的方式,或者说是一种机制。
在STM32中就是一种它提供给我们的机制,一种用于处理事件的方式。
什么机制??程序在运行过程中如果发生了中断对应的事件,优先处理中断事件
假设程序正在运行流水灯,此时如果有数据从电脑发送过来了,我要先去把数据接收到程序中。
要产生中断必要的条件:
1)程序一直在运行状态
2)中断机制是开启状态
3)产生中断的东西报备了
4)中断产生后处理方式设计好了
中断处理过程:异常(中断)中断源-->允许中断-->申请中断--> CPU 响应-->保护现场(栈)--> 跳转处理-->返回。
2.1.2 中断有什么用??
处理突发事件。
为什么用中断处理突发事件,为了节约CPU资源,因为突发事件是不确定什么时候产生的。
2.1.3 中断如何使用?
首先,确定中断源——串口接收
然后,开启中断——串口
申请中断??——有数据到达
CPU响应??——数据到了
保护现场??——现有程序停止
处理——中断服务函数
返回——继续执行原有程序
2.2 串口中断
2.2.1 查找串口中断
从这里可以了解到,串口1的中断是37
2.2.2 怎么开启?
中断使能寄存器。
2.2.3 优先级的概念
优先级代表谁先谁后,在这里代表谁先执行,谁后执行,说的是中断,意思是多个中断一起触发谁先执行。
但是它还包含另一层意思,意思是谁可以打断谁。如果有某个中断正在执行处理,但是我这个更加紧急,优先要处理我这个中断,这时候优先级设置要更高。
总结:中断优先级表示了谁可以打断谁的执行,还有就是谁先谁后。
因为优先级有三种:抢占、响应和自然。
- 抢占优先级代表谁可以打断谁;
- 响应优先级代表谁先谁后执行。
- 自然优先级只有在抢占和响应一样,并且无法区分谁先谁后的时候起作用,自然优先级就是它的位置也就是编号。
优先级数字越小优先级越高。
怎么设置优先级???
给谁设置优先级就指定其对应的下标,设置的8位数据就代表优先级,但是需要根据分组进行判定。
注意:一个程序只能存在一种分组。
在cortex-m3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:
- 第0组:所有8位用于指定响应优先级(抢占:0,响应:0~255)
- 第1组:最高1位用于指定抢占式优先级(0~1),最低7位用于指定响应优先级(0~127)
- 第2组:最高2位用于指定抢占式优先级(0~3),最低6位用于指定响应优先级(0~63)
- 第3组:最高3位用于指定抢占式优先级(0~7),最低5位用于指定响应优先级(0~31)
- 第4组:最高4位用于指定抢占式优先级(0~15),最低4位用于指定响应优先级(0~15)
- 第5组:最高5位用于指定抢占式优先级(0~31),最低3位用于指定响应优先级(0~7)
- 第6组:最高6位用于指定抢占式优先级(0~61),最低2位用于指定响应优先级(0~3)
- 第7组:最高7位用于指定抢占式优先级(0~127),最低1位用于指定响应优先级(0~1)
分组没有设置,咋设置?
2.2.4 串口中断允许
2.2.5 编写中断服务函数
配置完成,看完现象,现在总结一下。
所谓中断是用于处理突发事件的,你首先要开启中断(CPU允许,自己开启),然后编写中断服务函数,当中断事件产生的时候,代码回自动进入到中断服务函数去执行,执行完返回原来的地方继续执行原有程序。
注意:你不要在中断里面做过多停留。