一.串口的中断触发
一般我们都是使用TXE或者RXNE来触发中断,其实还有完整传输结束的TC标志位和接收完成的IDLE标志位
这两个标志位有些不同,RXNE标志位只需要读取寄存器就会自行清除,但是这两个需要读取两个,拿IDLE举例子
这里需要这么写,才能清理标志位
二.关于DMA提前人为中断
如果手动disable了DMA,那么TCIF标志位会立马挂起
但是如果不清除该标志位,DMA就无法启动
所以我们再配置好DMA后,启动前,要清理标志位,1,2两种清理方式,任意一种都行
三.3种关于定义print导向串口输出的方法
1.覆写库函数
基础概念
关于怎么覆写标准库里面的原函数_c语言编译,怎么覆盖库文件的函数-CSDN博客
我们首先需要点开keil中的MicroLIB库
什么是MicroLIB库,为什么需要点开?
这是keil的精简C语言库,代码量少很多,他使用是了标准库的头文件接口,接口在编译阶段会被链接到选择的库(比如 MicroLIB)的 实现部分。
同时他的底层实现函数和标准库的不同
这里我们需要重新定义他的底层fputc()函数,一下定义即可
2.使用sprintf打印到字符数组,再用串口发送字符数组,此方法打印到字符数组
3.将sprintf函数封装起来,实现专用的printf,此方法就是把方法2封装起来
方法三涉及到可变参函数,这里介绍说明如何使用和原理
四.可变参函数
1.我们首先需要添加<stdarg.h>头文件,包括一下宏
首先类似void Serial_Printf(char *format, ...),这种带有....的函数就是,可变参函数,他允许你
👆这些操作都是合理的
2.实现原理
首先每个函数的调用就会构建一个属于自己的栈空间,存放自己的变量
va_list args;可以理解为生成了一个栈指针
va_start(arg, format);可以理解为将栈指针指向format后
所以使用va_arg(arg, int);取出数据的时候,会直接取走format后面的int类型数据,类似👇操作
va_end(arg);就是清理掉之前的指针
这样上面的代码就很简单可以看懂了 ,下面的这个代码也能轻松看懂使用了