Q:为什么使用串口前要先在电脑上安装CH340驱动?
中断的作用?
环形buffer的作用?
static和valitate的作用
三种编程方式简介
也可以通过DMA方式减小CPU资源的消耗
直接把数据在SRAM内存和UART模块进行传输 ,流程:
- 把数据在DMA中配置好
- 数据传输
- 产生中断,CPU介入
编程方式改进
1、查询方式对应的读写会存在时间延迟
比如接收:没来得及保存RDR寄存器中接受到的数据时,RDR寄存器的值就已经被覆盖;
2、中断方式:事先在发送buffer中存好数据,使能发送空中断;把接受的数据存入buffer
发送
- char tx_buf[100];存数据
- enable TXE
- TXE_ISR:中断来取出数据发给TDR
接收
- 使能RXNE(接收非空)
- RXNE_ISR:利用中断从RDR中取数据到缓冲区
3、用环形缓冲区改进中断
4、用DMA方式减小CPU资源的消耗
一、查询方式进行编程
核心:判断TDR和RDR寄存器的状态
缺点:当接收时,若没有来得及读取数据,RDR中的值容易被覆盖,进而丢失数据
实现:
- 发送:先判断发送寄存器是否为空(借助状态寄存器中的TXE),若为空,往里面(DR)写入数据,自己的存储器地址++(pdata16bits++)
- 接收:判断RXNE是否收到数据(非空RXNE),若非空,读取DR,存进自己的存储器
二、官方中断方式进行编程
while(1){
调用HAL_UART_Transmit_IT使能中断(中断处理进行接收)14
等待中断处理(接收)完毕
打印1(23)
}
核心:通过使能中断,有字节就会
缺点:必须有函数及时调用HAL_UART_Transmit_IT,若未及时调用,数据也会丢失,实际场景中不会使用。。。。。所以HAL_UART_Transmit_IT没有什么作用
步骤:cubeMX,选择UART1串口,使能中断
代码逻辑:初始化串口时,同样使能了中断和设置了中断的优先级;在中断文档中,增加了串口1 的中断处理函数。(但只是使能串口1的中断总开关,没使能发送或接收中断,中断的管理还需要自己实现)
代码实现:
- 调用HAL_UART_Transmit_IT函数,使能中断UART_IT_TXE,使能后就返回,并不处理数据(中断UART_IT_TXE,把数据发给寄存器)
- 在中断处理函数中,若发送1000字节,则启动999次TXE中断和1次TC中断(调用HAL_UART_TxCpltCallback)
在接收时,因打印比较耗时,若每及时的调用HAL_UART_Transmit_IT函数使能中断,数据仍然会丢失
要发送数据时,使能“TXE”中断(发送寄存器空中断)。在 TXE 中断处理函数里,从程序的发送 buffer 里取出一个数据,写入 TDR;(TDR为空时:buffer---TDR---移位寄存器)
对于接收数据,在一开始就使能“RXNE”中断(接收寄存器非空)。这样,UART 接收到一个数据就会触发中断,在中断程序里读取 RDR 得到数据,存入程序的接收 buffer。(RDR非空时:移位寄存器---RDR---buffer)
和查询相比:多了对事件的实时相应?
TXE中断:TDR中的数据放入移位寄存器
TC中断:移位寄存器中的数据全部发送出去
二、中断方式改造
使能接收中断
初始化缓冲区
while(1){
HAL_UART_Transmit_IT;
circle_buf_read(&g_uart1_rx_bufs, pVal);
等待数据传输完毕;
}
不太懂!!!!
① 一开始就使能接收中断
② 接收中断处理函数里,把数据存入环形 buffer,并再次使能接收中断
三、DMA方式进行编程
优点:在数据传输的过程中不使用CPU的资源
配置DMA,进而实现在UART串口的TDR,RDR寄存器和芯片内存SRAM之间的直接数据传输。
当指定目标数量的数据传输完成后才会产生中断,进而让CPU介入。