(STM32F4)用IDLE中断接收显示屏数据时,触摸显示屏,显示屏才会下发数据,每次触摸一下显示屏,就会进入IDLE中断一次;可是用STLINK仿真调试的时候Rx_Buffer一直都有乱七八糟的数据,用示波器测得板子串口接收端在没有触摸显示屏的时候是没有数据下发的,可是调试的时候,数据接收缓冲区却一直有数据乱跳,但是触摸显示屏,数据会正常下发但立刻就变掉了,求问一下这是怎么回事,为什么调试的时候没有任何触摸操作的时候缓冲区不是0?,显示屏那边是没有问题的(触摸才有数据下发,不触摸没有,用示波器测了)Rx_Buffer缓冲区数组有效位最多15,其他的都会被其他乱七八糟的数据给填满了,这是工程配置的原因还是什么原因?以下是代码:[mw_shl_code=c,true]uint8_t Rx_Buffer[50]={0};
/**********************************************************************************************************/
/********************************以下是Usart3 显示屏接口配置*******************配置成DMA方式*****************/
/**********************************************************************************************************/
void lcd_usart_init()
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure ;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /* Enable GPIO clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); /* Enable UART clock */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
USART_InitStructure.USART_BaudRate = 115200;//函数的参数,设置串口的波特率值;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
USART_Init(USART3, &USART_InitStructure);
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART3,USART_IT_RXNE,DISABLE);
USART_ITConfig(USART3,USART_IT_IDLE,ENABLE);
// USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_Cmd(USART3, ENABLE); //使能串口
/* CPU小小的缺陷,如果直接发送第一个字节发送不出去,下面这条语句是解决第一个字节发送的问题 */
while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET);
USART_ClearFlag(USART3,USART_FLAG_TC);
}
void MYDMA_Config_Rx()
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
DMA_DeInit(DMA1_Stream1);
while (DMA_GetCmdStatus(DMA1_Stream1) != DISABLE){}//等待DMA可配置 DMA开启需要时间稳定
/* 配置 DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_Channel_4; //通道选择
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART3_DR_ADDRESS;//DMA外设地址
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Rx_Buffer;//DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到存储器
DMA_InitStructure.DMA_BufferSize = 50;//数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 设置成别的就不行 循环模式传输完一轮数据之后,如果有新的数据到来可以继续DMA,正常模式下不行
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA1_Stream1, &DMA_InitStructure);//初始化DMA Stream
/* 使能 USART DMA RX 请求 */
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Stream1, ENABLE);
}
//u8 temp_num;
/***每次触碰液晶屏都会进此中断***/
void USART3_IRQHandler(void)
{
uint32_t temp = 0;
if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)
{
temp = USART3->SR;
temp = USART3->DR;
count_num123++;//测试
Receive_screen_flag=1; // 接收液晶屏数据标志
DMA_Cmd(DMA1_Stream1, DISABLE);
while (DMA_GetCmdStatus(DMA1_Stream1) != DISABLE){} //确保DMA可以被设置
DMA_SetCurrDataCounter(DMA1_Stream1,50);
DMA_Cmd(DMA1_Stream1, ENABLE);
// USART_ClearITPendingBit(USART3, USART_IT_RXNE);
}
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>