对串口通信的初次尝试

一、STM32CubeMX安装

1.1安装JRE环境

这个是使用Java开发的一个工具,所以要先安装JRE环境。
1.下载完安装包后,点击安装,如下(若不想使用默认路径,记得在左下方勾选“更改目标文件夹”)。选择安装
在这里插入图片描述
2.修改安装路径, 点击下一步。注:(安装路径的文件夹是空文件夹)
在这里插入图片描述
3.然后等待完整完成关闭即可
在这里插入图片描述
在这里插入图片描述

1.2安装STM32CubeMX

1、下载完安装包后,点击安装
在这里插入图片描述
2、接受条款,下一步
在这里插入图片描述
3、选择第一个即可,下一步
在这里插入图片描述
4、更改默认安装位置。注:(文件夹必须为空文件夹)
在这里插入图片描述
5、更改目录,同意吧
在这里插入图片描述
6、默认,继续下一步
在这里插入图片描述
7、等待安装完成
在这里插入图片描述

1.3HAL库安装

在线安装:
1.打开安装好的 STM32CubeMX 软件 点上面的Help -> Manage embedded software packages(如果第一打开有提示界面,选最后一个 NO thank 就可以了)
在这里插入图片描述
2.然后选择你的芯片型号,安装既可以了( 点击“Install Now” )
在这里插入图片描述

二、C语言实现流水灯

2.1用C语言 寄存器方式编程实现流水灯

1.创建项目
在这里插入图片描述
在这里插入图片描述

2.选择STM32F103C8作为实验所用开发板
在这里插入图片描述
并对其进行配置
在这里插入图片描述
3.在output里选择create hex file
在这里插入图片描述
4.source group里创建led.c,并写入代码,注意项目结构,使用的引脚是PA5,PB9,PC14
在这里插入图片描述

#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800

#define RCC_APB2ENR (*(unsigned int *)0x40021018)

#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)

#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
	


void SystemInit(void);
void Delay_ms(volatile  unsigned  int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}

void A_LED_LIGHT()
{
	GPIOA_ODR=0x0<<5;		//PA5???
	GPIOB_ODR=0x1<<9;		//PB9???
	GPIOC_ODR=0x1<<14;		//PC14???
}
void B_LED_LIGHT()
{
	GPIOA_ODR=0x1<<5;		//PA5???
	GPIOB_ODR=0x0<<9;		//PB9???
	GPIOC_ODR=0x1<<14;		//PC14???
}
void C_LED_LIGHT()
{
	GPIOA_ODR=0x1<<5;		//PA5???
	GPIOB_ODR=0x1<<9;		//PB9???
	GPIOC_ODR=0x0<<14;		//PC14???	
}

int main()
{
	int j=100;
	// ????
	RCC_APB2ENR |= (1<<3); // ?? GPIOB ??
	RCC_APB2ENR |= (1<<4); // ?? GPIOC ??
	RCC_APB2ENR |= (1<<2); // ?? GPIOA ??
	
	
	// ?? GPIO ?????
	GPIOB_CRH&= 0xffffff0f;	//??? ??		
	GPIOB_CRH|=0x00000020;  //PB9????

	GPIOC_CRH &= 0x0fffffff; //??? ??		
	GPIOC_CRH|=0x02000000;  //PC14????


	GPIOA_CRL &= 0xfff0ffff; //??? ??		
	GPIOA_CRL|=0X00200000; //PA5????

	// 3?LED??????(????)
	GPIOB_ODR |= (1<<9); 
	GPIOC_ODR |= (1<<14); 
	GPIOA_ODR |= (1<<5);  
	
	while(j){
		
		B_LED_LIGHT();
		Delay_ms(1000000);

		C_LED_LIGHT();
		Delay_ms(1000000);

		A_LED_LIGHT();
		Delay_ms(1000000);
	}
	
}


void SystemInit(){
	
}

  • 添加驱动文件
    在这里插入图片描述
  • 复制到这里

在这里插入图片描述

  • 右击文件夹,选择Add Existing Files to Group Source Group 1
    在这里插入图片描述
  • 选择All FIles,选择刚刚添加的启动文件,Add,Add之后Close
    在这里插入图片描述
    5.编译并生成HEX文件
    在这里插入图片描述
    在这里插入图片描述

三、stm32cubeMX使用HAL库点亮LED流水灯

3.1.项目建立

1.创建新项目
在这里插入图片描述
2.在part name里选择自己的芯片,点击信息栏中的具体芯片信息选中,点击start project:
在这里插入图片描述
3.点击system core,进入SYS,在debug下选择serial wire:
在这里插入图片描述
4.配置时钟,进入上面的RCC,有两个时钟,一个是HSE和LSE,我们要用是GPIO接口,而这些接口都在APB2里:
在这里插入图片描述
接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上:
在这里插入图片描述
5.将hse那里设为Crystal/Ceramic Resonator:
在这里插入图片描述
6.接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA5,PB9,PC14:
在这里插入图片描述
在这里插入图片描述
7.点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM:
在这里插入图片描述
8.进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了:
在这里插入图片描述

3.2 keil仿真调试

1.打开.uvprojx文件(或者在上一步选择open project)
在这里插入图片描述
打开main.c文件,滑倒主函数那一部分:
在这里插入图片描述
2.将下面代码放入主函数中(替代里面的内容)

SystemClock_Config();//系统时钟初始化
  MX_GPIO_Init();//gpio初始化
  while (1)
  {		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4亮灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15熄灯
		HAL_Delay(1000);//延时1s		
		HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4熄灯
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15亮灯
		HAL_Delay(1000);//延时1s
	}

3.观察GPIO端口的输出波形
(1)Target界面中,选择跟正确的晶振大小,我使用的是8MHz的外部晶振。这个选项在软件仿真中起到很重要的作用,如果选择错误,那么波形一定是错误的,因为时间不准确。
在这里插入图片描述
(2)Debug页的设置:
在这里插入图片描述
(3)点击Debug,进入调试界面:
(4)选择逻辑分析仪
在这里插入图片描述
(5)选择要观察的引脚:
①点击Setup Logic Analyzer
在这里插入图片描述
②添加要观察的引脚:注:(可根据左下角Command项目栏填写)
在这里插入图片描述

(6)相关设置
在这里插入图片描述
(7)运行程序
在这里插入图片描述

(8)观察波形
在这里插入图片描述

引脚为低电平的灯亮,高电平的灯不亮,高低电平转换周期(LED闪烁周期)为1s左右。

四、实验结果展示

5.1电路连接
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9
总电路:
红——B9
绿——C15
黄——A4
在这里插入图片描述
5.2烧录运行
串口烧录要断电之后把boot0置0才能正常运行:
连接到电脑,打开mcuisp,上传HEX文件到stm32f103c8t6上:
在这里插入图片描述
5.3结果

SVID

五、STM32的USART串口通讯程序

5.1CubeMX工程设置

1.设置RCC

  • 设置高速外部时钟HSE选择外部时钟源

在这里插入图片描述
2.设置串口

  • 1点击USART1
  • 2设置MODE为异步通信(Asynchronous)
  • 3基础参数:波特率为115200Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
  • 4GPIO引脚设置USART1_RX/USART_TX
  • 5 NVIC Settings 一栏使能接收中断
    在这里插入图片描述
    3.设置时钟
    在这里插入图片描述
    4.项目文件设置
    在这里插入图片描述
    5.创建文件工程
    点击CENERATE CODE创建工程

5.2Keil操作

1.在main.c和usart.c中添加头文件#include “stdio.h”
在这里插入图片描述
在这里插入图片描述
2.在usart.c文件末尾,添加如下代码,进行重定义

/* USER CODE BEGIN 1 */

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
//#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)	
#if 1
//#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{ 	
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);  
	return ch;
}
#endif 

/* USER CODE END 1 */

3.在main.c主函数中,添加发送数据

    /* USER CODE END WHILE */
	  	printf("Hello windows!\r\n");
		HAL_Delay(500);
    /* USER CODE BEGIN 3 */

在这里插入图片描述
4.在main.c下部添加中断回调函数

/* USER CODE BEGIN 4 */
/**
 * @brief  Rx Transfer completed callbacks.
 * @param  huart pointer to a UART_HandleTypeDef structure that contains
 *                the configuration information for the specified UART module.
 * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			HAL_UART_Transmit(&huart1, (uint8_t *)&Uart1_RxBuff, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
/* USER CODE END 4 */

5.进行编译
在这里插入图片描述

5.3串口助手通信

进行通信,boot0接0
在这里插入图片描述
在这里插入图片描述
串口输出波形:
在这里插入图片描述

六、实验原理

6.1串口协议

串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。 常用的串口通信协议 有以下几种

  • 1.RS-232(ANSI/EIA-232标准) 只支持 点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远速度越慢。 支持全双工(发送同时也可接收。
  • 2.RS-422(EIA RS-422-AStandard),支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收。
  • 3.RS-485(EIA-485标准)是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时是半双工状态。

6.2 RS-232和RS-485标准

1.RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(EIA)联合贝尔系统公司、调制解调厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。

https://baike.baidu.com/item/RS-232/2022036?fr=aladdin(RE-232百度网科)

2.RS-232特点

特点特殊性
1接口的信号电平值较高,易损坏接口电路的芯片。RS232接口任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3 — -15V;逻辑“0”:+3 — +15V,噪声容限为2V。即要求接收器能识别高于+3V的信号作为逻辑“0”,低于-3V的信号作为逻辑“1”,TTL电平为5V为逻辑正,0为逻辑负。与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接
2传输速率较低,在异步传输时,比特率为20Kbps;因此在51CPLD开发板中,综合程序波特率只能采用19200,也是这个原因
3接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱
4传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右

3.RS-232性质
接口电子特性
● 逻辑为1电压范围在+3 ~ +15V,逻辑为0电压范围在-3 ~ -15V。
通讯距离长短
● RS-232传输距离有限,最大传输距离标准值为15米,且只能点对点通讯,最大传输速率最大为20kB/s。
能否支持多点通讯
● RS-232接口在总线上只允许连接1个收发器,不能支持多站收发能力。
RS-485标准
在要求通信距离为几十米到上千米时,广泛采用RS-485串行总线。RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。
● RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。
RS-485特点

特点特殊性
1RS-485的电气特性:逻辑“1”以两线间的电压差+2V—+6V表示,逻辑“0”以两线间的电压差-6V— -2V表示。接口信号电平比RS-232-C降低了,就不容易损坏接口电路芯片,且该电平与TTL电平兼容,刻方便与TTL电路连接
2传数据最高传输速率为:10Mbps
3RS-485接口采用平衡驱动器和差分接收器的组合,抗共模干扰能力强,即抗噪声性能好
4传RS-485接口的最大传输距离标准值4000英尺,实际上可达3000米
5RS-232-C接口在总线上只允许连接一个收发器,即单站能力;而RS-485接口在总线上只允许连接多达128个收发器,即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立设备网络

RS-485性质
接口电子特性
● 所采用的是差分信号(两根线)传输方式,逻辑为1时Signal两线电压差在+2 ~ +6V,逻辑为0时Signal两线电压差在-2 ~ -6V。
通讯距离长短
● RS-485最大无线传输距离为1200米。最大传输速率为10Mbps,在100Kb/S的传输速率下,才可以达到最大的通信距离。485通讯总线(必须用双绞线,或者网线的其中一组),如果用普通的电线(没有双绞)干扰将非常大,通讯不畅,甚至通讯不上。
能否支持多点通讯
● RS-485接口在总线上是允许连接多达128个收发器。即具有多站通讯能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。由于是半双工工作方式所以任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。

6.3RS232、485电平与TTL电平

在这里插入图片描述

6.4“USB/TTL转232“模块(以CH340芯片模块为例)的工作原理。

CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。
CH340工作原理图
在这里插入图片描述

七、参考资料

1.https://blog.youkuaiyun.com/qq_46467126/article/details/121055475
2.https://blog.youkuaiyun.com/qq_52199251/article/details/127335519

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值