STM32串口通信实验-库函数

版权声明:博主的博客不值钱随便转载但要注明出处 https://blog.csdn.net/easylovecsdn/article/details/81876850

这里先给出程序源码:
 

调用库函数:
 

#include "sys.h"
#include "usart.h"
#include "led.h"
#include "delay.h"

int main()
{
  u8 i;
  u8 len;
  u32 times = 0;
  //中断分组
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  //初始化延时函数
  delay_init(84);
  //初始化串口
  uart_init(115200);
  //初始化led
  LED_Init();
  //循环
  LED0 = 0;
  while (1)
  {
    //检验接受标志
    //若接收到
    if (USART_RX_STA & 0x8000) //位15判定是否接收到数据
    {
      //确定接受信息的长度
      len = USART_RX_STA & 0x3fff; //位0到位14与1位与
      //输出提示信息
      printf("\r\n您发送的消息为:\r\n");
      //接受信息并串口输出
      for (i = 0; i < len; i++) {
        USART_SendData(USART1, USART_RX_BUF[i]); //使用库函数SendData向串口1发送数据
        //直到接收结束为止
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); //使用库函数检验发送是否接受完成
      }
      printf("\r\n\r\n");
      //检验标志复位
      USART_RX_STA = 0;
    }
    //没有接收到
    else 
    {
      times++;
      if (times % 30 ==0) LED0 = !LED0;
      if (times % 500 == 0) printf("\r\n请输入要输出的内容\r\n");
      if (times % 3000 == 0) printf("\r\n年轻人啊!身残志坚。\r\n");

      //延时
      delay_ms(10);
    }

  }
}

使用寄存器:

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "sys.h"


int main(void)
{
  u8 i; //循环计数位
  u8 len;
  u32 times;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为2
	uart_init(115200); //串口初始化波特率设置为115200
	delay_init(84); //延时初始化
	
  led_init();
  //GPIO_ResetBits(GPIOF, GPIO_Pin_9); //点亮红灯

  while (1){
    if (USART_RX_STA & 0x8000) //USART_RX_STA位15(第16位)为接收完成标志,其作用在于判定是否接收完成
    { 
      len = USART_RX_STA & 0x3fff; //得到此次收到的数据长度
      printf("\r\n您发送的消息为:\r\n");
      for (i = 0; i < len; i++) {
        USART1->DR = USART_RX_BUF[i];
        while ((USART1->SR & 0x40) == 0); //USART1->SR位6为发送完成位,具体寄存器相关配置参考文档《stm32f4xx中文参考手册》
      }
      printf("\r\n\r\n");
      USART_RX_STA = 0;
    } else 
    {
      times++;
      if (times % 5000 == 0) {
        printf("\r\nALIENTEK 探索者STM32F407开发板 串口实验\r\n");
				printf("正点原子@ALIENTEK\r\n\r\n\r\n");
      }
      if (times % 200 == 0) printf("请输入数据,以回车键结束\r\n");
      if (times % 30 == 0) LED0 = !LED0;//led闪烁提示正在运行程序
      delay_ms(10);
    }

	}
}

正确的输出结果应该是这样的(以库函数版本为例):

同时红色LED显示灯不停闪烁。 

猜你喜欢

转载自blog.csdn.net/easylovecsdn/article/details/81876850