2938|0

6

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【零基础学习STM32】第四讲:UART通讯实验——控制LED [复制链接]

本帖最后由 kkhkbb 于 2018-3-3 10:23 编辑

一、概述
1、UART简介
       UART:(UniversalAsynchronous Receiver/Transmitter),通用同步/异步串行接收/发送器,由时钟发生器、数据发送器和接收器三大部分组成。UART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。STM32F407IGT6具有6个UART收发器,可使用相应的代码使能后使用。
2、UART特点
  • 全双工操作(相互独立的接收数据和发送数据);
  • 同步操作时,可主机时钟同步,也可从机时钟同步;
  • 支持8和9位数据位,1或2位停止位的串行数据桢结构;
  • 由硬件支持的奇偶校验位发生和检验;
  • 数据溢出检测;
  • 帧错误检测;
  • 包括错误起始位的检测噪声滤波器和数字低通滤波器;
  • 三个完全独立的中断,TX发送完成、TX发送数据寄存器空、RX接收完成;
  • 支持多机通信模式;
  • 支持倍速异步通信模式。
3、UART时序

                        图4_0 UART时序

  空闲位:高电平。
  启动位:一个低电平。
  字符数据:可以选择8和9位数据位。
  奇偶校验位:根据需要选择是否进行校验。
  停止位:一个高电平。
4、TTL、RS232、RS485、RS422通信
    TTL、RS232、RS485都是指电平信号,USART可使用相应的电平转换芯片,实现这三种通信。
  • TTL:电平信号数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。通讯方式为全双工通信。
  • RS232:232中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3到-15V;逻辑“0”为+3到+15V。通讯方式为全双工,通讯距离15m,RS-232的数据最高传输速率为20Kbps。
  • RS485:RS485采用差分信号负逻辑,逻辑"1”以两线间的电压差为-(2~6)V表示;逻辑"0"以两线间的电压差为+(2~6)V表示。通讯方式为半双工,通讯距离1200m,
  • RS-485的数据最高传输速率为10Mbps。RS422:RS422采用两对差分线传输数据,电平与RS485相同。通讯方式为全双工,通讯距离1200m,RS-422的数据最高传输速率为10Mbps。
二、硬件电路

                          图4_1 UART引脚图



                图4_2 UART转USB

   本试验使用的芯片STM32F407IGT6,使用UART为UART_4,引脚位PA0和PA1,经过串口转USB芯片CH340转换后,可通过USB接口与计算机通讯。
三、实验原理
   计算机安装 CH340 驱动后,可通过串口工具来接收串口发送的数据和向串口发送给数据。用串口工具打开iCore3对应的端口,波特率设为115200,发送相应的命令,便可以控制ARM LED的亮灭情况。串口命令如下表:
   
表:4_1 串口控制命令
LED_RED_ON\cr\lf
LED 红灯亮
LED_RED_OFF\cr\lf
LED 红灯灭
LED_BLUE_ON\cr\lf
LED 蓝灯亮
LED_BLUE_OFF\cr\lf
LED 蓝灯灭
LED_GREEN_ON\cr\lf
LED 绿灯亮
  LED_GREEN_OFF\cr\lf
LED 绿灯灭

                 图:4_3 控制实例
四、源代码
1.USART初始化结构体介绍

typedef struct
{
  uint32_t USART_BaudRate;           
  uint16_t USART_WordLength;         
  uint16_t USART_StopBits;                                                      
  uint16_t USART_Parity;                                                                                                
  uint16_t USART_Mode;               
  uint16_t USART_HardwareFlowControl;                                       
} USART_InitTypeDef;

  • 波特率:每秒传输的二进制位个数。
  • 数据长度:可选择8位,9位。
  • 停止位:可选择0.5位、1位、1.5位和2位。
  • 校验位:可选择无校验、奇校验、偶检验。
  • USART模式:可选择接收模式、发送模式、收发模式。
2.主函数
* Name                            : main  
* Description                : ---   
* Author                       : ysloveivy.  
*   
* History   
* --------------------   
* Rev                                : 0.00   
* Date                               : 11/21/2015   
*   
* create.   
* --------------------   
*/   
int main(void)   
{
        int i;
        char buffer[20];
        led.initialize();
        usart4.initialize(9600);
        usart4.printf("hello! I am iCore3!\r\n");                             
//串口4输出
        while(1){
                if(usart4.receive_ok_flag){                                       
   //接收完成
                       usart4.receive_ok_flag    = 0;
                       for(i = 0;i < 20;i++){
                               buffer    =
tolower(usart4.receive_buffer);
                       }
                       //比较接收信息
                      if(memcmp(buffer,"led_red_on",strlen("led_red_on")) == 0){
                               LED_RED_ON;
                               usart4.printf("ok!\r\n");
                       }
   
                       if(memcmp(buffer,"led_red_off",strlen("led_red_off")) == 0){
                               LED_RED_OFF;
                               usart4.printf("ok!\r\n");
                       }
   
                       if(memcmp(buffer,"led_green_on",strlen("led_green_on")) == 0){
                               LED_GREEN_ON;
                               usart4.printf("ok!\r\n");
                       }
   
                       if(memcmp(buffer,"led_green_off",strlen("led_green_off")) == 0){
                               LED_GREEN_OFF;
                               usart4.printf("ok!\r\n");
                       }
   
                       if(memcmp(buffer,"led_blue_on",strlen("led_blue_on")) == 0){
                               LED_BLUE_ON;
                               usart4.printf("ok!\r\n");
                       }
   
                       if(memcmp(buffer,"led_blue_off",strlen("led_blue_off")) == 0){
                               LED_BLUE_OFF;
                               usart4.printf("ok!\r\n");
                       }
               }   
        }  
}
五、实验现象
   通过串口调试工具输入相应的命令,可以看到iCore3执行相应的明命令,LED按控制命令亮灭。
六、代码包下载








此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表