微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求stm32串口中断发送接收程序的详细单步调试过程

求stm32串口中断发送接收程序的详细单步调试过程

时间:10-02 整理:3721RD 点击:
如题,网上找了个,然后可以运行。但是在单步调试时,怎么也无法进入中断里面去。 串口助手,Jlink,都有。用的MDK4.12. 请高手指点

给贴一段代码,作用是可从串口调试助手接收任意多字节数据,然后将数据返回给串口调试助手。经过我实测可用。
希望对你有帮助。
/******************************************************
    文件名  :main.c
    功能    : 从串口调试助手接收到任意字节数据,然后返回给串口调试助手。
    备注    :
    串口调试命令 MODE COM4 9600,0,8,1
    ASSIGN COM4<S1IN>S1OUT
******************************************************/
#include "stm32f10x.h"
#include "Uart.h"
/*----------------------------------------------------
    函数名  :main
    功能    :主函数
    调用    :系统
    输入参数:
    输出参数:
------------------------------------------------------*/
int main(void)
{
        //串口1初始化
       InitUart1();
        while(1)
        {
           //串口数据处理
           Uart1Handle();
        }
        
}
/********************************************************
   文件名  :Uart.c
    功能    : 串口(Uart1)驱动
    备注    :
    串口调试命令 MODE COM4 9600,0,8,1
    ASSIGN COM4<S1IN>S1OUT
***********************************************************/
#include"Uart.h"
/*-------------------------------------------
                  串口缓存
                        
-------------------------------------------*/
struct Uart
{
          uint8_t  UartTemp[MAX_STACK];//缓存
          uint8_t  Count;              //数据计数
          uint32_t TimeOut;            //超时计数
          uint8_t  ReFlag;             //接收状态
}UartStack;
/*-------------------------------------------
              串口1发送单字节
                        
-------------------------------------------*/
void Uart1SendByte(uint8_t ch)
{
  USART_SendData(USART1, ch);
  while (!(USART1->SR & USART_FLAG_TXE));
}
/*-------------------------------------------
                串口1发送多字节
                        
-------------------------------------------*/
void Uart1SendMultiByte(uint8_t *pchar,uint8_t len)
{
        while(len--)
        {
           USART_SendData(USART1, *pchar++);
           while (!(USART1->SR & USART_FLAG_TXE));
        }
}

/*-------------------------------------------
              NVIC配置
                        
--------------------------------------------*/
void NVIC_Configuration1(void)
{
                NVIC_InitTypeDef NVIC_InitStructure;
                /* Configure the NVIC Preemption Priority Bits */
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
                /* Enable the USART1 Interrupt */
                NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStructure);
}
/*-------------------------------------------
         串口1初始化
                        
--------------------------------------------*/
void InitUart1(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        /* config USART2 clock */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
        
        NVIC_Configuration1();
        /* USART2 GPIO config */
   /* Configure USART1 Tx (PA.09) as alternate function push-pull */
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
            
   /* Configure USART1 Rx (PA.10) as input floating */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
         
        /* USART2 mode config */
        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_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_Cmd(USART1, ENABLE);   
}
/*-------------------------------------------
      串口1接收中断
--------------------------------------------*/
void Isr_Uart1(void)
{
        //处理接收到的数据
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {  
                   /* Clear the USART1 Receive interrupt */
                   USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                   UartStack.UartTemp[UartStack.Count++]=USART_ReceiveData(USART1);
                   if(UartStack.Count==MAX_STACK)UartStack.Count=MAX_STACK;
                   UartStack.TimeOut=0;     //超时计数清零
                   UartStack.ReFlag=1;      //处于接收状态
        }
}

/*-------------------------------------------
      串口数据处理
--------------------------------------------*/
void Uart1Handle(void)
{
           UartStack.TimeOut++;     //超时计数
            if(UartStack.TimeOut >= TIME_OUT && UartStack.ReFlag == 1 )
                {
                         Uart1SendMultiByte(UartStack.UartTemp,UartStack.Count);
                         memset(&UartStack,0,sizeof(struct Uart));
                         UartStack.TimeOut=0;     //超时计数清零
                         UartStack.ReFlag =0;     //处于空闲状态
                }
}

/**********************************************
         文件名  :Uart.h
         功能    : 串口(Uart1)驱动
         备注    :
         串口调试命令 MODE COM4 9600,0,8,1
                      ASSIGN COM4<S1IN>S1OUT
**********************************************/
#ifndef _UART2_H_
#define _UART2_H_
#include "stm32f10x.h"
#include <string.h>
#define MAX_STACK    100     //串口缓存大小
#define TIME_OUT     100     //超时
//串口1初始化
void InitUart1(void);
//串口1接收中断
void Isr_Uart1(void);
//串口数据处理
void Uart1Handle(void);
#endif

备注:需将void Isr_Uart1(void)添加到stm32f10x_it.c中。格式如下:
               
//串口1中断
void USART1_IRQHandler(void)
{
   Isr_Uart1();
}        






进来看看

很牛啊,真心羡慕你们啊!

厉害啊,向小编学习

去年的帖子了。感谢2楼的兄弟提供的思路。

大神,能把工程文件贴出来嘛?

大神贴代码

厉害啊,向小编学习

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top