【STM32】stm32串口通信入门

目录

一、串口协议和RS-232标准

1.串口通讯

2.RS-232标准

3.RS232电平与TTL电平的区别

4."USB/TTL转232"模块(以CH340芯片模块为例)

二、用标准库方式,完成LED的点灯

1.Keil工程的建立和代码的编写

2.实物连接

3.程序烧录

4.实验结果

三、STM32系统给上位机(win10)连续发送“hello windows!”

1.Keil工程建立和代码编写

2.实物连接

3.程序烧录

4.串口发送

5.实验结果

参考博客:


一、串口协议和RS-232标准

1.串口通讯

串口通讯是一种设备间非常常用的串行通讯方式,因为它简单、便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通 讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。

串口按位(bit)发送和接收字节。尽管比按字节的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

波特率:一个衡量符号传输速率的参数。指的是信号被调制以后在单位时间内的变化,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd。

数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。

2.RS-232标准

RS-232 标准主要规定了信号的用途,通讯接口以及信号的电平标准。

如下图所示,由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL校准”的电平信号,才能实现通讯。

3.RS232电平与TTL电平的区别

从下表中我们可以看出,TTL和RS-232的电平标准不同。理想状态下,使用 5V 表示二进

制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-

15V 表示逻辑 1,+15V 表示逻辑 0。

下图为使用 RS232 与 TTL 电平校准表示同一个信号时的对比

因为控制器一般使用 TTL 电平标准,所以常常会使用 MA3232 芯片对 TTL 及 RS-232

电平的信号进行互相转换。

4."USB/TTL转232"模块(以CH340芯片模块为例)

USB转串口即实现计算机USB接口到物理串口之间的转换。可以为没有串口的计算机或其他USB主机增加串口,使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备。

我们将 CH340G 的 TXD 引脚与 USART1 的 RX 引脚连接,CH340G 的 RXD 引脚与

USART1的 TX引脚连接。CH340G芯片集成在开发板上,其地线(GND)已与控制器的 GND

连通。实现其 USB 转 USART 功能。

二、用标准库方式,完成LED的点灯

1.Keil工程的建立和代码的编写

 (1)如图创建工程

(2)添加文件

(3)导入对应的工程文件

(4)导入文件夹

(5)部分代码

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)  //开启GPIOA的时钟
											//使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				//GPIO引脚,赋值为第0号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);			//将赋值后的构体变量传递给GPIO_Init函数
											//函数内部会自动根据结构体的参数配置相应寄存器
															//实现GPIOA的初始化
	
	/*主循环,循环体内的代码会一直循环执行*/
	while (1)
	{
		/*设置PA0引脚的高低电平,实现LED闪烁,下面展示3种方法*/
		
		/*方法1:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平*/
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为低电平
		Delay_ms(500);										//延时500ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);					//将PA0引脚设置为高电平
		Delay_ms(500);										//延时500ms
		
	}
}

Delay.c:

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h:

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

2.实物连接

3.程序烧录

4.实验结果

三、STM32系统给上位机(win10)连续发送“hello windows!”

设置波特率为9600,1位停止位,无校验位;让STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。

1.Keil工程建立和代码编写

(1)创建工程

按照上述步骤创建工程并添加对应文件。

(2)新建文件夹用于存放工程,具体添加文件夹和工程可以参考下面博客:

STM32新建keil标准库工程(F103C8T6)_stm32f103c8t6在keil里面选哪个-CSDN博客

我们添加好文件夹后的工程如下:

(3)部分代码

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

int main(void)
{
	/*模块初始化*/
	OLED_Init();						//OLED初始化
	
	Serial_Init();						//串口初始化
	while (1)
	{
		Serial_SendString("hello world!");		//串口发送字符串
		Delay_ms(500);
	}
}

Delay.c:

#include "stm32f10x.h"
/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

Delay.h:

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

2.实物连接

RXD连接在A9处;TXD连接在A10处,GND接负极。

3.程序烧录

将STLink接在电脑上,按图片进行操作

4.串口发送

5.实验结果

参考博客:

串口协议和RS-232标准,RS232电平与TTL电平的区别,USB/TTL转232“模块(以CH340芯片模块为例)_232协议电平-CSDN博客

STM32新建keil标准库工程(F103C8T6)_stm32f103c8t6在keil里面选哪个-CSDN博客

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值