有关蓝牙模块中断处理位不置1
使用调试助手,在不向蓝牙模块发射字符时,能够显示字符‘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++;
}
}
进入中断,不一定就是接收中断,
也可能是发送中断,或者其它错误中断。
建议先搞清楚是什么引起中断,
然后,清除相关中断标志。
页:
[1]