stm32串口通信入门

了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

串口协议通常指的是通过串行通信进行数据传输的协议。其中,RS-232是一种常见的串口通信标准,定义了数据通信的物理层和部分数据链路层规范。RS-232标准定义了信号线的功能、电气特性以及数据传输的控制方式。该标准在早期的计算机和外设中广泛使用,但随着技术的发展,逐渐被更先进的通信标准所取代。

RS-232标准通常使用DB-9或DB-25连接器,并定义了以下信号线:

  1. TXD (Transmit Data):发送数据线,用于从发送方向接收数据。
  2. RXD (Receive Data):接收数据线,用于接收数据。
  3. RTS (Request To Send):请求发送线,用于请求发送数据。
  4. CTS (Clear To Send):清除发送线,用于确认接收方准备好接收数据。
  5. DTR (Data Terminal Ready):数据终端就绪线,表示设备准备好接收或发送数据。
  6. DSR (Data Set Ready):数据集就绪线,表示远程设备准备好接收或发送数据。
  7. DCD (Data Carrier Detect):数据载波检测线,用于指示数据通信连接状态。
  8. RI (Ring Indicator):来电指示线,用于指示电话线路上是否有来电信号。

RS-232标准使用负逻辑电平表示逻辑状态,即逻辑0为高电平(通常约+3至+15V),逻辑1为低电平(通常约-3至-15V)。

TTL(Transistor-Transistor Logic)电平则是一种常见的数字电平标准,适用于逻辑电路。TTL电平中,逻辑0通常被定义为低电平(约0至0.8V),逻辑1被定义为高电平(约2至5V)。

USB/TTL转RS-232模块(以CH340芯片模块为例)的工作原理如下:

  1. USB接口:模块通过USB接口与主机连接,用于供电和数据通信。
  2. USB转UART芯片(例如CH340):该芯片负责将USB接口的数据转换为UART格式的串口数据,并反之亦然。它通常还包括USB转串口的驱动程序,以便计算机能够识别串口设备。
  3. RS-232电平转换芯片:一些模块可能会包含RS-232电平转换芯片,用于将TTL电平的串口信号转换为RS-232电平信号,以便与RS-232设备通信。这些芯片通常会将TTL的逻辑1转换为正电压(例如+12V),逻辑0转换为负电压(例如-12V),以符合RS-232标准。
  4. 串口连接器:模块上可能还会包含DB-9或其他类型的串口连接器,用于连接到RS-232设备或电路。

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

创建一个led.c文件

#include "stm32f10x.h"                  // Device header
#include "LED.h"
​
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO_InitTypeDef类型的结构体变量
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择PA所以引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚输出模式位推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速度为50MHz
    GPIO_Init(GPIOA,&GPIO_InitStructure);//调用初始化库函数初始化GPIOB端口
}
​
创建一个LED.h文件,代码如下:

#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"                  // Device header
​
void LED_Init(void);
​
#endif

创建一个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
​
创建一个main.c文件,代码如下:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
int main(void)
{   
    LED_Init();
    while(1)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_0);
        Delay_ms(1000);
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
        Delay_ms(1000);
    }
}

创建一个main.c文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
int main(void)
{   
    LED_Init();
    while(1)
    {
        GPIO_SetBits(GPIOA,GPIO_Pin_0);
        Delay_ms(1000);
        GPIO_ResetBits(GPIOA,GPIO_Pin_0);
        Delay_ms(1000);
    }
}

在stm32标准库中复制相应的文件到对应的位置下
再在keil中进行相关调试如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再进行烧录设置
结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值