使用stm32f1通过串口接收上位机信息产生中断来控制电机,但是中断打不开,想请大佬看看是为什么?

主要思路是在串口通信助手中发送“1”,然后串口接收中断打开,在串口通信助手中打印“中断开始”的信息。但是这句“中断开始”信息没有显示,想请大佬看看shi'wei'shen'm

usart.c

#include "stm32f10x.h"
#include "usart.h"

//已检查 无误
static void NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    NVIC_Init(&NVIC_InitStructure);

}

//串口初始化函数已检查 无误
void USART1_Init(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    //看io口和usart的时钟
    //RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA,ENABLE);  函数用错了
    //RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    //初始化串口USART1输入输出的io口
    //输出 推挽复用输出    PA9
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    //初始化PA9
    GPIO_Init( GPIOA , &GPIO_InitStructure );
    //输出 浮空输入 PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //初始化PA10
    GPIO_Init( GPIOA , &GPIO_InitStructure );

    //初始化串口
    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_Init(USART1,&USART_InitStructure);

    //串口中断优先级配置
    NVIC_Config();

    //串口接收中断 因为是接受上位机消息后驱动电机转动,所以使用接受中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    //串口使能
    USART_Cmd( USART1,ENABLE);

}

/* 使用串口发送一个字节 */
void USART_SendByte(USART_TypeDef* pUSARTx,uint16_t Data)
{
    USART_SendData( pUSARTx, Data);
    while( USART_GetFlagStatus( pUSARTx,USART_FLAG_TXE) == RESET);
}

/* 发送字符串(来自野火教程) */
void USART_SendStr( USART_TypeDef* pUSARTx , uint8_t *str)
{
    uint8_t i=0;
    do
    {
        USART_SendByte( pUSARTx, *(str+i));
        i++;
    }while( *(str+i) != '\0' );
    while( USART_GetFlagStatus( pUSARTx,USART_FLAG_TC) == RESET);
}


///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
        /* 发送一个字节数据到串口 */
        USART_SendData(USART1, (uint8_t) ch);

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

        return (ch);
}

///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
        /* 等待串口输入数据 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

        return (int)USART_ReceiveData(USART1);
}

usart.h

#ifndef __USART_H
#define __USART_H

#include "stm32f10x.h"
#include <stdio.h>

void USART1_Init(void);
void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str);


#endif /* __USART_H */

main.c

#include "stm32f10x.h"
#include "moto.h"
#include "usart.h"

int main(void)
{
        USART1_Init();
    USART_SendStr( USART1 , "000\n");
    //USART1_Init();
    while(1){}
}

中断服务函数

#include "stm32f10x_it.h"
#include "usart.h"


u8 Start_Flag=1; //电机启动/锁定标志
u16 Pluse_High=10; //脉冲高电平中断次数      1->10us
u16 Pluse_Period=200;//脉冲周期中断次数 (转速)

//脉冲中断服务函数------------------------------------------------------------

u32 TimeCount=0;//进中断计数
u16 a=0;

void SysTick_Handler(void)
{
}

void USART_IT_Handler(void)
{

    //USART_SendStr( USART1 , "test\n");
    if(USART_GetITStatus( USART1 ,USART_IT_RXNE)!=RESET)
    {
        printf("中断开始\n");//这句信息在串口通信助手中不显示
        while(1)
        {
            if( USART_ReceiveData(USART1) == 1 );
            break;
        }

            GPIO_SetBits(GPIOE,GPIO_Pin_5);
        while(a>1000)//让方向信号的输出略大于脉冲信号
      {a++;}
        DJ_Init();
            while(1){TIM4_Int_Init(10-1,84-1);}

    }

}

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问