本帖最后由 北洋水师 于 2015-12-6 09:43 编辑
作为电子发烧友论坛的版主,特别是STM32板块的版主,帖子己停更俩月有余,本人在此做出深深地抱歉,其中包括电子发烧友论坛的工作人员,以及部分关注我的STM32学习者.
最近在搞串口,因为机智云的wifi模块也就是汉枫的LPB100也是通过串口来和单片机进行通讯的,所以,掌握串口很必要 大家所熟知的 是STM32的串口1,也就是USART1,对于串口1,由于用处比较多,例程比较多,此处既然提到了例程,就多说几句,我以前是只要程序能工作,我是不会去深究例程的来源和原理的,但是,最近的一个程序,需要我去整合STM32的串口1,2,,3,4,5 反正就是搞定串口,一开始我是觉得没什么的,尤其是在手头有原子例程(库版本)的前提下,相信大多数学习者会和我一样,认为直接修改一下I/O口即可...但是,实时证明,我和大家都是错的,而且错的离谱...下面,我将带大家浅层次认识一下STM32的串口
对于大容量STM32芯片,具有5个串口,其中1,2,3是USART,手册上谓之同步/异步串行通信,而4,5则谓之UART,异步串行通信.这意味着它们有着本质的区别,在这里在啰嗦一下,STM32虽然有很多串口,但是只有串口1可以被用于烧写程序. 然后,我就投身轰轰烈烈的程序测试中了...先是串口2,也就是USART2,和串口1类似,只要注意I/O口的模式(复用,映射一定要搞清楚!),基本问题不大,然后是串口3,在调试串口3 的过程中,发现始终不能正常收发数据,就连最简单的 0xXX 也发不出去,于是我去查找了各种资料,我找到了原子的寄存器版例程,然后把它改写成库版本,在这个过程中我得知了很重要的一个结论---库版本有很多寄存器位是操作不到的! 发现库版本的话,程序最后必须添加这一句USART_ClearFlag(USART3,USART_FLAG_TXE); 具体原因,还不是很清楚,希望大家一起研究研究. 串口的发送用的是库版本自带的 USART_SendData 函数.而接收数据是照搬原子例程,用串口中断,监测接收标志位来完成的. 接下来就是串口 4, 5,这两个串口有很多寄存器位和串口1,2,3有出入,所以用库函数操作是会出错的...暂时用寄存器版初始化函数...而接收同样是用串口中断完成的. 另外,无意中发现,当单片机和电脑建立通信之后,在正常发送数据的时候,快速点击"打开/关闭串口"按钮,电脑的串口助手就会接收到意想不到,毫无规律的串口数据...暂时就说这些吧,希望大家继续关注,谢谢大家
附上本人联系方式:QQ:1293345286 星空
0
|
|
|
|