the lament 2019-11-11 19:09 采纳率: 100%
浏览 570
已采纳

使用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条回答

  • zqbnqsdsmd 2019-11-12 09:59
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月14日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?