(一) 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(“rn 欢迎来到麦思网论坛 rn”); printf(“rn http://www.mystm32.com rn”); printf(“rn Please Input Character From Keyboard rn”); 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 通过ULINK 2仿真器连接实验板,打开实验例程目录USART_TEST子目录下的USART.Uv2例程,编译链接工程; (2) 使用MINI-STM32开发板附带的串口线,连接开发板上的COM和PC机的串口; (3) 在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序; (4) 选择硬件调试模式,点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接目标板并下载调试代码到目标系统中; (5) 例程正常运行之后会在超级终端显示以下信息: ” 欢迎来到麦思网论坛” “http://www.mystm32.com” “Please Input Character From Keyboard” 在PC机的键盘上输入的字符,将在超级终端上显示。
(6) 也可选择
软件
调试模式,点击MDK 的Debug菜单,打开串行窗口,选择Start/Stop Debug Session
项或Ctrl+F5键,在串行窗口中也可看到与第(5)步超级终端中所显示的相同内容。