文章目录

  • 一. 工作原理
  • 二,LED流水灯
  • (一),C语言寄存器方式编程实现
  • (二),HAL库方式实现
  • 三,STM32的USART串口通讯
  • (二),STM32的USART串口通讯程序
  • (三),观察输出波形
  • 四,总结
  • 五,参考链接
  • 一. 工作原理

    1. 串口协议
        串行通信协议包括系统间协议和内部系统协议。
        系统间协议:用于通信两个不同设备的系统间协议。就像计算机与微控制器套件之间的通信一样。通过内部总线系统进行通信。常见的有UART协议、USART协议、USB协议。
        内部系统协议:内部系统协议用于通信电路板上的两个设备。在使用这些系统内协议时,我们将不使用系统内协议而扩展微控制器的外围设备。使用系统内协议会增加电路复杂度和功耗。使用系统内协议,电路复杂度和功耗降低,成本降低,并且访问数据非常安全。常见的有I2C协议、SPI协议、CAN协议。
        串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。``串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

    2. RS-232
        RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。两个通讯设备的"接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

    3. RS- 485标准
        RS-485(EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个设备的能力,你可以使用一个单个RS-485口建立设备网络。出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。

    4. RS232、485电平与TTL电平的区别
        根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准。

        RS232、RS485、TTL是指电平标准(电信号);TTL电平标准 是 低电平为0,高电平为1(对地,标准数字电路逻辑);RS232电平标准 是 正电平为0,负电平为1(对地,正负6-15V皆可,甚至可以用高阻态);RS485与RS232类似,但是采用差分信号逻辑,更适合长距离、高速传输。

    5. "USB/TTL转232"模块工作原理
        ①CH340芯片模块介绍
        USB转TTL串口模块是一个非常实用的工具,可以测试模块的UART串口通信和通过单片机的UART接口给单片机等下载程序。
        能够在电脑上的串口助手软件非常直观的显示出串口设备返回的数据以及发送相应的控制数据给串口设备。
        常见的有CP2102、PL2303、FT232、CH340等串口芯片方案的USB转串口模块。以下以CH340串口模块为例,对其进行自检测试。

      ②信号转换

    CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。

      为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。

      ③对单片机的作用
      USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。

    二,LED流水灯

    (一),C语言寄存器方式编程实现

    1,创建工程
    双击打开keil,点击菜单栏Project里New μVision Project,新建项目,在弹窗中设置工程项目的名称和路径,新建名为LED的工程文件。


    2,配置环境
    选择STM32F103C8开发板,只勾选CORE


    3,生成hex文件


    4,led代码:

    
    #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()
    {
    }
    
    

    5,烧录

    (二),HAL库方式实现

      STMCubeMX创建新项目

      keil仿真调试

      将下面代码替代主函数里面的内容

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

      烧录运行

    流水灯

    三,STM32的USART串口通讯

    (二),STM32的USART串口通讯程序

    1,创建项目

    2,选择芯片

    3,配置时钟

    4,设置USART1

    5,选择HSE和PLLCLK

    6,路径
    7,打开项目
    8,编写代码

    9,烧录程序

    (三),观察输出波形

    1,运行程序,观察3个GPIO端口的输出波形

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

    2,观察串口输出波形


    四,总结

      对于路径的选择,在HAL库实现编程的时候,要注意路径不能出现中文。通过这次实验学习,了解了串口协议和RS-232、485标准,以及RS232、485电平与TTL电平的区别,以及了解了"USB/TTL转232"模块的工作原理。

    五,参考链接

    【嵌入式系统开发10】串口协议和RS-232、485标准以及RS232、485电平与TTL电平的区别,“USB/TTL转232“模块的工作原理

    基于 MDK 创建 STM32 汇编程序:串口输出 Hello wo
    rld

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32串口通信编程

    发表评论