一位萌新为参加robomaster所做的前期准备

编程入门 行业动态 更新时间:2024-10-27 10:30:43

一位萌新为参加robomaster<a href=https://www.elefans.com/category/jswz/34/1707811.html style=所做的前期准备"/>

一位萌新为参加robomaster所做的前期准备

一位萌新为参加robomaster所做的前期准备–stm32基础(一)(串口通信)


作为一名电控成员首先要掌握的就是单片机,学习阶段我用的是stm32F103ZE的板子,且用的是标准库版本,一个知识点一个知识点得学习(robomaster用的是stm32F427II的板子,且为了cubemx能够配置,后期用的是HAL库版本)

我认为前期学习标准库更能够了解单片机的运作,且后期转到HAL也很快上手。
ok,接下来是本文的正题–串口通信:

一、实验目的
在开发板上电时通过USART1发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑(通过串口调试助手)。

二、方案
① 实验要运用到串口接收,发送引脚(初始化相应的GPIO口,对其进行配置)
② 需要打开串口(对USART进行配置)
③ 需要配置中断相关信息及优先级(此实验就一个功能,因此优先级设置在此实验中并不能看出什么)
④ 编写中断服务函数

三、流程图(这些流程图是我用world画的…大家为了方便可以用专门软件,比如MindMaster)

四、相关代码

//主函数
int main(void){port_init();    //调用串口函数while(1){;}     }//串口函数(这是此实验的关键代码)
void port_init(void){USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;
//定义USART,GPIO,NVIC结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//打开GPIO,USART1的时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;// 推挽复用输出	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化接收引脚,配置相关信息GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入	GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化发送引脚,配置相关信息USART_InitStructure.USART_BaudRate=115200;//比特率设置USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长(8)USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位(1)USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶位(无)USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  //无硬件数据流控制USART_Init(USART1,&USART_InitStructure);//配置USART相关信息USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //设置中断条件并且使能中断USART_Cmd(USART1,ENABLE);  //使能串口NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);//配置中断优先级
}void USART1_IRQHandler(void){//中断服务函数,此函数内部根据自身要求自行编写uint16_t r;if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET){  //若中断发生(接收到字符)r=USART_ReceiveData(USART1);  //接收字符串存到rUSART_SendData(USART1,r);   //将r中的字符串发送到显示屏		 //while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET){// ;} }USART_ClearFlag(USART1,USART_FLAG_TC);  //清除中断标志位}

五、相关知识点(不完全,可以再找相关资料)

② 单工:数据传输只支持数据在一个方向上传输;
半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

③ 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。
异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线。
在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。
在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。
④ 要配置全双工的串口1,把串口的Tx引脚配置为复用推挽输出,Rx引脚为浮空输入,数据完全由外部输入决定。
配置USAT1通信参数为:波特率115200,字长8,1个停止位,没有校验位,不使用硬件流控制,收发一体工作模式,然后调用USART初始化函数完成配置。

⑥ 串口通信常用的库函数
USART_Init()
//初始化USART串口
USART_ITConfig()
//使能串口中断
USART_Cmd()
//使能串口
USART1_IRQHandler()
//中断服务函数
USART_GetITStatus(()
//检测中断发生与否
USART_ReceiveData()
//接收数据
USART_SendData()
//发送数据
USART_ClearFlag()
//清除中断标志
. 总结
本次实验完成了串口通信,大体理解串口通信的相关原理及知识,基本熟悉相关流程,关键在于串口相关的配置(比特率,停止位,字长,奇偶位,模式等)。这是最简单的串口通信实验,如果要接收发送不定字长的字符串,需要更复杂的代码,比如运用串口空闲中断等等,已达到接收发送目的(在robomaster中就是运用空闲中断来接收遥控器传输的18帧数据,后期将会写到)。
串口设置步骤:
1)串口时钟使能,GPIO 时钟使能
2) GPIO 端口模式设置
3) 串口参数初始化
4)使能串口
5)使能中断
6)初始化 NVIC
7) 编写中断处理函数

更多推荐

一位萌新为参加robomaster所做的前期准备

本文发布于:2024-03-08 22:20:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722621.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:所做   robomaster

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!