STM32F103_study43_The punctual atoms(STM32 Echo experiment based on serial communication )
1.目的:做回显实验:
2.开发步骤:
只要是用到串口的实验,都必须对串口做下列的配置
3.所用到的软件和硬件:
4.串口操作的相关的函数、寄存器:
USART_SR状态寄存器:
USART_DR
USART_DR
五、逻辑分析:
1.我们是做回显实验,会用到串口,所以我们的先分析串口我们应该怎么设置。
之前任何操作都需要使能。不仅仅是外设,那该使能哪一个串口呢?我们查看原理图和系统结构图可知。我们需要的串口最好是异步通信的,这样代码书写要简单一点。而异步通信串口有好几个,这里我们随便选择一个,选择USAET1。由于开发板未来节约用电,硬件上面,当没有用的硬件,就不会给它供电,所以我们需要先进行使能。
*
而使能函数也有很多个,那我们应该找哪一个使能函数呢?*
看下图可知,USART1挂载在APB2线上面,所以我们去使能函数是APB2的。
而使能函数放在那里的呢?
放在下面的这个文件里面。
那这些使能函数写在哪儿呢?
你可以写在main函数外面,也可以写在main里面,但是由于这些代码知识单纯的一句,所以你最好是写成一个函数,然后main里面再调用这个函数。而这是对于串口的一个操作,就把它命名为串口函数,把关于串口的初始化操作都可以放在这个函数中。
这些函数里面的参数有哪些可能的取值呢?
先按照这个函数找到,这个函数的定义在哪一个STM32提供的库函数的C文件里面的那个位置。然后点击下面这个函数,就能够知道,这个函数的这个参数的允许取值有哪些了。
这就是该参数的允许取值。
为啥使能GPIOA呢?
通过分析系统结构图和原理图知道,USART1是一个串口,它是进行发送和接收数据的,而接收和发送数据是通过PA9和·PA10的复用功能实现的,所以的使能GPIOA。
3.这里是设置GPIOA的PA9和PA10引脚。
为啥先定义一个结构体呢?
在STM32开发中,ST公司提供的STM32固件库,里面为每一个外设的可能涉及到的配置全部都写进了一个结构体里面,这样有利于加快开发工作的进度。
GPIO_InitTypeDef GPIO_InitStrue;
为啥设置为GPIO_Mode_Out_PP模式?
GPIO_InitTypeDef GPIO_InitStrue;GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;GPIO_InitStrue.GPIO_Mode=GPIO_Mode_Out_PP;
这个需要STM32数据手册分析结构图和STM32参考手册。得知PA9在usart1中作为输出口。PA10作为输入口。
怎样判断的是全双工工作模式呢?
由于我的输入和输出是用的两跟不同的引脚,所以使用全双工工作模式。
速度怎么选?
速度没啥影响,随便选一个就行。
GPIO_InitTypeDef GPIO_InitStrue;GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;GPIO_InitStrue.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
最后初始化,这是为了把之前做的这些设置全部写到开发板相应的寄存器中去
GPIO_InitTypeDef GPIO_InitStrue;GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;GPIO_InitStrue.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStrue);
波特率随便选一个,只要最后通信双方一样就行。
硬件控制流我也不知道怎么选
USART模式,因为输入和输出都需要。
后面三个,通信双方设置成一样的就行。
//串口初始化USART_InitStrue.USART_BaudRate=115200;USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStrue.USART_Mode=USART_Mode_Rx |USART_Mode_Tx ;USART_InitStrue.USART_Parity=USART_Parity_No;USART_InitStrue.USART_StopBits=USART_StopBits_1;USART_InitStrue.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_InitStrue);
//串口使能USART_Cmd(USART1,ENABLE);
//开启接收中断USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_InitStruce.NVIC_IRQChannel=USART1_IRQn;这个是为啥呢?我只不知道
NVIC_InitStruce.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruce.NVIC_IRQChannelSubPriority=1;
因为选择了中断组2
//设置中断NVIC_InitStruce.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStruce.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruce.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruce.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruce);
中断处理函数。名字是系统定义好的,这个的你自己去找。
u8 res;为啥定义的是8位,好像这个数据寄存器一次只能存储8位。
USART_GetITStatus(USART1,USART_IT_RXNE这个是为了确定此处中断是不是由USART_IT_RXNE这个位造成的。因为USART1的这个好像是状态寄存器有很多标志位,每一个标志位所造成的中断,都会进入到这个中断服务函数里面来执行。所以的判断是不是由USART_IT_RXNE这个位造成的中断。
res = USART_ReceiveData(USART1);这个函数会自动到USART1的数据寄存器里面去取数据。
USART_SendData(USART1,res);开发板,有吧数据原封不动的发回给USART1。这儿直接发给USART1就从,该函数会自动的把数据存储在USART的数据寄存器里面。
void USART1_IRQHandler(void)
{u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE)){res = USART_ReceiveData(USART1);USART_SendData(USART1,res);}
}
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
这是设置中断优先级分组,这个的在中断配置之前设置。
while(1);这个的设置,是为了让这个程序一直处于运行状态,虽然这个运行什么也没做。这个是因为,程序现在下载到开发板,主函数一直在进行,而上面的代码,是说明,开启了中断接收的,其实,开发板一直就是在等待这个中断出现。当中断出现了,主函数就被挂起,开发板上面的CPU就去运行,中断服务函数void USART1_IRQHandler(void)。当运行完中断服务函数,就又会回到主函数,继续进行死循环,等待下一次中断的发生。
int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); My_USART1_Init();while(1);}
补充:
首先我们进行的实验,我们要分析这个实验所涉及的硬件和软件有哪些,这个实验我们要用到开发板,调试助手,串口等。
串口是一个外设,所以我们首先要去STM32固件库里面找到该外设的结构体,分析结构体包含了那些成员,以及这些成员应该赋什么值。
串口就应该到usart头文件去找:
STM32F103_study43_The punctual atoms(STM32 Echo experiment based on serial communication )相关推荐
- 单片机设计 游戏_五子棋+黄金矿工+贪吃蛇(STM32、4.3寸电容屏)
单片机设计 游戏_五子棋+黄金矿工+贪吃蛇(STM32.4.3寸电容屏) 想要更多项目私wo!!! 一.电路设计 此电路由STM32F1精英版和4.3寸电容屏TFTLCD组成. 二.运行效果 三.部分 ...
- 超声波传感器介绍及其使用(STM32)
超声波传感器介绍及其使用(STM32) 超声波传感器型号 实物图 引脚 超声波传感器原理图 特点 工作原理 超声波传感器时序图 测量误差的产生 注意 超声波传感器部分代码 实验现象 源码获取 超声波传 ...
- libevent入门教程:Echo Server based on libevent - Blog of Felix021 - 日,泯然众人矣。
libevent入门教程:Echo Server based on libevent 转载请注明出自 http://www.felix021.com/blog/read.php?2068 ,如是转载文 ...
- 超声波模块详细介绍(stm32循迹小车中超声波的介绍)
超声波模块详细介绍(stm32循迹小车中超声波的介绍) 超声波模块是非常重要的一个模块,今天给大家全面介绍一下超声波模块的原理以及用法,代码的编写. 1 超声波模块的认识 首先,市面上的常见超声波模块 ...
- STM32 HAL库、标准外设库、LL库(STM32 Embedded Software)
STM32 Embedded Software 工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是常 ...
- openmv识别物体并与单片机通信(STM32)
openmv识别物体并与单片机通信(STM32) OPENMV端 物体识别 感光元件 寻找色块 画图 距离判断 距离 实际距离 串口发送 STM32段 串口接收 串口2配置 数据处理 数据显示 Ope ...
- 嵌入式物联网软件开发实战系列(STM32+FreeRTOS)
一.使用STM32CubeMx 创建物联网项目软件工程 二.STM32CubeMx 配置时钟 三.STM32CubeMx 配置GPIO 及 GPIO 相关接口在软件工程中的形式及使用 四.STM32C ...
- 【STM32 x ESP8266】连接 MQTT 服务器(报文,附部分源码解析)
MQTT 协议作为物联网非常重要的传输协议,如何使用它十分重要,如果有不理解的同学可以点击这里学习,这里只是简单介绍一下.同时这里附上MQTT 3.1.1协议中文版 pdf 的链接,对协议底层感兴趣的 ...
- Learn OpenGL 笔记7.3 PBR-IBL-Diffuse irradiance(Image based lighting-漫反射辐照度)
IBL,或image based lighting基于图像的照明,是一组照明对象的技术,不是像前一章那样通过直接分析光,而是将周围环境视为一个 big light source大光源.这通常通过操纵立 ...
- ADC模数转换器(STM32系列)
Cortex-M4-模数转换器 模数转换器概述 模数转换器用途 MCU(单片机)种只能处理数字量,但当外界输入模拟量信号时,单片机会通过模数转换器将模拟量信号转化成数字量信号供MCU处理,并且当MCU ...
最新文章
- 2021操作系统知识结构图
- 在Servlet使用getServletContext()获取ServletContext对象出现java.lang.NullPointerException(空指针)异常的解决办法...
- 一次Task.Run异常问题的排查
- 日本原装进口雪平锅,1台顶4台,有它谁还点外卖?
- [css] 如何取消页面中选中的文字?
- 虚拟化部署之Windows 7中远程管理Hyper-V
- NDK配置文件Android.mk简介
- fork和vfork,exec
- Dart教程(四):语法
- 电脑分屏没有声音_电脑用HDMI线分屏后,耳机或音箱没声音之完美解决!
- 求平方根java实现
- Twitter技术主管回怼马斯克!马斯克:He’s fired!
- 使用Horner法则计算多项式的值
- Pygame详解(十一):Rect 对象
- 化妆品级羧甲基纤维素钠(CMC)-市场现状及未来发展趋势
- 惊艳的产品背后,是锐利的设计思维
- 【python】Dpark源码分析
- 行测做的慢,如何提升做题速度?怎么提升正确率?
- 摄像机服务器端返回消息错误,_平安城市_视频监控(本科)毕业论文设计.doc
- ReLU函数 Vs Sigmoid 函数——XOR问题究竟用那个好
热门文章
- UT000010 Session is Invalid
- 大牛程序员带你走进互联网:资历深不是优势,资源才是难得的宝藏!
- 深度模型训练之learning rate
- 小猿日记(9) - 今天,我又拒绝了阿里的一次机会
- C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)
- Metadata 元数据信息详解
- python批量转换音频采样率
- 新冠疫情中,机器人开始担任基本劳动力...
- 图像处理空间域、变换域、时域和频域的含义理解:spatial VS transforms domain
- AES加密报错Given final block not properly padded