新手求助大侠:STM32 USART1 能发送但进不了接收中断
时间:10-02
整理:3721RD
点击:
新手求助大侠:STM32 USART1 能发出数据但进不了接收中断
调试接收中断中,因无法通过才加上查询接收和发送完成中断发现:发送完成中断可以响应,
但接收无论是中断方式还是查询方式都接收不到数据
#include "stm32f10x.h"
#include <stm32f10x_gpio.h>
#include "stm32f10x_it.h"
//#include <stdarg.h>
#include <stdio.h>
/** void USART1_Init(unsigned int baut)
* @ 函 数 void GPIOx_Init(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void USARTx_Config(unsigned int baut)
{
//波特率
USART1->BRR =(int)72000000/baut; //
//控制寄存器
USART1->CR1=0x0000202c; //USART使能UE、接收中断使能RXNEIE、8位数据位、无校验,
USART1->CR2=0x00000000; //停止位为00(1位)、
USART1->CR3=0x00000000;
}
/**
* @ 函 数 void GPIOx_Init(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void GPIOx_Config(void)//调用库
{
GPIO_InitTypeDef GPIO_InitStructure ;
//GPIOA_Pin_9配置为输出
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);
//GPIOA_Pin_10配置为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @ 函 数 void VNIC_CONFIG(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void VNIC_Config(void) //嵌套中断初始化
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = 37;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @ 函 数 void init_all_periph(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void all_periph_Config(void) //
{
SystemInit(); //
//GPIOA、USART1、AFIO时钟开启
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);
GPIOx_Config();
USARTx_Config(9600);
VNIC_Config();
}
int main()
{
unsigned char USA_DAT;
all_periph_Config();
USART1->DR = 'Q';
while(1)
{
//调试中加上查询接收
if(USART1->SR&0x20) //查询是否接受到数据
{
USA_DAT=USART1->DR;
while(!(USART1->SR&0x40)); //上次数据未发完
USART1->DR=USA_DAT;
}
}
}
void USART1_IRQHandler(void) //串口中断处理程序
{
unsigned long flag=0;
if(USART1->SR&0x00000020)
{
while(USART1->SR&0x00000020) //RXNE为1已接收
{
USART1->CR1&=0xffffffdf; //关闭接收使能
flag=USART1->DR&0xff; //读出
USART1->DR=flag&0xff; //送入发送寄存器
while((USART1->SR)&0x80==0); //等待数据移出
while((USART1->SR)&0x40==0); //确认发送完成
flag=USART1->SR;
}
USART1->CR1|=0x00000020; //开启接收使能
}
//发送完成中断,调试中加上
// if(USART1->SR&0x00000040)
// {
// USART1->DR='7'; //送入发送寄存器
// while((USART1->SR)&0x80==0); //等待数据移出
// while((USART1->SR)&0x40==0); //确认发送完成
// }
}
调试接收中断中,因无法通过才加上查询接收和发送完成中断发现:发送完成中断可以响应,
但接收无论是中断方式还是查询方式都接收不到数据
#include "stm32f10x.h"
#include <stm32f10x_gpio.h>
#include "stm32f10x_it.h"
//#include <stdarg.h>
#include <stdio.h>
/** void USART1_Init(unsigned int baut)
* @ 函 数 void GPIOx_Init(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void USARTx_Config(unsigned int baut)
{
//波特率
USART1->BRR =(int)72000000/baut; //
//控制寄存器
USART1->CR1=0x0000202c; //USART使能UE、接收中断使能RXNEIE、8位数据位、无校验,
USART1->CR2=0x00000000; //停止位为00(1位)、
USART1->CR3=0x00000000;
}
/**
* @ 函 数 void GPIOx_Init(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void GPIOx_Config(void)//调用库
{
GPIO_InitTypeDef GPIO_InitStructure ;
//GPIOA_Pin_9配置为输出
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);
//GPIOA_Pin_10配置为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**
* @ 函 数 void VNIC_CONFIG(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void VNIC_Config(void) //嵌套中断初始化
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = 37;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @ 函 数 void init_all_periph(void)
* @ 功 能 GPIO configue
* @ 说 明:
* 入口参数:
* 返回参数:
-----------------------------------------------------------------------
*/
void all_periph_Config(void) //
{
SystemInit(); //
//GPIOA、USART1、AFIO时钟开启
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);
GPIOx_Config();
USARTx_Config(9600);
VNIC_Config();
}
int main()
{
unsigned char USA_DAT;
all_periph_Config();
USART1->DR = 'Q';
while(1)
{
//调试中加上查询接收
if(USART1->SR&0x20) //查询是否接受到数据
{
USA_DAT=USART1->DR;
while(!(USART1->SR&0x40)); //上次数据未发完
USART1->DR=USA_DAT;
}
}
}
void USART1_IRQHandler(void) //串口中断处理程序
{
unsigned long flag=0;
if(USART1->SR&0x00000020)
{
while(USART1->SR&0x00000020) //RXNE为1已接收
{
USART1->CR1&=0xffffffdf; //关闭接收使能
flag=USART1->DR&0xff; //读出
USART1->DR=flag&0xff; //送入发送寄存器
while((USART1->SR)&0x80==0); //等待数据移出
while((USART1->SR)&0x40==0); //确认发送完成
flag=USART1->SR;
}
USART1->CR1|=0x00000020; //开启接收使能
}
//发送完成中断,调试中加上
// if(USART1->SR&0x00000040)
// {
// USART1->DR='7'; //送入发送寄存器
// while((USART1->SR)&0x80==0); //等待数据移出
// while((USART1->SR)&0x40==0); //确认发送完成
// }
}
已排除线路问题