STM32入门——第二天学习串口收发

第二步 学习串口, 实现串口收发


学习之前先了解几个重要的寄存器:


串口时钟使能,GPIO相应时钟使能:APB2ENR、APB1ENR  

GPIOx模式设置:GPIOX_CRL/ODR ,如图:

输出位应设置为推挽复用输出

接收位设为浮空输入或带上拉输入,设置方法参看前一篇讲解。



串口复位: APB2RSTR 、 APB1RSTR 
串口波特率设置: USART_BRR
串口控制:USART_CR1~3

    初步只用到USART_CR1UE 为串口使能位,使串口开始工作;为字长选择位,89位数据;PCE 为校验使能位,0禁止校验;PS 为校验位选择,设置为 则为偶校验,否则为奇校验;TCIE 为发送完成中断使能位; RXNEIE 为接收缓冲区非空中断使能,接收到数据后进入中断函数;TE 为发送使能位,设置为 1,将开启串口的发送功能。RE 为接收使能位,用法同 TE


 

数据发送与接收:USART_DR

      包含了 TDR 和 RDR,当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。

串口状态寄存器 USART_SR 

       RXNE(读数据寄存器非空),当该位被置 的时候就是提示已经有数据被接收到了,并且可以读出来了。通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 

TC (发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。该位也有两种清零方式:1)读 USART_SR,写USART_DR2)直接向该位写 0


根据顺序依次配置完这几个寄存器后,串口初始化就基本完成了


接下来可以根据代码来进一步理解串口配置过程




计算波特率部分有兴趣的可以查阅相关资料理解一下。

写完后串口基本配置完成了,下面是接收数据的函数:



根据上面寄存器的讲解这些内容是很简单的!

还有一点,USART_RX_BUF[ ],这个数组是这样定义的:

       如果你在某一头文件(如A.h)中定义了extern u8 USART_RX_BUF[133];  表明该数组的定义在别的文件中。在C文件中正常定义(例u8 USART_RX_BUF[133];)然后使用后使该数组中加入了数据,如果想在别的C 文件中(如main.c)将其中的数据读出来,可将该头文件(A.h)加入到该C文件(如main.c)中即可,或直接将extern u8 USART_RX_BUF[133]; 加入到该C文件(如main.c),当编译器遇到时会知道它的定义在别的文件中,并去找到。extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!” 编译的时候C文件是逐个编译的,如果你用到了某一个本文件中没定义的标示符,编译器会报错,而链接阶段,各个文件的内容(实际是编译产生的obj文件)是被合并到一起的,因而,定义于某文件内的全局变量在链接完成后,它的可见范围被扩大到了整个程序,如果你在两个C 文件中定义了相同的全局变量,那么编译时可以通过,链接时就因重复定义报错了,总之如果你想在A.c文件中用到其它C文件中的变量,可以在A.c文件中声明(如extern u8 USART_RX_BUF[133];)该变量,使用即可。如果还是不懂的话,可以去百度上搜一下。


下面是主函数了:





  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值