主要思路是在串口通信助手中发送“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);}
}
}