我使用的是串口三,可以发,但是就一直进不了接收中断,不知道怎么回事?初学者,能详细讲解一下就尽量详细点,多谢了,初始化代码如下:
void RCC_cfg(void)
{
//打开GPIO时钟,复用功能,串口1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}
//IO口配置
void GPIO_cfg(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//PB10作为US3的TX端,打开复用,负责发送数据
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB , &GPIO_InitStructure);
//PB11作为US3的RX端,负责接收数据
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//串口初始化
void USART_cfg(void)
{
USART_InitTypeDef USART_InitStructure;
//将结构体设置为缺省状态
USART_StructInit(&USART_InitStructure);
//波特率设置为9600
USART_InitStructure.USART_BaudRate = 9600;
//一帧数据的宽度设置为8bits
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
//在帧结尾传输1个停止位
USART_InitStructure.USART_StopBits = USART_StopBits_1;
//奇偶失能模式,无奇偶校验
USART_InitStructure.USART_Parity = USART_Parity_No;
//发送/接收使能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//硬件流控制失能
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
//设置串口1
USART_Init(USART3, &USART_InitStructure);
//打开串口1的中断响应函数
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//打开串口1
USART_Cmd(USART3, ENABLE);
}
//配置中断
void NVIC_cfg(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择中断分组2
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn; //选择串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}
中断函数为
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //如果是接收中断
{
USART_ClearITPendingBit(USART3, USART_IT_RXNE); //接收中断标志位清零
usart3_buff[rec_num3] = USART_ReceiveData(USART3);
rec_num3++ ;
if(rec_num3 > 54) //63-9=54,防止9位指令落在串口缓存尾部,以至于接受不完全
{
rec_num3 = 0;
}
if((usart3_buff[rec_num3 - 1] == 0x5A)&&(usart3_buff[rec_num3 - 2] == 0xA5))
{
CmdFlag = rec_num3 - 2; //定义从哪一位开始存储接收到的LCD指令
}
}
}
我想实现的功能就是收一串16进制码,然后判断其中的某一位是不是等于一个特定的值,是的话再往外发一条16进制码
所有代码已上传,芯片是STM32F103VE,高手们帮忙看看啊
|