STM32串口USART1程序

2019-10-23来源: eefocus关键字:STM32  串口  USART1

原理图:

 头文件及完整例程下载:http://www.51hei.com/f/stm32标准例程库函数.rar
程序分析:
main.c

#include "stm32f10x.h"

#include "stm32f10x_usart.h"

#include "misc.h"

#include "stdarg.h"

 

/* Private variables ---------------------------------------------------------*/

USART_InitTypeDef USART_InitStructure;

uint8_t TxBuffer1[] = "USART Interrupt Example: This is USART1 DEMO";  

uint8_t RxBuffer1[],rec_f,tx_flag;

__IO uint8_t TxCounter1 = 0x00;

__IO uint8_t RxCounter1 = 0x00; 

 

uint32_t Rec_Len;

 

/* Private function prototypes -----------------------------------------------*/

void RCC_Configuration(void);

void GPIO_Configuration(void);

void NVIC_Configuration(void);

 

void Delay(__IO uint32_t nCount);

void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);

char *itoa(int value, char *string, int radix);

void USART_Config(USART_TypeDef* USARTx);

 

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStruct;

USART_ClockInitTypeDef USART_ClockInitStruct;

 

/****************************************************************************

* 名    称:USART_Config(USART_TypeDef* USARTx)

* 功    能:配置串口

* 入口参数:

* 出口参数:无

* 说    明:

* 调用方法:例如: USART_Config(USART1)

****************************************************************************/

void USART_Config(USART_TypeDef* USARTx){

  USART_DeInit(USART1);

  USART_InitStructure.USART_BaudRate = 9600;//速率115200bps

  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;//收发模式

 

  /* Configure USART1 */

  USART_Init(USARTx, &USART_InitStructure);//配置串口参数函数

 

  /* Enable USART1 Receive and Transmit interrupts */

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //使能接收中断

//  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能发送缓冲空中断   

USART_ClearFlag(USART1, USART_FLAG_TC );

  /* Enable the USART1 */

  USART_Cmd(USART1, ENABLE);

}

/****************************************************************************

* 名    称:int main(void)

* 功    能:奋斗板主函数

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无 

****************************************************************************/

int main(void)

{

   uint8_t a=0;

  /* System Clocks Configuration */

  RCC_Configuration();  //系统时钟设置

       

  /*嵌套向量中断控制器配置了USART1的优先级分组为0,抢占优先级级别0(无) ,和响应优先级级别0(0-7) */ 

  NVIC_Configuration(); //中断源配置

 

  /*对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA9,PA10端口复用为串口1的TX,RX。

  在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟

  进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。*/

  GPIO_Configuration(); //端口初始化

 

  USART_Config(USART1); //串口1初始化

  

  USART_OUT(USART1,"****(C) COPYRIGHT 2013 奋斗嵌入式开发工作室 *******rn");   //向串口1发送开机字符。

  USART_OUT(USART1,"*                                                 *rn");    

  USART_OUT(USART1,"*         奋斗版STM32开发板 USART1 实验           *rn");  

  USART_OUT(USART1,"*                                                 *rn");      

  USART_OUT(USART1,"*  以HEX模式输入一串数据,以16进制0d 0a作为结束   *rn");    

  USART_OUT(USART1,"*                                                 *rn");    

  USART_OUT(USART1,"*  奋斗STM32论坛:www.ourstm.net                  *rn");   

  USART_OUT(USART1,"*                                                 *rn");     

  USART_OUT(USART1,"***************************************************rn"); 

  USART_OUT(USART1,"rn"); 

  USART_OUT(USART1,"rn");    

   while (1)

  {

if(rec_f==1){//判断是否收到一帧有效数据

rec_f=0;

USART_OUT(USART1,"rn您发送的信息为: rn");    

USART_OUT(USART1,&TxBuffer1[0]);

if(a==0) {GPIO_SetBits(GPIOB, GPIO_Pin_5); a=1;}      //LED1  V6(V3V5板) V2(MINI板) 明暗闪烁                

else {GPIO_ResetBits(GPIOB, GPIO_Pin_5);a=0;  }

}

  }

}

/****************************************************************************

* 名    称:void Delay(__IO uint32_t nCount)

* 功    能:延时函数

* 入口参数:无

* 出口参数:无

* 说    明:

* 调用方法:无 

****************************************************************************/

void Delay(__IO uint32_t nCount)

{

  for(; nCount != 0; nCount--);

}

 

/****************************************************************************

* 名    称:void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...)

* 功    能:格式化串口输出函数

* 入口参数:USARTx:  指定串口

Data:   发送数组

...:     不定参数

* 出口参数:无

* 说    明:格式化串口输出函数

         "r"回车符   USART_OUT(USART1, "abcdefgr")   

"n"换行符   USART_OUT(USART1, "abcdefgrn")

"%s"字符串   USART_OUT(USART1, "字符串是:%s","abcdefg")

"%d"十进制   USART_OUT(USART1, "a=%d",10)

* 调用方法:无 

****************************************************************************/

void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){ 

const char *s;

    int d;

    char buf[16];

    va_list ap;

    va_start(ap, Data);

 

while(*Data!=0){                //判断是否到达字符串结束符

if(*Data==0x5c){//''

switch (*++Data){

case 'r'://回车符

USART_SendData(USARTx, 0x0d);   

Data++;

break;

case 'n'://换行符

USART_SendData(USARTx, 0x0a);

Data++;

break;

default:

Data++;

     break;

}

else if(*Data=='%'){//

switch (*++Data){

case 's'://字符串

                 s = va_arg(ap, const char *);

                 for ( ; *s; s++) {

                     USART_SendData(USARTx,*s);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);

                 }

 Data++;

                 break;

case 'd'://十进制

                 d = va_arg(ap, int);

                 itoa(d, buf, 10);

                 for (s = buf; *s; s++) {

                     USART_SendData(USARTx,*s);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);

                 }

Data++;

                 break;

default:

Data++;

     break;

}

else 

USART_SendData(USARTx, *Data++);

while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);

}

}

 

/******************************************************

整形数据转字符串函数

        char *itoa(int value, char *string, int radix)

radix=10 标示是10进制非十进制,转换结果为0;  

 

    例:d=-379;

执行itoa(d, buf, 10); 后

buf="-379"     

**********************************************************/

char *itoa(int value, char *string, int radix)

{

    int     i, d;

    int     flag = 0;

    char    *ptr = string;

 

    /* This implementation only works for decimal numbers. */

    if (radix != 10)

    {

        *ptr = 0;

        return string;

    }

 

    if (!value)

    {

        *ptr++ = 0x30;

*ptr

[1] [2] [3]
关键字:STM32  串口  USART1 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic478057.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32f103串口1串口2收发程序
下一篇:错误解决:STM32F103串口1与串口3相同代码却结果不同

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32 看门狗 BKP(HAL库)
(一)概述stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1)。(二)硬件看门狗实现代码IWDG_HandleTypeDef hiwdg; // 硬件看门狗初始化static void MX_IWDG_Init(IWDG_HandleTypeDef *pHiwdg){    pHiwdg->Instance = IWDG;    pHiwdg->Init.Prescaler = IWDG_PRESCALER_4;    pHiwdg->Init.Reload = 0xFFF; // Tout
发表于 2019-11-16
STM32 HAL库学习系列第11篇---定时器TIM---看门狗基本配置及使用
基本配置使用cube配置溢出时间记住准时喂狗独立看门狗: /* IWDG 1s 超时溢出 */  MX_IWDG_Init(IWDG_PRESCALER_64,625);  /* 启动独立看门狗 */  HAL_IWDG_Start(&hiwdg);   LED1_ON;   /* while部分是我们在项目中具体需要写的代码,这部分的程序可以用独立看门狗来监控   * 如果我们知道这部           分代码的执行时间,比如是50ms,那么我们可以设置独立看门狗的 &nb
发表于 2019-11-16
STM32-自学笔记(18.独立看门狗,使用到的库函数)
为16IWDG_Prescaler_256设置IWDG预分频值为256IWDG_Prescaler_32设置IWDG预分频值为32例子:IWDG_SetPrescaler(IWDG_Prescaler_8);                //设置IWDG预分频值为82.IWDG_SetReload函数原型:void IWDG_SetReload(u16 Reload)功能:设置IWDG重装载值参数:Reload:IWDG的重装载值。取值范围0~0x0FFF例子:IWDG_SetReload(0xFFF);       
发表于 2019-11-16
HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环;或者因为用户配置代码出现BUG,导致芯片无法正常工作,出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 简单说:看门狗的本质就是定时计数器,计数器使能之后一直在累加 而喂狗就是重新写入计数器的值,时计数器重新累加,如果在一定时间内没有接收到喂狗信号(表示MCU已经挂了),便实现处理器的自动复位重启(发送复位信号)STM32的内置看门狗STM32内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗、窗口看门狗)可以用来检测和解决由软件错误
发表于 2019-11-16
HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
怎样用STM32CAN总线接口发送和接收数据
,禁止高7位都为隐性,即不能:ID=1111111XXXX。RTR,远程请求位。0,数据帧;1, 远程帧;SRR,替代远程请求位。设置为1(隐性电平);IDE,标识符选择位。0,标准标识符;1,扩展标识符;r0,r1:保留位。必须以显现电平发送,但是接收可以是隐性电平。DLC:数据长度码。0~8,表示发送/接收的数据长度(字节)。IDE,标识符选择位。0,标准标识符;1,扩展标识符;位时序分解为了实现位同步,CAN协议把每一个数据位的时序分解成SS段、PTS段、PBS1段、PBS2段,这四段的长度加起来即为一个CAN数据位的长度。分解后最小的时间单位是Tq,而一个完整的位由8~25个Tq组成。STM32中的CAN接口STM32的芯片
发表于 2019-11-16
怎样用STM32CAN总线接口发送和接收数据
stm8s_iwdg(独立看门狗)
; IWDG_Prescaler_16  = (uint8_t)0x02, /*!< Used to set prescaler register to 16 */  IWDG_Prescaler_32  = (uint8_t)0x03, /*!< Used to set prescaler register to 32 */  IWDG_Prescaler_64  = (uint8_t)0x04, /*!< Used to set prescaler register to 64 */  IWDG_Prescaler_128 = (uint8_t
发表于 2019-11-16
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved