原创 STM32----1----USART

2011-5-9 13:51 2403 2 2 分类: MCU/ 嵌入式

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日

 

 

 

 

 

 

 

 

 

 

 

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
2
关闭 站长推荐上一条 /3 下一条