打印
[STM32F1]

USART串口中断问题

[复制链接]
1063|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pengf|  楼主 | 2021-10-9 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USART串口中断插着RX线说啥也不进,一拔下来就进去了
下面是
中断函数
void USART1_IRQHandler()
{
printf("successful!!!!\n");
Delay_Ms(1000);
}
中断配置
void Init_NVIC(void)
{   
     NVIC_InitTypeDef NVIC_InitStructure;
     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);      
}
USART配置void Init_Usart(void)
{   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE); //使能各个端口时钟,重要!!!

    GPIO_InitTypeDef GPIO_InitStructure;     //定义一个GPIO结构体变量
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入(复位状态);         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    GPIO_Init(GPIOA, &GPIO_InitStructure);        //根据参数初始 PIOA寄存器   
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //配置端口速度50M
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用功能输出开漏
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     //配置串口接收端口挂接到9端口TX               
     GPIO_Init(GPIOA, &GPIO_InitStructure);        //根据参数初始化GPIOA寄存器   
}   

void Usart_Configuration(uint32_t BaudRate)
{
USART_InitTypeDef USART_InitStructure;            //定义一个串口结构体
USART_InitStructure.USART_BaudRate            =BaudRate ;      //波特率115200
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; //接收和发送模式
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);   
USART_Init(USART1, &USART_InitStructure);        //根据参数初始化串口寄存器
USART_Cmd(USART1, ENABLE);                //使能串口外设
}

main函数():
int main(void)
{
SystemInit();
Init_Usart();
Usart_Configuration(115200);
Init_NVIC();
Init_LED();
while(1);
while(1)//只要插着RX就始终在这个循环里,一拔下来就跳到中断里
{
  LED1=~LED1;
  Delay_Ms(200);
}   
}
求大神指教,实在不知道哪里出了问题!!

使用特权

评论回复
沙发
zhuhuis| | 2021-10-9 21:48 | 只看该作者
中断服务函数里要检查一下读数据寄存器非空位是否被置位

使用特权

评论回复
板凳
spark周| | 2021-10-9 21:50 | 只看该作者
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET),如果被置位则说明接收寄存器中有数据需要读取,读取数据后该位自动清零(USART_ReceiveData(USART1)),你的程序里好像没有读数据功能,所以该位一直为高。不读数据也行,用上面的If后用USART_ClearITPendingBit(USART1, USART_IT_RXNE);清除中断标志位,当再用串口发数据时才会中断

使用特权

评论回复
地板
zhanghqi| | 2021-10-9 21:52 | 只看该作者
这个中断主要依靠接受完成位置一,置1又需要接受到8位数据加一位停止位,顺这个路一个一个排除咯

使用特权

评论回复
5
bqyj| | 2021-10-9 21:55 | 只看该作者

中断服务函数里应该加上判断USART_IT_RXNE标志位,
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {         
           printf("successful!!!!\n");
        }

使用特权

评论回复
6
pengf|  楼主 | 2021-10-9 21:57 | 只看该作者
说明是硬件的文件吧。

使用特权

评论回复
7
wenfen| | 2021-10-9 22:00 | 只看该作者
使用上拉电阻呢?

使用特权

评论回复
8
renyaq| | 2021-10-9 22:02 | 只看该作者
以前遇到过,就是IO配置的问题

使用特权

评论回复
9
午夜粪车| | 2021-10-9 22:04 | 只看该作者
检查一下你的硬件是不是有问题

使用特权

评论回复
10
tian111| | 2021-10-9 22:06 | 只看该作者
是不是断路了?

使用特权

评论回复
11
happy_10| | 2021-10-9 22:08 | 只看该作者
这个不好判断是不是硬件的问题

使用特权

评论回复
12
llljh| | 2021-10-9 22:15 | 只看该作者
你的RX接线是哪端呢

使用特权

评论回复
13
ousj| | 2021-10-9 22:18 | 只看该作者
怎么在中断有延时呢?

使用特权

评论回复
14
huanghuac| | 2021-10-9 22:20 | 只看该作者
void USART1_IRQHandler()
{
printf("successful!!!!\n");
Delay_Ms(1000);
}

这个有问题吧。

使用特权

评论回复
15
dengdc| | 2021-10-9 22:24 | 只看该作者
删除Delay_Ms(1000);

使用特权

评论回复
16
songqian17| | 2021-10-9 22:26 | 只看该作者
RX线是不是有问题呢

使用特权

评论回复
17
liliang9554| | 2021-10-9 22:28 | 只看该作者
中断无法进入,就是硬件不能正常连接。

使用特权

评论回复
18
zhuhuis| | 2021-10-9 22:30 | 只看该作者
RX线有虚焊的地方吗

使用特权

评论回复
19
songqian17| | 2021-10-9 22:32 | 只看该作者
如果是硬件的问题,重新焊接一下。

使用特权

评论回复
20
tian111| | 2021-10-9 22:34 | 只看该作者
好像没有配置pull up模式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

718

主题

10129

帖子

3

粉丝