STM32
直播中

哈哈哈

10年用户 861经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

STM32串口通信实验如何实现LED显示灯不停闪烁?

STM32串口通信实验如何实现LED显示灯不停闪烁?

回帖(1)

许朝亮

2021-12-16 10:49:51
这里先给出程序源码:

调用库函数:


#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("rn您发送的消息为:rn");
      //接受信息并串口输出
      for (i = 0; i < len; i++) {
        USART_SendData(USART1, USART_RX_BUF); //使用库函数SendData向串口1发送数据
        //直到接收结束为止
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); //使用库函数检验发送是否接受完成
      }
      printf("rnrn");
      //检验标志复位
      USART_RX_STA = 0;
    }
    //没有接收到
    else
    {
      times++;
      if (times % 30 ==0) LED0 = !LED0;
      if (times % 500 == 0) printf("rn请输入要输出的内容rn");
      if (times % 3000 == 0) printf("rn年轻人啊!身残志坚。rn");

      //延时
      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("rn您发送的消息为:rn");
      for (i = 0; i < len; i++) {
        USART1->DR = USART_RX_BUF;
        while ((USART1->SR & 0x40) == 0); //USART1->SR位6为发送完成位,具体寄存器相关配置参考文档《stm32f4xx中文参考手册》
      }
      printf("rnrn");
      USART_RX_STA = 0;
    } else
    {
      times++;
      if (times % 5000 == 0) {
        printf("rnALIENTEK 探索者STM32F407开发板 串口实验rn");
                                printf("正点原子@ALIENTEKrnrnrn");
      }
      if (times % 200 == 0) printf("请输入数据,以回车键结束rn");
      if (times % 30 == 0) LED0 = !LED0;//led闪烁提示正在运行程序
      delay_ms(10);
    }

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



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

更多回帖

×
20
完善资料,
赚取积分