2011年4月17日 STM32F103 串口USART全功能配置函数
随着程序的代码的增加,调试程序变的越来越困难,通过STM32的串口调试程序不失为一种解决问题的方法。其实串口和PC的通信中,串口主动的向PC发送数据使用的数据较多,PC主动向STM32发送的数据较少。本串口的USART函数借鉴ZN51的串口的配置思路,利用MDK2.0库在STM32中进行了实现。
1、Usart.h
#ifndef __UART_H__
#define __UART_H__
#define uchar unsigned char
#define uint unsigned short
#define ulong unsigned long
//UART 外部相关函数------------------------
void USART_Configuration(void);
void USART_Send_Byte(uchar mydata);
void USART_Send_Str(char *s);
void USART_Send_Enter(void);
void USART_Output_Num(ulong dat);
void USART_Output_Information(char *inf,ulong dat);
//UART-------------------------------------
#endif
这里是USART的头文件,包含了USART操作的所有函数,这些函数包括USART的配置初始化、发送字节、发送字符串、发送回车、发送位长数据、发送调试信息等
2、usart.c文件
#include "usart.h"
#include "stm32f10x_lib.h"
#include "string.h "
#include "myfun.h"
/***************************************************************************
- 功能描述:STM32f103串口的初始化
- 隶属模块:STM32串口操作
- 函数属性:外部,使用户使用
- 参数说明:无
- 返回说明:无
- 串口配置步骤:
(1)首先建立结构体变量,再配置的参数(波特率、字长、停止位、奇偶校验位、接收和发送)
用参数初始化串口1,最后使能该串口。
(2)配置串口操作所需的IO口,其中GPIO_TX为发送端配置为复用推挽输出
其中GPIO_RX配置为输入浮空
(3)对于USART1,PA9为GPIO_TX发送端,PA10为GPIO_RX接收端
*************************************************************************/
void USART_Configuration()
{
//定义串口和GPIO的结构体变量
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitStructure.USART_BaudRate =38400;
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(USART1, &USART_InitStructure);
USART_Cmd(USART1 , ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
//USART1在没有重映像的条件下,PA9为USART1_TX发送端
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA , &GPIO_InitStructure);
//USART1在没有重映像的条件下,PA10为USART1_RX接收端
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/***************************************************************************
- 功能描述:STM32f103串口的发送字节函数
- 隶属模块:STM32串口操作
- 函数属性:外部,使用户使用
- 参数说明:mydata待发送的数据
- 返回说明:无
- 函数实现步骤:
(1)清除串口的发送完成标志位
(2)利用库函数 USART_SendData发送数据mydata
(3)等待发送完成标志位置位,置位以后再清除标志
***************************************************************************/
void USART_Send_Byte(uchar mydata)
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1, mydata);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_ClearFlag(USART1,USART_FLAG_TC);
}
/***************************************************************************
- 功能描述:STM32f103串口的发送字符串函数
- 隶属模块:STM32串口操作
- 函数属性:外部,使用户使用
- 参数说明:*s待发送的字符串
- 返回说明:无
***************************************************************************/
void USART_Send_Str(char *s)
{
int len=strlen(s)-1;
int i;
for(i=0;i<len;i++)
USART_Send_Byte(s);
if(s=='\n')
{
USART_Send_Enter();
}
else
{
USART_Send_Byte(s);
}
}
/***************************************************************************
- 功能描述:STM32f103串口的发送会成回车换行函数
- 隶属模块:STM32串口操作
- 函数属性:外部,使用户使用
- 参数说明:*s待发送的字符串
- 返回说明:无
- 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果
***************************************************************************/
void USART_Send_Enter(void)
{
USART_Send_Byte(0x0d);
USART_Send_Byte(0x0a);
}
/**************************************************************************
- 功能描述:STM32f103的串口发送数值
- 隶属模块:STM32串口操作
- 函数属性:外部,使用户使用
- 参数说明:dat:要发送的数值
- 返回说明:无
- 注:函数中会将数值转为相应的字符串,发送出去。比如 4567 转为 "4567"
(1)ulong为4字节32位表示的最大数字为4294967296,所以用长度20的字符串数组可以装下
**************************************************************************/
void USART_Output_Num(ulong dat)
{
char temp[20];
u32tostr(dat,temp);
USART_Send_Str(temp);
}
/**************************************************************************
- 功能描述:STM32f103的串口发送调试信息
- 隶属模块:STM32串口操作
- 函数属性:外部,使用户使用
- 参数说明:inf:指向提示信息字符串的指针
dat:一个数值,前面的提示信息就是在说明这个数值的意义
- 返回说明:无
**************************************************************************/
void USART_Output_Information(char *inf,unsigned long dat)
{
USART_Send_Str(inf);
USART_Output_Num(dat);
USART_Send_Str("\n");
}
以上函数中void USART_Configuration()最为重要,只有这个函数的配置正确,其他函数才能书写工作。至于如何配置USART_Configuration,步骤如下:
串口配置步骤:
(1)首先建立结构体变量,再配置的参数(波特率、字长、停止位、奇偶校验位、接收和发送)
用参数初始化串口1,最后使能该串口。
(2)配置串口操作所需的IO口,其中GPIO_TX为发送端配置为复用推挽输出,其中GPIO_RX配置为输入浮空
(3)对于USART1,PA9为GPIO_TX发送端,PA10为GPIO_RX接收端。
3、有了以上的配置就在main函数中书写主函数
(1)配置好UASRT1的时钟它在APB2总线上。
(2)具体如下:
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
USART_Send_Str("串口初始化成功:\r\n");
LED_Init() ;
USART_Send_Str("LED初始化成功:\r\n");
delay_init(72);
USART_Send_Str("系统精确延时函数初始化成功:\r\n");
USART_Output_Information("欢迎进入STM32F",103);
USART_Send_Enter();
while (1)
{
LED0_On();
delay_ms(500);
USART_Send_Str("LED0亮,PA8为低电平:\r\n");
LED0_Off();
delay_ms(500);
USART_Send_Str("LED0灭,PA8为高电平:\r\n");
}
}
其中LED0由PA8控制,PD2由PD2控制。
编译运行完成后,在串口助手中或超级终端中就可以看到:如下的信息:
这样我们就可以利用串口助手,来调控程序,知道程序的流程。从而调试程序。STM32串口的学习就到此为止。当然当PC向STM32发送数据时,直接用USART_ReceiveData函数即可,若要接受大量的数据,做成一个数组buff即可。当然这个过程在中断中实现比较好。由于STM32接受信息在调试程序中用到的不多,所以这方面的程序就没有给出。
2011年4月17日
文章评论(0条评论)
登录后参与讨论