Bluetooth STM32F3发现USART不';行不通

Bluetooth STM32F3发现USART不';行不通,bluetooth,interrupt,stm32,usart,Bluetooth,Interrupt,Stm32,Usart,我试图将HC-05用于我的STM32F3发现,但我在让USART工作方面遇到了问题 不管我是手动读取HC-05的数据还是使用中断,它都不起作用 我试着在arduino上运行这个蓝牙模块,第一次尝试时它工作了,所以HC-05工作正常 这是我的代码,如果你们能看一下并找出错误,我将非常感激 /*包括------------------------------------------------------------------*/ #包括“main.h” #包括“stm32f30x_usart.h

我试图将HC-05用于我的STM32F3发现,但我在让USART工作方面遇到了问题

不管我是手动读取HC-05的数据还是使用中断,它都不起作用

我试着在arduino上运行这个蓝牙模块,第一次尝试时它工作了,所以HC-05工作正常

这是我的代码,如果你们能看一下并找出错误,我将非常感激

/*包括------------------------------------------------------------------*/
#包括“main.h”
#包括“stm32f30x_usart.h”
#包括“stm32f30x_rcc.h”
/**@addtogroup STM32F3\u发现\u外围设备\u示例
* @{
*/
/**@addtogroup GPIO\u IOToggle
* @{
*/ 
/*私有类型定义-----------------------------------------------------------*/
/*私有定义------------------------------------------------------------*/
#定义BSRR_VAL 0xC000
/*私有宏-------------------------------------------------------------*/
/*私有变量---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
静态IO uint32时间延迟;
易失性uint16\u t usart\u缓冲区=0;
volatile char usartMessage[]=“message”;
/*私有函数原型-----------------------------------------------*/
无效延迟(持续时间);
无效USART1_IRQHandler(无效);
/*私人职能---------------------------------------------------------*/
无效USART_打印(USART_类型定义*USARTx,易失性字符*缓冲区)
{
/*传输直到遇到空字符*/
while(*缓冲区)
{
USART_SendData(USARTx,*buffer++);
while(USART_GetFlagStatus(USART_FLAG_TXE,USART_FLAG_TXE)=重置);
}
}
/**
*@brief主程序。
*@param-None
*@retval无
*/
内部主(空)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,启用);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType\u PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA和GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA、GPIO_PinSource9、GPIO_AF_7);
GPIO_PinAFConfig(GPIOA、GPIO_PinSource10、GPIO_AF_7);
/*配置USART1引脚:--------------------------------------*/
RCC_APB1PeriphLockCmd(RCC_APB2Periph_USART1,启用);
USART_DeInit(USART1);
USART_InitStructure.USART_波特率=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_奇偶校验=USART_奇偶校验号;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl\u None;
USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1和USART_InitStructure);
USART_Cmd(USART1,启用);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//启用USART1接收中断
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;//我们要配置USART1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//设置USART1中断的优先级组
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//设置组内的子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//USART2中断是全局启用的
NVIC_Init(&NVIC_InitStructure);//属性被传递给NVIC_Init函数,该函数负责处理低级内容
//最后,这将启用完整的USART1外围设备
USART_Cmd(USART1,启用);
if(系统时钟配置(系统时钟/1000))
{ 
/*捕获错误*/
而(1),;
}
STM_EVAL_LEDInit(LED5);
而(1)
{
int i=USART_接收数据(USART1);
如果(i='1'){
USART_print(USART1,“信息”);
}
/*对于(i=0;usartMessage[i]!=0;i++){
USART_print(USART1和usartMessage[i]);
}*/
延迟(200);
}
}
void USART1\u IRQHandler(void){
延迟(100);
USART_打印(USART1,“消息中断!”);
如果(USART_GetITStatus(USART1,USART_IT_RXNE)!=重置){
usart\U buffer=usart\U接收数据(USART1);
}
}
无效延迟(IO uint32时间)
{ 
计时延迟=nTime;
while(计时延迟!=0);
}
/**
*@brief递减计时延迟变量。
*@param-None
*@retval无
*/
无效定时延迟减量(无效)
{
如果(计时延迟!=0x00)
{ 
定时延迟--;
}
}
您应该使用

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
(好吧,STMicro的新标题有不同的命名方案,但我认为很容易找到匹配项) 而不是

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
使引脚连接到外围设备(USART),而不是直接IO

除此之外,您的代码还有一些奇怪的特性,比如在irq处理程序中使用非易失性的TimeDecrement或Delay(除非正确设置irq的优先级,否则无法工作),但我希望您知道自己在做什么