STM32F103VE使用USART1中断接收时,无法接收超过8位数据
各位大侠,本人想实现从上位机通过串口传递固定长度16位数据到STM32的USART1口,例如在上位机上发送ABCD,那么STM32的USART1接收也应接收到ABCD,但事实上进入中断之后,总只能接收到CD,AB没有办法接收到。
代码如下:
USART1初始化代码
void DALI_USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
/**************************************************************************/
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_Init(USART1,&USART_InitStructure);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
}
USART1中断处理程序如下:
void USART1_IRQHandler(void)
{
int i= 0;
//标志位置位
Interrupt_flag=1;
DALI_Usart1_flag=1;
// 指示灯点亮
GPIO_SetBits(GPIOE,GPIO_Pin_7);
//特殊需要,关断其他中断,不允许其他中断进入
TIM_ITConfig( TIM2, TIM_IT_CC2 , DISABLE );
TIM_ITConfig( TIM4, TIM_IT_CC1 , DISABLE);
DALI_EXTI_Disable();
//防溢出
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)!=RESET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
//接收数据
if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_data = USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
if (count > 1 )
{
count = 0;
usart_data_receive = (usart_data<<8)+usart_data;
}
}
//发送数据
if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_TXE);
printf("%c",i_dali_receive);
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
//加短延时,让发送更稳定
while(i<500)
{
i++;
}
}
//关闭指示灯
GPIO_ResetBits(GPIOE,GPIO_Pin_7);
}
请各位大侠指点一下迷津,已经调试多次了,没有办法解决啊
看看datasheet,看看uart 的Control register usart_data_receive = (usart_data<<8)+usart_data;
断点,add watch usart_data usart_data Mandelbrot_Set 发表于 2015-4-9 16:35
断点,add watch usart_data usart_data
这里进入不了,因为前面的conut计数据只会变成1,不会继续下去,也就是说只是usart_data有数值 usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 安 发表于 2015-4-9 17:07
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 ...
这个定义的是16位
extern u8 usart_data[];
extern u16 usart_data_receive; 安 发表于 2015-4-9 17:07
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 ...
这个定义的是16位的 安 发表于 2015-4-9 17:07
usart_data_receive 是多少位的?这个是程序处理的问题,而不是串口接收的问题。 ...
这个定义的是16位
extern u8 usart_data[];
extern u16 usart_data_receive;
if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_data = USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
if (count > 1 )
{
count = 0;
usart_data_receive = (usart_data<<8)+usart_data;
}
}
在软件仿真时,进入中断之后,程序只执行到这一步USART_ClearITPendingBit(USART1,USART_IT_RXNE),不去判断count的值,退出中断.串口助手发送出来的是ABCD,但看DR中的值确是CD 本帖最后由 安 于 2015-4-9 17:35 编辑
你看一下接收缓冲区中的数据.先给16位的数据赋值,然后再加.
或者改成count >0
页:
[1]
2