各位大侠,本人想实现从上位机通过串口传递固定长度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[count++] = USART_ReceiveData(USART1); USART_ClearITPendingBit(USART1,USART_IT_RXNE); if (count > 1 ) { count = 0; usart_data_receive = (usart_data[0]<<8)+usart_data[1]; } } //发送数据 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); } 请各位大侠指点一下迷津,已经调试多次了,没有办法解决啊 |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
断点,add watch usart_data[0] usart_data[1]
这里进入不了,因为前面的conut计数据只会变成1,不会继续下去,也就是说只是usart_data[0]有数值
这个定义的是16位
extern u8 usart_data[];
extern u16 usart_data_receive;
这个定义的是16位的
这个定义的是16位
extern u8 usart_data[];
extern u16 usart_data_receive;
if (USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
usart_data[count++] = USART_ReceiveData(USART1);
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
if (count > 1 )
{
count = 0;
usart_data_receive = (usart_data[0]<<8)+usart_data[1];
}
}
在软件仿真时,进入中断之后,程序只执行到这一步USART_ClearITPendingBit(USART1,USART_IT_RXNE),不去判断count的值,退出中断.串口助手发送出来的是ABCD,但看DR中的值确是CD
你看一下接收缓冲区中的数据.先给16位的数据赋值,然后再加.
这个算法可能是溢出了.