STM32学习笔记3 正点原子miniSTM32串口通信实验

这篇具有很好参考价值的文章主要介绍了STM32学习笔记3 正点原子miniSTM32串口通信实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初学者学习总结,如有错误,请大神指正


目的:用 STM32 的串口来发送和接收数据。

一、STM32串口

1.1 简介

ALIENTEK MiniSTM32 V3 版开发板选择的是 STM32F103RCT6 作为 MCU,拥有5 个串口分别为

USART1、USART2、USART3、UART4、UART5,

其中只有USART1挂载在APB2总线上,其余均挂载在APB1总线上

APB1操作速度限于36MHz,APB2操 作于全速(最高72MHz)。

注:

UART     通用异步收发器

USART   通用同步异步收发器

1.2 端口复用

在STM32F103RCT6中串口 1 的引脚对应的 IO 为 PA9,PA10而PA9,PA10 默认功能是 GPIO,所以当 PA9,PA10 引脚作为串口 1 的 TX,RX 引脚使用的时候,那就是端口复用。

复用端口初始化有几个步骤:

1) GPIO 端口时钟使能。要使用到端口复用,当然要使能端口的时钟了。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

2) 复用的外设时钟使能。比如你要将端口 PA9,PA10 复用为串口,所以要使能串口时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

3) 端口模式配置。在 IO 复用位内置外设功能引脚的时候,必须设置 GPIO 端口的模式。下表为对应模式

alientek ministm32,stm32,单片机,学习

 例如要配置全双工的串口 1  

代码如下

//USART1_TX PA.9 复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX PA.10 浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA,GPIO_InitStructure);

1.3 USART库函数

alientek ministm32,stm32,单片机,学习

1.4 串口设置 

串口设置的一般步骤可以总结为如下几个步骤:

1) 串口时钟使能,GPIO 时钟使能

2) 串口复位 3) GPIO 端口模式设置

4) 串口参数初始化

5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

6) 使能串口

7) 编写中断处理函数文章来源地址https://www.toymoban.com/news/detail-759640.html

1.5 主要函数介绍

1)串口时钟使能

串口是挂载在 APB2 下面的外设,所以使能函数为:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

2)串口复位

 alientek ministm32,stm32,单片机,学习

USART_DeInit(USART1); //复位串口 1 

3)串口参数初始化

alientek ministm32,stm32,单片机,学习

 一般的实现格式为:

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); //初始化串口

4)数据发送与接收

STM32 的发送与接收是通过数据双寄存器 USART_DR 来实现的,包含了 TDR 和 RDR。

当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,存在该寄存器内。

  • 发送数据

alientek ministm32,stm32,单片机,学习

例如

USART_SendData(USART3, 0x26);

  • 接收数据

alientek ministm32,stm32,单片机,学习例如

USART_ReceiveData(USART3, 0x26); 

 5)串口状态

alientek ministm32,stm32,单片机,学习

6)串口使能

alientek ministm32,stm32,单片机,学习

 例如

USART_Cmd(USART1, ENABLE);

7)开启串口响应中断

alientek ministm32,stm32,单片机,学习

 alientek ministm32,stm32,单片机,学习

例如

 USART_ITConfig(USART1, USART_IT_Transmit ENABLE);

8)获取相应中断状态

alientek ministm32,stm32,单片机,学习

例如

 ITStatus ErrorITStatus;

ErrorITStatus = USART_GetITStatus(USART1, USART_IT_OverrunError);

二、硬件连接

在ALIENTEK MiniSTM32 V3 版开发板上串口 1 与 USB 串口并没有在 PCB 上连接在一起,需要用跳线帽连接。

如图

alientek ministm32,stm32,单片机,学习

 三、程序设计

3.1 串口初始化程序

void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
    //使能USART1,GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  
	//USART1_TX即GPIOA9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9
   
    //USART1_RX即GPIOA10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

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

}

代码编写对应步骤:

1) 串口时钟使能,GPIO 时钟使能

2) 串口复位

3) GPIO 端口模式设置

4) 串口参数初始化

5) 开启中断并且初始化 NVIC

6) 使能串口

3.2 中断接收程序

void USART1_IRQHandler(void)                	//串口1中断服务程序
	{
	u8 Res;
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
    //接收中断(接收到的数据必须是0x0d 0x0a结尾)
		{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
				}
			else //还没收到0X0D
				{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
					{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                    //接收数据错误,重新开始接收	  
					}		 
				}
			}   		 
     } 

即第七步

7) 编写中断处理函数

3.3 main

#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
int main(void)
{
	u8 t;
	u8 len;
	u16 times=0; 
	
	delay_init(); //延时函数初始化
	uart_init(9600); //串口初始化为 9600
	LED_Init(); //初始化与 LED 连接的硬件接口
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 
	
	while(1)
	{
		if(USART_RX_STA&0x8000)
		{ 
			len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			
			printf("\r\n 您发送的消息为:\r\n");
			
			for(t=0;t<len;t++)
			{
				USART1->DR=USART_RX_BUF[t];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			
			printf("\r\n\r\n");//插入换行
			
			USART_RX_STA=0;
		}else
		{
			times++;
			
			if(times%5000==0)
			{
				printf("\r\nALIENTEK MiniSTM32 开发板 串口实验\r\n");
				printf("正点原子@ALIENTEK\r\n\r\n\r\n");
			}
			
			if(times%200==0)printf("请输入数据,以回车键结束\r\n"); 
			if(times%30==0)LED0=!LED0;//闪烁 LED,提示系统正在运行.
			
			delay_ms(10); 
		}
	}
}

到了这里,关于STM32学习笔记3 正点原子miniSTM32串口通信实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 正点原子--STM32基本定时器学习笔记(1)

    目录 1. 定时器概述 1.1 软件定时原理 1.2 定时器定时原理 1.3 定时器分类 1.4 定时器特性表 1.5 基本、通用、高级定时器的功能整体区别 2. 基本定时器简介 3. 基本定时器框图 时钟树分析 这部分是笔者对基本定时器的理论知识进行学习与总结!主要记录学习过程中遇到的重难点

    2024年02月19日
    浏览(47)
  • 【正点原子】STM32电机应用控制学习笔记——8.FOC简介

    FOC是适用于无刷电机的,而像有刷电机,舵机,步进电机是不适用FOC的。FOC是电机应用控制难度最大的部分了。 FOC(Filed Oriented Control)即磁场定向控制,又称磁场矢量控制(VC,Vector Control),也就是控制磁场的方向以及大小。 无刷电机的无感控制是六步换向,设定初始电流

    2024年01月22日
    浏览(41)
  • 【【STM32-29正点原子版本串口发送传输实验】

    通过串口接收或发送一个字符 例程目的 开发板上我们接入的是实现异步通信的UART接口 USB转串口原理图 我们一步步分析 PA9是串口1 的发送引脚 PA10是串口1 的接受引脚 。因为我们现在只是用到异步收发器功能,所以我们现在只需要 stm32fxx_hal_uart.c 文件(及其头文件)的驱动代

    2024年02月09日
    浏览(33)
  • stm32F407学习DAY.14 在DMA模式下进行USART串口数据收发(正点原子例程为例)

    目录 一、DMA配置 1、DMA1和DMA2的请求映射 2、DMA挂载总线 3、DMA相关库函数 ​4、DMA配置过程(以串口1为例) 1)进行时钟使能 2)等待DMA可配置 3)初始化DMA(串口1的TX为DMA2 数据流7 通道4,RX为DMA2 数据流5 通道4) a.DMA外设地址par: b.DMA存储器0地址mar: c.数据传输量ndtr: 4)

    2024年02月04日
    浏览(39)
  • 【正点原子】STM32电机应用控制学习笔记——2.直流无刷电机基础知识

    没有电刷,无换向器的电机,也称为无换向器电机。 主要是定子和转子,而直流有刷电机多的是换向器和电刷。 而直流有刷的定子是N和S的永磁体,而无刷是三个线圈饶阻。 直流有刷是定子是饶阻,无刷的定子是N和S的永磁体。两者的转子和定子恰好是相反的。也是他们最大

    2024年02月03日
    浏览(62)
  • 基于STM32的正点原子LORA模块通信网络

    LoRa是semtech公司开发的一种低功耗局域网无线标准,其名称“LoRa”是远距离无线电(Long Range Radio),它最大特点就是在同样的功耗条件下比其他无线方式传播的距离更远,实现了低功耗和远距离的统一,它在同样的功耗下比传统的无线射频通信距离扩大3-5倍。 距离往往可达

    2023年04月08日
    浏览(36)
  • 笔记:正点原子LVGLv8.2移植stm32

    *移植芯片要求⬇ *16,32或64位微控制器或处理器 *主控频率:16Mhz *Flash/ROM:64kb,建议180kb以上 *RAM:8kb,建议24kb以上 *图形缓冲区:水平分辨率像素,建议>1/10屏幕总像素  玻珠用了正点原子stm32f407m144最小系统板,满足要求(具体可查看对应硬件开发手册) *lvglv8.2文件下载⬇ *地址:

    2024年03月14日
    浏览(52)
  • 【STM32】学习笔记(串口通信)

    串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力。 电平标准

    2024年02月10日
    浏览(30)
  • 【【萌新的STM32的学习--非正点原子视频的中断设计思路】】

    我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以是下降沿触发 那么对于何种模式有很多人

    2024年02月11日
    浏览(41)
  • 正点原子STM32嵌入式学习-keil5安装教程

    前言:本人没有什么嵌入式的经验,但是看到硬件的同事做开发板比较好玩,比较感兴趣。刚好有这样一个机会,可以跟随《原子教你玩STM32(库函数版)》课程线下学习,在此,将本次课程的学习做一个记录。相信对我这样一个小白来说,帮助还是会非常大的。 目录 一.下

    2024年03月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包