求stm32串口中断发送接收程序的详细单步调试过程
给贴一段代码,作用是可从串口调试助手接收任意多字节数据,然后将数据返回给串口调试助手。经过我实测可用。
希望对你有帮助。
/******************************************************
文件名 :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楼的兄弟提供的思路。
大神,能把工程文件贴出来嘛?
大神贴代码
厉害啊,向小编学习