串口揭发实验

 

一、实验代码

1.main.c

#include "stm32f10x.h"
#include "bsp/usart/bsp_usartx.h"

uint8_t Rxflag=0;
uint8_t ucTemp;

int main(void)
{  
  uint8_t ucaRxBuf[256];
    uint16_t usRxCount;
  
  /* USART 配置模式为 115200 8-N-1,中断接收 */
  USARTx_Init();
  
  Usart_SendString("这是一个串口中断接收回显实验\n");
    Usart_SendString("输入数据并以回车键结束\n");
  
    /* 简单的通信协议,遇到回车换行符认为1个命令帧 */  
    usRxCount = 0;
  
  /* 无限循环 */
  while (1)
  { 
       /** 
            * 接收COM1口的数据,分析并处理 
            * 可以将此段代码封装为一个函数,在主程序其它流程调用
          */
        if(Rxflag)
        {
            if (usRxCount < sizeof(ucaRxBuf))
            {
                ucaRxBuf[usRxCount++] = ucTemp;
            }
            else
            {
                usRxCount = 0;
            }
            
            /* 遇到换行字符,认为接收到一个命令 */
            if (ucTemp == 0x0A)    /* 换行字符 */
            {        
                Usart_SendStr_length(ucaRxBuf,usRxCount);
                usRxCount = 0;
            }
            Rxflag=0;
        }
  }
}

void USARTx_IRQHANDLER(void)
{
    if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
    {     
      Rxflag=1;        
        ucTemp = USART_ReceiveData(USARTx);
    } 
     
}

2.usartx.c

#include "bsp/usart/bsp_usartx.h"

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
     /* 嵌套向量中断控制器组选择 */  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    
   /* 配置USART为中断源 */
    NVIC_InitStructure.NVIC_IRQChannel = USARTx_IRQn;     
     /* 抢断优先级为0 */
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     /* 子优先级为1 */
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
     /* 使能中断 */
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     /* 初始化配置NVIC */
    NVIC_Init(&NVIC_InitStructure);
}

void USARTx_Init(void)
{
  /* 定义IO硬件初始化结构体变量 */
  GPIO_InitTypeDef GPIO_InitStructure;
  /* 定义USART初始化结构体变量 */
    USART_InitTypeDef USART_InitStructure;
  
  /* 配置NVIC,设定USART接收中断优先级 */
  NVIC_Configuration();
  
  /* 使能USART时钟 */
  USARTx_ClockCmd(USARTx_CLK,ENABLE);
  /* 使能USART功能GPIO时钟 */
  USARTx_GPIO_ClockCmd(USARTx_TX_CLK | USARTx_RX_CLK | RCC_APB2Periph_AFIO,ENABLE);
  
    /* 调试USART功能GPIO初始化 */
    /* 设定USART发送对应IO编号 */
    GPIO_InitStructure.GPIO_Pin =  USARTx_TX_PIN;
  /* 设定USART发送对应IO模式:复用推挽输出 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  /* 设定USART发送对应IO最大操作速度 :GPIO_Speed_50MHz */
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  /* 初始化USART发送对应IO */
    GPIO_Init(USARTx_TX_PORT, &GPIO_InitStructure);    
  
    /* 设定USART接收对应IO编号 */
    GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;
  /* 设定USART发送对应IO模式:浮空输入 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  /* 其他没有重新赋值的成员使用与串口发送相同配置 */
  /* 初始化USART接收对应IO */
    GPIO_Init(USARTx_RX_PORT, &GPIO_InitStructure);    
            
    /* USART工作环境配置 */
  /* USART波特率:115200 */
    USART_InitStructure.USART_BaudRate = USARTx_BAUDRATE;
  /* USART字长(有效位):8位 */
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  /* USART停止位:1位 */
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
  /* USART校验位:无 */
    USART_InitStructure.USART_Parity = USART_Parity_No ;
  /* USART硬件数据流控制(硬件信号控制传输停止):无 */
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    /* USART工作模式使能:允许接收和发送 */
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  /* 初始化USART */
    USART_Init(USARTx, &USART_InitStructure);
  
    /* 使能接收中断 */
  USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);    
  
  /* 使能USART */
    USART_Cmd(USARTx, ENABLE);
 /* 清除发送完成标志 */
    USART_ClearFlag(USARTx, USART_FLAG_TC|USART_FLAG_TXE|USART_FLAG_RXNE);
}

void Usart_SendByte(uint8_t ch)
{
  /* 发送一个字节数据到USART1 */
  USART_SendData(USARTx,ch);

  /* 等待发送完毕 */
  while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);    
}

void Usart_SendStr_length(uint8_t *str,uint32_t strlen)
{
  unsigned int k=0;
  do 
  {
    Usart_SendByte(*(str + k));
    k++;
  } while(k < strlen);
}

void Usart_SendString(uint8_t *str)
{
    unsigned int k=0;
  do 
  {
    Usart_SendByte(*(str + k));
    k++;
  } while(*(str + k)!='\0');
}


3、usartx.h

#ifndef __BSP_USARTX_H__
#define __BSP_USARTX_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include <stm32f10x.h>

/* 类型定义 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/
#define USARTx_BAUDRATE                        115200

#define USARTx_ClockCmd                        RCC_APB2PeriphClockCmd
#define USARTx_CLK                             RCC_APB2Periph_USART1

#define USARTx_GPIO_ClockCmd                   RCC_APB2PeriphClockCmd
    
#define USARTx_TX_PORT                         GPIOA   
#define USARTx_TX_PIN                          GPIO_Pin_9
#define USARTx_TX_CLK                          RCC_APB2Periph_GPIOA 
#define USARTx_RX_PORT                         GPIOA 
#define USARTx_RX_PIN                          GPIO_Pin_10
#define USARTx_RX_CLK                          RCC_APB2Periph_GPIOA

#define USARTx_IRQHANDLER                      USART1_IRQHandler
#define USARTx_IRQn                            USART1_IRQn
#define USARTx                                 USART1

/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void USARTx_Init(void);
void Usart_SendByte(uint8_t ch);
void Usart_SendStr_length(uint8_t *str,uint32_t strlen);
void Usart_SendString(uint8_t *str);

#endif  // __BSP_USARTX_H

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值