最基本的串口中断的实现:需要直接调用cpu
在发送和接收的时候都包含两个寄存器
实现的机制,hal库已经基本完成,只需要调用相应地It中断函数和最后实现的逻辑写在对应的回调函数中即可。
如:发送时:
1.发送数据寄存器和发送移位寄存器
接收时:
2.接收数据寄存器和接收移位寄存器
当实现中断的时候,举例 如在发送时,先将数据放入发送数据寄存器,再串行输入到发送移位寄存器,按位传输,当,发送移位寄存器空的时候就会产生发送数据寄存器空中断,调度cpu来将数据寄存器的值传递到移位寄存器中去。
在接收时是同样的。
只不过在接收时,改成了接收数据寄存器非空时,产生一次接收数据寄存器非空中断,调度cpu过来把接收移位寄存器里的数据放到接收数据寄存器中去。
串口中断的实现机制再详解:DMA模式:
DMA模式下的串口中断实现:
DMA:直接内存访问,相当于cpu直接操作内存之间的一个媒介,减少了cpu的直接调用,而选择用中间的媒介cpu来完成发射中断信号这一机制
作用:完成数据的搬运,这里完成的是在发送数据寄存器中将数据搬运到发送移位寄存器中去,减少了cpu完成此搬运过程造成的频繁切换进程调度。
在cubemx里创建好DMA通道就可以直接使用了:
接收不定长数据:
实现的机制::重点是使用了一种中断:::串口空闲中断
串口接收从忙碌转为空闲时会触发此中断
hal库也封装好了:三种模式:阻塞、中断、DMA
实现的回调函数改变了:
这里的回调函数都是_weak前缀的函数,复制其定义放在main.c中重新进行定义
实现不定长数据收发步骤: