USART 系列文章目录

五一假期,博主闲着没事,想起之前自己调试串口控制LED的亮灭问题尚未解决,便开始调试,再调试了一会时间后,觉得应该把它记录下来。

这一切问题的起源还得怪之前调试不认真,太浮躁了。


文章目录

  • USART 系列文章目录
  • 前言
  • 一、配置串口
  • 二、主要操作
    • 1.通过串口中断
    • 2.通过主函数
  • 三、库函数分析
    • 1.USART_GetITStatus(USARTx, USART_IT_RXNE)
    • 2.USART_ReceiveData(USART1)
  • 总结

前言

其中使用USART串口的一些配置方法在我之前的博客有粗略带过,纯小白看不懂建议看看其他csdn大佬们写的配置USART的方法和步骤。
我写这篇博客的目的是通过USART串口控制LED的亮灭问题,记录下我所调试过程中遇到的问题,和对于串口的一些自己的理解。


一、配置串口

由于我之前的博客有带过,就那几个步骤,注意下需要和电脑进行通信所配置的串口号、波特率、奇偶校验位、停止位、数据位那几个特殊注意下,以方便和电脑的串口调试助手进行通信。
我所使用的是XCOM的串口调试助手。


这里就贴下我所配置的串口代码吧

void uart_init(u32 bound){//GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟//USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RX     GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  //USART 初始化设置USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  //收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1USART_Cmd(USART1, ENABLE);                    //使能串口1 }

二、主要操作

我试过了两种方法来控制LED亮灭,一种是通过串口中断从而使LED的状态翻转,另外一种则是跳过中断,在主函数中使LED的状态翻转。

1.通过串口中断

基于配置好的串口,我们需要加上一个串口中断初始化的配置函数和串口中断处理函数

串口中断初始化的配置函数如下:

void NVIC_Init()
{NVIC_InitTypeDef NVIC_InitStructure;//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;     //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
}

对于中断的相应问题日后的会特意写一篇博客来分析。

font color=#256AAA >串口中断处理函数如下:

void USART1_IRQHandler(void)
{u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){Res =USART_ReceiveData(USART1); //读取接收到的数据printf("Receive Succsed: %2x \r\n", Res);//回复接收完成if(Res==0x01)LED0=!LED0;//USART_ClearFlag(USART1,USART_IT_RXNE);}
}

分析:在该段函数中,我先定义了一个Res的变量来储存串口接收到的数值,再通过printf函数(使用的是原子哥所重写的函数)将其打印到串口。
使用得到Res的函数与对应的数值进行比较,从而翻转LED0的状态。

2.通过主函数

char ReceivedData = NULL;int main( void )
{u8 Receive_Data = 0;NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );       /* 设置NVIC中断分组2:2位抢占优先级,2位响应优先级 */uart_init( 115200 );                                      /* 串口初始化为9600 */delay_init();                                           /* 延时函数初始化 */LED_Init();BEEP_Init();while ( 1 ){delay_ms(1000);printf("开始测试\r\n");if(USART_GetITStatus(USART1, USART_IT_RXNE))        //若接收到数据{Receive_Data = USART_ReceiveData(USART1);        //读取数据后,RXNE标志位自动清零;printf("Receive Succsed: %d \r\n", Receive_Data);if(Receive_Data == '1'){LED0 = !LED0;}else{printf("runing\r\n");delay_ms(2000);}}}
}

分析:在该段函数中,同样也是使用了一个中间变量来储存串口接收的数据。

———————————————————————————————————————

要注意的是:用此方法,轮询接收stm32发送的时候,只能接收一个字符,而不能接收多个字符,接收多个字符就会出问题,同时在串口调试助手的时候,要将“发送新行”取消勾选,否则也是会出问题的。

三、库函数分析

在这几段代码中我都使用到了库函数,下面将其列出来:

  1. USART_GetITStatus(USART1, USART_IT_RXNE)
  2. USART_ReceiveData(USART1)
    对于通过串口控制LED状态翻转的实现中,这些库函数格外重要。

1.USART_GetITStatus(USARTx, USART_IT_RXNE)

该函数可以用于获取中断信息,并返回1或者0.
在这个功能的实现中,使用了USART_IT_RXNE这个状态标记位。

2.USART_ReceiveData(USART1)


该函数可以将接收到的数据赋值给另外一个变量。

Receive_Data = USART_ReceiveData(USART1);        //读取数据后,RXNE标志位自动清零;

总结

注意USB转TTL接口的接线问题,确保它正确接线。
同时,各位读者还可以基于这篇博客的基础,自己外扩串口控制其他模块的功能。举一反三。

写这篇博客主要还是想告诉自己戒骄戒躁,调试程序的时候需要耐心。

通过串口控制LED的亮灭相关推荐

  1. 【GD32F427开发板试用】-01-UART1 串口控制LED灯亮灭

    本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站.作者:智能家居-九俊楚子 今天用GD32F427R开发板先测试了UART1的通信功能,然后通过 ...

  2. Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】

    目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...

  3. 安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)

    系列博文: (1)安卓手机与蓝牙模块联合调试(一)--蓝牙模块的串口通讯 (2)安卓手机与蓝牙模块联合调试(二)-- 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)-- 单片 ...

  4. 安卓手机与蓝牙模块联合调试(三)—— 单片机蓝牙控制LED灯亮灭(下)

    源码获取 https://gitcode.net/cjt-bluetooth/android-51mcu 系列博文: (1)安卓手机与蓝牙模块联合调试(一)--蓝牙模块的串口通讯 (2)安卓手机与蓝牙 ...

  5. 用51单片机中断控制LED灯亮灭

    用51单片机中断控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k3=P3^2;//位定义按键 void dela ...

  6. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  7. STM32F072 Nucleo笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭

    STM32F072 Nucleo学习笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭 本文例子用到: 1.  STM32F072 Nucleo开发板 2.  STM32CubeMX软 ...

  8. 用51单片机实现按键控制LED灯亮灭

    用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...

  9. verilog 按键控制LED的亮灭状态

    主要功能:按下按键0,从左到右点亮led;按下按键1,从右到左点亮led;按下按键2时,四个led间隔亮灭:按下按键3时,点亮全部led.亮灭间隔时间为0.5s,时钟为50MHz. //author ...

  10. Proteus:单片机用按键控制LED的亮灭

    题目概述: 单片机用按键控制LED的亮灭. 编程: #include <reg51.h> sbit beep=P1^5; sbit LED=P0^0; sbit k1=P1^0; void ...

最新文章

  1. GARFIELD@11-07-2004
  2. 大厂中秋礼盒大PK!祝大家中秋快乐,送大家鹅厂月饼礼盒!
  3. 化繁为简 - 腾讯计费高一致TDXA的实践之路
  4. 如何封装Spring bean
  5. 原生js封装table表格操作,获取任意行列td,任意单行单列方法
  6. TensorFlow 深入MNIST
  7. Java EE之JSP
  8. 第四章 网络层[练习题+课后习题]
  9. SOLARIS UFS文件系统解析
  10. 你可以做一个更好的Coder为了自己的将来
  11. office2016 + visio2016
  12. 贝塞尔曲线运动n阶追踪方程的数学原理及其匀速化方法和应用
  13. 关于电脑突然没声音(Realtek High definition),电脑声卡驱动安装不上(已解决)
  14. 基于支持向量机的新闻分类
  15. python注释语句会不会被解释器过滤掉_Python注释
  16. HTML+CSS入门学习
  17. Melancholy 题解
  18. 2021年大厂iOS 面试题 - 前篇
  19. 微信小程序2D canvas绘制分享海报
  20. tokenpocket内网页获取用户钱包信息

热门文章

  1. 使用Netty封装的部标JTT808 | JTT1078 | 渝标协议 数据上传Android端
  2. win10红警2黑屏_在windows 10中完美的运行《命令与征服·红色警戒2+尤里的复仇资料片...
  3. linux拔掉网线ip仍然在,openwrt 实现网线的拔插能够释放IP和重新分配IP地址
  4. 配置谷歌android依赖镜像
  5. 机器学习在社会科学中的应用
  6. 2.1 ppt 用图形搞定 封面(2)
  7. python done()什么意思_turtle.done()的作用是什么
  8. %date~0,4%和 %time~0,2%等用法详解
  9. BES ANC降噪耳机在量产中发现的噪声
  10. 通用软件体系结构风格总结为五个大类