stm32之串口
[| 2011/12/02 00:53]
在最基本的GPIO使用熟练后,开始下一步:调试。
磨刀不误砍柴功。如果要写比较复杂的程序,调试是必需品。虽然jlink可以断点调试,但是效率低、查看变量值麻烦。程序比较大的时候相当复杂。对于普通程序,可以用日志的方式来进行调试,将日志打印到标准输出或者是文件,然后进行调试。在单片机开发中,可以通过串口通讯来完成这个事情,单片机将日志通过串口输出到开发机上,在开发机端使用串口工具进行查看。
首先是串口的概念,在网上搜索资料相当恼火,大部分都是直接就说串口怎么怎么用,如何如何好,要么就是直接大段代码。很蛋疼的是,到底啥是串口?单片机上哪个引脚是串口?
首先明确串口的概念,pc端串口分为25针和9针两种,9针为简化版,在台式机上一般都有,笔记本上已经绝迹了。
对于单片机来说,如果要串口通讯,最简单的方式其实是两根线:rx,tx。
一般要问了,为啥两根线就能干的活要9根甚至25根线呢?原来两根线只是最基本的串口通讯需要的。如果需要硬件流控等功能,还需要其他引脚的帮助。在这里简单起见,先使用最简单的。
由于笔记本没有串口,手头有两块usb转串口板,一块是pl2303的,非常便宜,10块钱。但功能也最简单,只有4根线,rx,tx,vcc,gnd,兼容性一般,需要安装驱动才能使用。还有一块基于ft232的,将近50块,功能也比较强大,支持9针插头,兼容性好,插上后可使用windows update自动搜索驱动并安装。
这次选用了p2303。
下一步,就是怎么连接的问题,板上密密麻麻近百个引脚,应该如何连接呢?这时需要查询datasheet。
stm32f103ze有5个串口通道。usart1最快。在这里我准备先拿2试试。datasheet上显示a2为tx,a3为rx。很快将线插好。vcc和gnd也接上。现在电路连通了(注意,插拔串口的时候需要断电操作,否则容易损坏串口)
然后就是编程。至于程序网络上就大把了。随便找个文档就是大堆。挑个有注释的看。大致流程如下:(最简单的,不带中断)
首先启用usart时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
然后是初始化gpio引脚:a3设置为GPIO_Mode_IN_FLOATING,a2设置为GPIO_Mode_AF_PP
然后是串口设置:
波特率9600,字长8,停止位1,不校验,硬件流控无,开启信息收发,启用串口。
然后就可以用USART_SendData发送数据了。
需要注意的地方:不要忘记开启时钟,这里要两次时钟操作,一次给串口,一次给io口,缺一不可。
磨刀不误砍柴功。如果要写比较复杂的程序,调试是必需品。虽然jlink可以断点调试,但是效率低、查看变量值麻烦。程序比较大的时候相当复杂。对于普通程序,可以用日志的方式来进行调试,将日志打印到标准输出或者是文件,然后进行调试。在单片机开发中,可以通过串口通讯来完成这个事情,单片机将日志通过串口输出到开发机上,在开发机端使用串口工具进行查看。
首先是串口的概念,在网上搜索资料相当恼火,大部分都是直接就说串口怎么怎么用,如何如何好,要么就是直接大段代码。很蛋疼的是,到底啥是串口?单片机上哪个引脚是串口?
首先明确串口的概念,pc端串口分为25针和9针两种,9针为简化版,在台式机上一般都有,笔记本上已经绝迹了。
对于单片机来说,如果要串口通讯,最简单的方式其实是两根线:rx,tx。
一般要问了,为啥两根线就能干的活要9根甚至25根线呢?原来两根线只是最基本的串口通讯需要的。如果需要硬件流控等功能,还需要其他引脚的帮助。在这里简单起见,先使用最简单的。
由于笔记本没有串口,手头有两块usb转串口板,一块是pl2303的,非常便宜,10块钱。但功能也最简单,只有4根线,rx,tx,vcc,gnd,兼容性一般,需要安装驱动才能使用。还有一块基于ft232的,将近50块,功能也比较强大,支持9针插头,兼容性好,插上后可使用windows update自动搜索驱动并安装。
这次选用了p2303。
下一步,就是怎么连接的问题,板上密密麻麻近百个引脚,应该如何连接呢?这时需要查询datasheet。
stm32f103ze有5个串口通道。usart1最快。在这里我准备先拿2试试。datasheet上显示a2为tx,a3为rx。很快将线插好。vcc和gnd也接上。现在电路连通了(注意,插拔串口的时候需要断电操作,否则容易损坏串口)
然后就是编程。至于程序网络上就大把了。随便找个文档就是大堆。挑个有注释的看。大致流程如下:(最简单的,不带中断)
首先启用usart时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
然后是初始化gpio引脚:a3设置为GPIO_Mode_IN_FLOATING,a2设置为GPIO_Mode_AF_PP
然后是串口设置:
引用
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
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_Tx | USART_Mode_Rx;
USART_Init(USART2 , &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
USART_InitStructure.USART_BaudRate = 9600;
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_Tx | USART_Mode_Rx;
USART_Init(USART2 , &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
波特率9600,字长8,停止位1,不校验,硬件流控无,开启信息收发,启用串口。
然后就可以用USART_SendData发送数据了。
需要注意的地方:不要忘记开启时钟,这里要两次时钟操作,一次给串口,一次给io口,缺一不可。