第六节 串口学习之串口输出
本章主要讲了两个个方面的知识点
1、串口配置
2、printf函数的重定义及使用
详细内容请见附件:
pdf版学习笔记
6科星F107开发板学习笔记—串口学习之串口输出.pdf
(532.7 KB)
源码工程文件
6科星F107开发板学习笔记源码—串口学习之串口输出.rar
(2.71 MB)
视频教程下载链接
http://pan.baidu.com/share/link?shareid=1629117830&uk=2886683799
部分内容如下
串口可以把很多单片机内的信息打印到电脑上,便于我们代码的调试与编写,我们这里来学习一下串口的打印输出。 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。 串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。 UART(UniversalAsynchronous Receiver/Transmitter)是异步串行,通用异步接收/发送。UART是一个并行输入成为串行输出的芯片。UART包含TTL电平的串口和RS232电平的串口。 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。 RS-232采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。 下面来看科星F107开发板的串口的原理图: 引脚PA9和PA10是通过排针从核心板引到底板,然后经过RS232芯片输出串口数据。 跳线:短接图示的引脚 如下图: 科星F107开发板发货时这些短路帽是默认接好的。 代码是根据库里面带的实例工程修改的,使用了c语言中printf函数的重定义,以便能支持STM32f107的环境。 下面我们进行源代码的编写: 首先我们打开,第二节中新建的空工程,没有的朋友可以在下面的链接中找到: 下面我们打开这个工程, 第一步,由于我们这里要使用到库文件中串口配置的函数,这里需要添加外设库文件stm32f10x_usart.c,该文件的路径为“\Libraries\STM32F10x_StdPeriph_Driver\src”,添加完成后,如下图 第二步,右击工程文件名,打开“Options”,找到“GerenalOptions”中的“Library Configuration”,在Library选项选择“Full”,后面的描述也写的很清楚了,然后就可以调用,C语言的printf函数了。如下图: 第三步,添加C语言标准输入输出的头文件#include <stdio.h> 串口的配置使用跟GPIO口的配置使用差不多,也是使用库提供的结构体,来定义串口的波特率,校验方式,数据位等参数,完整的代码如下,请直接复制到工程中main.c文件中就可以了,代码如下: /* Includes------------------------------------------------------------------*/ #include "stm32f10x.h" #include <stdio.h> USART_InitTypeDef USART_InitStructure; void GPIO_Configuration(void); #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LDLinker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ int main(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO,ENABLE); GPIO_Configuration(); USART_InitStructure.USART_BaudRate= 115200; //波特率115200 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位 8 USART_InitStructure.USART_StopBits= USART_StopBits_1; //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; USART_Init(USART1,&USART_InitStructure); USART_Cmd(USART1, ENABLE); printf("\n\r"); printf("\n\r CORX F107 开发板 USART Study \n\r"); printf("\n\r stm家园 \n\r"); printf("\n\r QQ交流群 144728423 \n\r"); printf("\n\r"); while (1) { } } void GPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /* Configure USARTx_Tx asalternate function push-pull */ GPIO_InitStructure.GPIO_Pin =GPIO_Pin_9; //前面涉及到了,Tx是PA9 GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStructure); /* Configure USARTx_Rx as inputfloating */ GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; //前面涉及到了,Rx是PA10 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure); } PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } 蓝色字体部分的代码就是对printf函数进行重定义,作用就是把c语言中的printf函数移植到了IAR编译stm32f107的MCU的环境中,类似高级语言的“重载”。 然后Make,之后将程序下载到开发板上,连接(USB转)串口线,然后安装USB转串口驱动,驱动下载链接如下: 安装好后,打开串口调试助手,没有的朋友可以在以下链接下载: 打开串口调试助手,配置如下图: 程序代码是每次复位,输出一串字符串,按一次开发板的复位键,串口调试助手就会打印出我们程序中要打印的信息,如下图所示: 这里配置的波特率,数据位,停止位,校验位和流控制都是由代码中决定的,如下图 小贴士: 如果不知道如何选择串口号的话,打开电脑的设备管理器,如下图: 我这里显示的是com1,有些朋友电脑可能显示的是com7或者com15啊比较大的值,但是所用的串口调试助手的com口的选择没有那么多,怎么办呢?修改串口号,其实这个com端口号都是可以自己修改的,修改的方式如下: 右击这个设备,点击属性,如下图: 然后点击 “端口设置”,点“高级”,就可以“COM端口号”的选择框了,然后就可以选择没有被占用的COM端口号了,如下图: 好的,串口输出部分的学习就到这里了。 这里咱们主要讲了printf函数的使用。
|