使用调试助手,在不向蓝牙模块发射字符时,能够显示字符‘B’,说明应该进入了中断。向蓝牙模块发射字符,不显示字符‘A’,应该是中断处理位不置1,这应该怎么解决,还是存在别的问题。 以下是我的程序: #include "usart.h" u32 tep; u8 e; void usart_config(void) { /*1、打开GPIO,AFIO,USART1的时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); /*2\初始化相应的串口引脚*/ usart_release_gpio_init(); /*3、配置串口中断*/ usart_nvic_config(); /*4、配置串口模式*/ usart_para_config(); } void usart_release_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStruct; /*配置PA9为复用推挽输出*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); /*配置PA10为浮空输入*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStruct); } void usart_para_config(void) { USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 9600; //蓝牙波特率设为9600; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8 USART_InitStruct.USART_Parity = USART_Parity_No; //n USART_InitStruct.USART_StopBits = USART_StopBits_1; //1 USART_Init(USART1, &USART_InitStruct); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收中断使能 USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //发射中断使能 USART_ClearFlag(USART1,USART_FLAG_TC); //清除发送完成标志位 USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志 USART_Cmd(USART1, ENABLE); //使能串口 1 } void usart_nvic_config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口 1 中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为 0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_Init(&NVIC_InitStructure); } int fputc(int ch, FILE*f) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET) { } USART_SendData(USART1,(uint8_t) ch); return ch; } void USART1_IRQHandler(void) { printf("B"); if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生 { printf("A"); tep+=USART_ReceiveData(USART1)<<e; USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志 e++; } } |
也可能是发送中断,或者其它错误中断。
建议先搞清楚是什么引起中断,
然后,清除相关中断标志。
评分
查看全部评分