实验目的
显然不是纯粹为了钻研,有被毕设逼迫的成分,本来选择51,但是感觉51资源不太够用,而且51的逼格不够,答辩的话stm32感觉逼格高一些,但是也增加了风险,我对51的资源,寄存器,开发流程都相当熟悉,但是32的话仅仅还是入门,只能跟着比人用库开发,万一有懂行的老师,那就GG,所以无论什么原因,既然选择32,就要好好学习。闲话到此结束,上正文。
串口简介
stm32的串口资源还是比较丰富的,有三个同步异步串口,两个异步串口,这里针对的是stm32f103ZET6。分别挂接在APB1和APB2上,其中串口1挂接在APB2总线上,有更快的时钟频率,这里采用的是串口1。串口1有多种事件可以触发中断,这里采用的是接收缓冲区非空触发,即RXNE。即把接收消息放在中断里,也可以不采用中断的方式,在主函数循环里面轮询,效率相对较低,而且不能满足实时要求。实验采用的方法是由PC机向stm32发送一个字节的数据,然后判断字节内容,点亮LED灯。
配置流程
关于串口实验的说明
- 开发板,stm32f103zet6;
- 串口,USART1,挂接在APB1总线上,引脚为PA9(TX),PA10(RX);
- 串口调试助手,要在连接上USB线后才能打开;
配置流程
-
初始化时钟
需要初始化GPIOA和USART1的时钟,都在APB2总线上; -
初始化GPIOA端口
PA9设置为复用推挽输出,要用它发送数据。PA10设置为浮空输入。关于端口的设置可以参考《stm32f10xxx参考手册》8.1.11章节。 -
初始化串口
9600,8-N-1;无硬件控制流,读写均开启; -
中断触发事件配置
RXNE,接收缓冲区非空(有数据发过来); -
优先级配置
优先级分组,优先级设置; -
串口使能
代码
- 串口部分
#include "usart.h"
u8 recv;
void USART1_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/*时钟初始化*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/*端口初始化*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/**/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode =</