搜索
bottom↓
回复: 7

智能充电器入门教程 五: 异步串口双工通讯

[复制链接]
(344704068)

出0入0汤圆

发表于 2009-11-23 20:23:40 | 显示全部楼层 |阅读模式
(一) STM32 的 USART 模拟介绍

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。
它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。

主要特性:
   全双工的,异步通信
   NR 标准格式
   分数波特率发生器系统
        -发送和接收共用的可编程波特率,最高到4.5Mbits/s
   可编程数据字长度(8位或9位)
   可配置的停止位        -支持1或2个停止位
   LIN主发送同步断开符的能力以及LIN从检测断开符的能力
        -  当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符
   发送方为同步传输提供时钟
   IRDA SIR 编码器解码器
        -  在正常模式下支持3/16位的持续时间
   智能卡模拟功能
        -  智能卡接口支持ISO7816        -3标准里定义的异步协议智能卡
        -  智能卡用到的0.5和1.5个停止位
   单线半双工通信
   使用DMA的可配置的多缓冲器通信
        -  在保留的SRAM里利用集中式DMA缓冲接收/发送字节
   单独的发送器和接收器使能位
   检测标志
        -  接收缓冲器满
        -  发送缓冲器空
        -  传输结束标志
   校验控制
        -  发送校验位
        -  对接收数据进行校验
   四个错误检测标志
        -  溢出错误
        -  噪音错误
        -  帧错误
        -  校验错误
  10个带标志的中断源
        -  CTS改变
        -  LIN断开符检测
        -  发送数据寄存器
        -  发送完成
        -  接收数据寄存器
        -  检测到总线为空
        -  溢出错误
        -  帧错误
        -  噪音错误
        -  校验错误
   多处理器通信         -        - 如果地址不匹配,则进入静默模式
   从静默模式中唤醒(通过空闲总线检测或地址标志检测)
   两种唤醒接收器的方式
        -  地址位(MSB)
        -  空闲总线


(二) 程序编写

(1) 在 RCC_Configuration 函数中, 打开串口时钟
  /* Enable USART1, GPIOA, GPIOx and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOx
                         | RCC_APB2Periph_AFIO, ENABLE);

(2) 设置串口的 RTX, TDX IO 口的属性
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure USART1 Rx (PA.10) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  
  /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}


(3) 移植 fputc 函数
int fputc(int ch, FILE *f)
{
    /* Place your implementation of fputc here */
    /* e.g. write a character to the USART */
    USART_SendData(USART1, (u8) ch);
   
    /* Loop until the end of transmission */
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
    }
   
    return ch;
}


(4) 主函数中初始化串口设置
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    /* Configure the USART1 synchronous paramters */
    USART_ClockInit(USART1, &USART_ClockInitStructure);
   
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl =
   
    USART_HardwareFlowControl_None;
   
   
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    /* Configure USART1 basic and asynchronous paramters */
    USART_Init(USART1, &USART_InitStructure);
   
    /* Enable USART1 */
    USART_Cmd(USART1, ENABLE);


(5) 编写应用程序
    printf("\r\n Welcome to MYSTM32 Website\r\n");
    printf("\r\n http://www.mystm32.com  \r\n");
    printf("\r\n Please Input Character From Keyboard \r\n");
    while(1        )
        {        
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
        {                  
            i = USART_ReceiveData(USART1);
            printf("  %c",i&0xFF);           /* print the input char */
                                       
        }
    }


(三) 调试仿真程序

(1) 使用Keil uVision3 通过 JLINK 仿真器连接实验板,打开实验例程目录USART_TEST子目录下的USART.Uv2例程,编译链接工程;
(2) 使用智能充电器附带的串口线,连接开发板上的COM和PC机的串口;
(3) 在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序;
(4) 选择硬件调试模式,点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接目标板并下载调试代码到目标系统中;
(5) 例程正常运行之后会在超级终端显示以下信息:
"Welcome to MYSTM32 Website")
"http://www.mystm32.com"
"Please Input Character From Keyboard"
在PC机的键盘上输入的字符,将在串口调试助手上显示。


(原文件名:13.jpg)


(6) 也可选择软件调试模式,点击MDK 的Debug菜单,打开串行窗口,选择Start/Stop Debug Session
项或Ctrl+F5键,在串行窗口中也可看到与第(5)步超级终端中所显示的相同内容。


基于 MDK3.50 以上版本的工程文件下载:
点击此处下载 ourdev_506512.rar(文件大小:454K) (原文件名:Example5-USART.rar)
(344702727)

出0入0汤圆

发表于 2009-11-23 20:46:01 | 显示全部楼层
不明白,为什么键盘打什么就显示什么?怎么读到键盘的?
(344702238)

出0入0汤圆

发表于 2009-11-23 20:54:10 | 显示全部楼层
to 【1楼】 wangxiaoacc
    大学C或者C++课上肯定学过吧。编个小程序判断输入啥数据之类的。 标准的输入函数scanf, 里面直接调用键盘驱动的。所以不需要去管理键盘。 目前我觉得最好的终端工具就是procomm,当然楼主提到的那种小巧灵活,不需要安装。
(344697162)

出0入0汤圆

 楼主| 发表于 2009-11-23 22:18:46 | 显示全部楼层
楼上 bozai 正解.
(344660234)

出0入0汤圆

发表于 2009-11-24 08:34:14 | 显示全部楼层
谢谢,晚上回去试试你的例子应该就明白了。bozai的解释好像没明白我问的意思。
(344659129)

出0入0汤圆

发表于 2009-11-24 08:52:39 | 显示全部楼层
【4楼】 wangxiaoacc

那估计你说的是这个,为啥终端显示的是键盘输入的字符。 很简单2楼提到的是PC端的,PC端的软件把字符通过UART送出去,那个板子的程序再把字符送回来,于是就显示了。
(344641713)

出0入0汤圆

发表于 2009-11-24 13:42:55 | 显示全部楼层
呵呵,就是这个意思。开始我以为是接了键盘,单片机直接读键盘然后串口输出给pc。后来想明白了。呵呵,谢谢了!!
(187664699)

出0入0汤圆

发表于 2014-11-15 10:26:29 | 显示全部楼层
学了了  谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-10-26 11:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表