新手上路
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2018-7-18
- 在线时间
- 5 小时
|
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //éèÖÃ′®¿ú2ÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //ÇàÕ¼óÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×óóÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μàê1Äü
NVIC_Init(&NVIC_InitStructure); //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
}
void Uart1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
USART_DeInit(USART2); //¸′λ
// RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB1Periph_USART2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//êy¾Y·¢Ëí¿úTXD PA2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //Ñ¡ÖD′®¿úĬèÏêä3ö1ü½Å
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¶¨òåêä3ö×î′óËùÂê
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//¶¨òå1ü½Å2μÄÄ£ê½
GPIO_Init(GPIOA, &GPIO_InitStructure); //μ÷óÃoˉêy£¬°Ñ½á11ìå2Îêyêäèë½øDD3õê¼»ˉ
//êy¾Y½óêÕ¿úRXD PA3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200; //2¨ìØÂê
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //êy¾Yλ8λ
USART_InitStructure.USART_StopBits = USART_StopBits_1; //í£Ö1λ1λ
USART_InitStructure.USART_Parity = USART_Parity_No; //D£Ñéλ ÎT
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTá÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //ê1Äü½óêÕoí·¢Ëíòy½Å
USART_Init(USART2, &USART_InitStructure);
USART_ClearFlag(USART2,USART_FLAG_TC);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //′ò¿a½óêüÖD¶Ï
USART_ITConfig(USART2, USART_IT_TXE, ENABLE); //′ò¿a·¢ËíÖD¶Ï
//USART_ITConfig(USART2, USART_IT_IDLE,ENABLE); //′ò¿a¿ÕÏDÖD¶Ï
//USART_ClearITPendingBit(USART2,USART_IT_RXNE); //Çå3yÖD¶Ï±êÖ¾
USART_Cmd(USART2, ENABLE); //¿aÆôUSART2
//DelayTime1(10);
NVIC_Configuration();
}
/******
zigbeeÖ®¼äμÄí¨DÅ2aêÔ′úÂë
*******/
//½óêüêy¾Y
#define Max_BUFF_Len 1
unsigned char Uart2_Buffer[Max_BUFF_Len];
unsigned int Uart2_Rx=0;
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) // 中断产生
{
int i; //1
Uart2_Rx=0; //2
Uart2_Buffer[Uart2_Rx++] = USART2->DR&0x01FF; //USART_ReceiveData(USART2); //接受数据到Uart2_Buffer缓存区
//Uart2_Rx++;
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清中断标志
for(i=0; i<sizeof(Uart2_Buffer); i++)
{
//while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){}
while(USART_GetFlagStatus(USART2, USART_IT_TXE) == RESET){}
USART_SendData(USART2,Uart2_Buffer[i]);
//USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
if(Uart2_Rx == Max_BUFF_Len)
{
Uart2_Rx=0; //重新接受
}
我在运行上面程序时,串口助手第一次 打印数据缺了最后一位,之后几次打印都是把上一次的最后一位打印到了下一次的第一位然后依次错开。试了好多种方法一直老样子。无论是删除1,2,改变1,2位置放到中断外面, 还是清中断位置,改for循环之类的都不会变化。我哪里出错啦? (新手小白,会的详细一点,拜托了,也没什么积分)
|
-
串口助手显示
|