【STM32—寄存器版本】实例之串口通讯

0基础初学stm32,手上是ministm32开发板,根据原子哥给出的例子,手敲了一遍,同时将自己的一些问题记录在这里,希望能帮到大家。

1.理论基础

  • 串口:串口是一个重要的外部接口,在stm32上面也有丰富的串口资源,不过以我现在的水平还啥都不了解,所以这次主要说的就是通过USB串口和电脑通信
  • 串口配置:详细配置可以参考STM32开发指南寄存器版本的5.3.2章节,每个串口都有一个自己独立的波特率寄存器 USART_BRR,通过配置它就可以配置串口的波特率
  • 串口时钟使能:串口的时钟由外设时钟使能寄存器控制,我们这次使用的串口1挂载在APB2ENR上寄存器上。
    -数据的发送与接收:STM32的发送与接受是通过数据寄存器USART-DR实现,存入和取出他都可以,由两个寄存器TDR(发送用),RDR(接收用)组成,兼具读写功能。
    -串口状态:串口状态通过状态寄存器USART-SR读取

2.硬件部分

  • 板子是新买的,上面的跳线帽为啥那么安并不是很清楚,一开始照着原点哥的教程,将RXD和PA9,TXD和PA10用跳线帽连接在了一起,但是数据传不上去,于是动手把PA0,PA1上面的跳线帽摘掉,终于成功用FLYMCU把程序烧了上去,打开串口调试助手后上面没有任何反馈,经过一系列操作,最后的解决办法是:
    1:配置里面勾上红圈处在这里插入图片描述

    2.将B1与GND,B0与GND都用跳线帽连接起来
    3.将串口调试工具中的波特率调成跟代码初始化的波特率相同,并且点击打开串口按钮

3.主要代码

#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "led.h" 
#include "key.h" 
int main(void)
{   
 u8 t;
 u8 len; 
 u16 times=0;  
 Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时函数初始化
 uart_init(72,9600);  //串口波特率初始化
 LED_Init();      //初始化LED   
 while(1)
 {
  if(USART_RX_STA&0x8000)//判断输入是否完成
  {        
   len=USART_RX_STA&0x3fff;//计算出数据长度
   printf("\r\n您发送的消息为:\r\n");
   for(t=0;t<len;t++)
   {
    USART1->DR=USART_RX_BUF[t];//把输入的数据输入到到寄存器里面
    while((USART1->SR&0X40)==0);//手动流出时间等待传输完成
   }
   printf("\r\n\r\n");//换行
   USART_RX_STA=0;//这次传输结束了,下一次已经准备好啦~
  }else      //数据还没有输入完毕
  {
   times++;
   if(times%500==0)
   {
    printf("\r\n......loading......\r\n");
    printf("\r\n出现了!出现了!\r\n\r\n");
   }
   if(times%200==0)printf("请输入你想要的数据\r\n");  
   if(times%30==0)LED0=!LED0;//闪灯,证明你的程序还在进行中
   delay_ms(10);   
  }
 }  
}

重点代码理解

if(USART_RX_STA&0x8000):为什么这段代码可以判断数据有没有传输完毕呢,其实USART_RX_STA是一个定义好的十六位数:0000 0000 0000 0000 ,他的第十六位为0表示没接收完,等于1就是接收完毕,而0x8000转为2进制就是1000 0000 0000 0000,两者相与,只有两种结果,一个是0,一个是非0,所以就作为判断条件来使用了
len=USART_RX_STA&0x3fff 这段代码是计算出输入数据的长度的,USART-RX-STA里面已经储存了接收来的字节数,在与上可以接收的最大字节数,就得到了数据的长度。
if(USART1->SR&0X40)==0) 翻看手册我们可以知道USART1-SR的第6位掌管着判断发送是否完成,0x40=1000 000,与上它的意思就是看最后一位有没有变成1(有没有完成传输)
USART_RX_STA=0; 清0,复原,重启

以上为本人粗略的理解,如有错误还请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值