好久没有熟悉嵌入式的底层是如何实现的,移植过来能用便也不再细究。
前些天移植了个有问题的串口发送,单个字节的发送没有问题,当连续发送很多字节时,发送出来的数据不是想要发出来的,出现了一大串重复数据,后经别人帮忙排查,原来之前一直的发送数据只是向发送寄存器写值,没有进行是否发送完成的判断,就是少了下面的这句
while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET);
发送的形式大概有两种,其实现过程是一致的。一种是先给发送缓冲池写入数据,然后开启中断,从而在中断处理函数中把发送缓冲池中的数据发送出去,另一种是自己写发送函数,根据发送标志位USART_GetFlagStatus进行判断是否发送完,完后直接向发送寄存器中写值,没有在中断函数中进行发送处理。两者都需要对发送标志位进行判断,否则会出现数据没有发送完成,寄存器又被重新赋值的情况。
而对于串口接收,在接收中断中接收到数据后需要关闭中断,否则会一直停留在中断中。
串口接收和串口发送都可以开启DMA中断,这样少占用CPU时间,一般的串口中断是一个字节一个字节的接收,可改为串口空闲中断,这样就可以一帧数据过来才中断一次。后续用到DMA在进行补充~
好久没有熟悉嵌入式的底层是如何实现的,移植过来能用便也不再细究。
前些天移植了个有问题的串口发送,单个字节的发送没有问题,当连续发送很多字节时,发送出来的数据不是想要发出来的,出现了一大串重复数据,后经别人帮忙排查,原来之前一直的发送数据只是向发送寄存器写值,没有进行是否发送完成的判断,就是少了下面的这句
while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET);
发送的形式大概有两种,其实现过程是一致的。一种是先给发送缓冲池写入数据,然后开启中断,从而在中断处理函数中把发送缓冲池中的数据发送出去,另一种是自己写发送函数,根据发送标志位USART_GetFlagStatus进行判断是否发送完,完后直接向发送寄存器中写值,没有在中断函数中进行发送处理。两者都需要对发送标志位进行判断,否则会出现数据没有发送完成,寄存器又被重新赋值的情况。
而对于串口接收,在接收中断中接收到数据后需要关闭中断,否则会一直停留在中断中。
串口接收和串口发送都可以开启DMA中断,这样少占用CPU时间,一般的串口中断是一个字节一个字节的接收,可改为串口空闲中断,这样就可以一帧数据过来才中断一次。后续用到DMA在进行补充~
举报