STM32F207串口中断的应用

1)串口中断程序主函数

void USART1_IRQHandler(void)
{
  UartIRQ(&DebugLog);
}

2) //串口中断程序,可处理收发中断

void UartIRQ(USART_T *_pUart)
{
#ifdef SYSTEM_SUPPORT_UCOS //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
#endif
if (USART_GetITStatus(_pUart->uart, USART_IT_RXNE) != RESET) // when RESET=0 that is SET=1 , it is IRQ 这时说明有数据到Buf
{
/* 回调函数,通知应用程序发送完毕,一般是发送1个消息或者设置一个标记 */

/* Read one byte from the receive data register Write to pRxBuf*/

_pUart->pRxBuf[ _pUart->usRxWrite] = USART_ReceiveData(_pUart->uart);

if( (_pUart->pRxBuf[ _pUart->usRxWrite]==0xA0)&&((_pUart->usRxWrite) >1) ) //接收到 包尾 且 数据长大于,说明已接收完成
{
Rxlen=_pUart->usRxWrite ;                                         // 将数据长度传给接收变量,用于回传PC
USART_ClearFlag(_pUart->uart,USART_FLAG_TC); // 清除中断接收完成标示,方便下次接收
USART_ClearFlag(_pUart->uart,USART_FLAG_RXNE); //如果有数据到中断,应先清中断,再次接收!
_pUart->Recive_over_flag=1; //接收完成标示
}

else
{
_pUart->usRxWrite++;
//DebugLog.printf("Read= 0x%d\n", _pUart->usRxWrite);
}

}
else if (USART_GetFlagStatus(_pUart->uart, USART_FLAG_ORE) != RESET)
{
(void)USART_ReceiveData(_pUart->uart);
}

#ifdef delay_ostickspersec //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntExit();
#endif
}

3)回传PC

static s32 sendUartPc(u8 *data,u32 dataSize)
{
u32 i=0;

for(i=0;i<dataSize;i++)
{

printf("%.02X",data[i]); //发送到上位机
DebugLog.printf("get =0x%02x\n",data[i]);
}
printf("\r\n");

return dataSize;
}

4)接收处理


if(g_tUart2.Recive_over_flag)  // 接收标示 为1 时开始接收处理数据
{

DebugLog.printf(" Packet_head= 0x%02x\n", g_tUart2.pRxBuf[0]);
DebugLog.printf(" Packet_ID= 0x%02x\n", g_tUart2.pRxBuf[1]);
DebugLog.printf(" Packet_CMD= 0x%02x\n", g_tUart2.pRxBuf[2]);
DebugLog.printf(" Packet_SUM= 0x%02x\n", g_tUart2.pRxBuf[3]);
DebugLog.printf(" Packet_Writer= %d\n", g_tUart2.usRxWrite);
DebugLog.printf(" Packet_Read= %d\n", g_tUart2.usRxRead);

request_cmd = g_tUart2.pRxBuf[2];

DebugLog.printf("========get test cmd 0x%02x========\n",request_cmd);

switch(request_cmd)
{
case 0x00:// 产品上电
PCBA_Dev.Pcba_PowerOff(&request, &respond);
break;
case 0x01:// 产品上电
PCBA_Dev.Pcba_PowerOn(&request, &respond);
break;
case 0x02:// 产品断
PCBA_Dev.Pcba_PowerOff(&request, &respond);
break;
case 0x03:// button
PCBA_Dev.Pcba_Button_test(&request, &respond);
break;
case 0x04:// Led
PCBA_Dev.Pcba_Led_test(&request, &respond);
break;
case 0x05:// 产品信息
PCBA_Dev.Pcba_get_info(&request, &respond);
break;
case 0x06://Beep
PCBA_Dev.Pcba_Beep_test(&request, &respond);
break;
case 0x07://rtc
PCBA_Dev.Pcba_Rtc_test(&request, &respond);
break;
case 0x08://reset
PCBA_Dev.Pcba_Reset_test(&request, &respond);
break;
case 0xA9://TemHum
PCBA_Dev.Pcba_TemHum_test(&request, &respond);
break;
case 0xAA://RGBC
PCBA_Dev.Pcba_RGBC_test(&request, &respond);
break;
case 0xAB://Banlance
PCBA_Dev.Pcba_RGBCWhite_Banlance_test(&request, &respond);
break;
case 0xAC://Pcba_Usart2_to_Usart6
PCBA_Dev.Pcba_Usart2_to_Usart6(&request, &respond);
break;
default:
//respond.cmd = 0;
DebugLog.printf("get error cmd!\r\n");
}
_END:

Delay_Dev.delay_ms(10);


g_tUart2.sendUartPc((u8*)g_tUart2.pRxBuf,Rxlen+1); //传给PC
g_tUart2.uart2VarInit( ); // 清除内容及标示位,用于下次中断接收数据

DebugLog.printf("=================================\n",request_cmd);
}
return 1;
}

5)// 清除内容及标示位

static void uart2VarInit(void)
{
g_tUart2.usTxWrite = 0;
g_tUart2.usTxRead = 0;
g_tUart2.usRxWrite = 0;
g_tUart2.usRxRead = 0;
g_tUart2.ReciveNew = 0;
g_tUart2.send_over_flag = 0;
g_tUart2.Recive_over_flag = 0;
memset((char *)g_tUart2.pRxBuf,0, g_tUart2.usRxBufSize*sizeof(uint8_t));
memset((char *)g_tUart2.pTxBuf,0, g_tUart2.usTxBufSize*sizeof(uint8_t));
}

 

posted @ 2021-01-21 08:28  FAiBG  阅读(194)  评论(0)    收藏  举报