You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

164 lines
5.3 KiB

#include "usart1.h"
#include <stdio.h>
#include "iap.h"
#include "cmsis_armcc.h"
Cmd_States Uart1_Cmd_State = kCmd_Head1;
extern uint32_t g_tim3_count; //
uint32_t uart1_recv_time = 0;
/**
* @brief Configure nested vector interrupt controller NVIC.
*/
void USART1_NVIC_Configuration(void)
{
NVIC_InitType NVIC_InitStructure;
/* Configure USART as interrupt source */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
/*Set the priority*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
/*Set the sub priority */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
/*Enable interrupt */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/* Initialize configuration NVIC */
NVIC_Init(&NVIC_InitStructure);
USART_ClrIntPendingBit(USARTx, USART_INT_RXDNE);
}
void Usart1_Init(void)
{
GPIO_InitType GPIO_InitStructure;
USART_InitType USART_InitStructure;
/* Enable GPIO clock */
GPIO_APBxClkCmd(USARTx_GPIO_CLK | RCC_APB2_PERIPH_AFIO, ENABLE);
/* Enable USARTy and USARTz Clock */
USART_APBxClkCmd(USARTx_CLK, ENABLE);
/* Configure USARTx Tx as alternate function push-pull */
GPIO_InitStructure.Pin = USARTx_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
/* Configure USARTx Rx as input floating */
GPIO_InitStructure.Pin = USARTx_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitPeripheral(USARTx_GPIO, &GPIO_InitStructure);
/* USARTy and USARTz configuration ------------------------------------------------------*/
USART_InitStructure.BaudRate = 115200;
USART_InitStructure.WordLength = USART_WL_8B;
USART_InitStructure.StopBits = USART_STPB_1;
USART_InitStructure.Parity = USART_PE_NO;
USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;
/* Configure USARTx */
USART_Init(USARTx, &USART_InitStructure);
// Configuration interrupt priority of the usart port
USART1_NVIC_Configuration();
// Enable usart port receive interrupt
USART_ConfigInt(USARTx, USART_INT_RXDNE, ENABLE);
/* Enable the USARTx */
USART_Enable(USARTx, ENABLE);
}
/***************** Send one byte data **********************/
static void Usart_SendByte(USART_Module* pUSARTx, uint8_t ch)
{
/* Send one byte data to usart */
USART_SendData(pUSARTx, ch);
/* Waiting to send data register is empty */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXDE) == RESET)
;
}
/****************** Send an array of 8 bit************************/
void Usart_SendArray(USART_Module* pUSARTx, uint8_t* array, uint16_t num)
{
uint8_t i;
for (i = 0; i < num; i++)
{
/* Send one byte data to usart */
Usart_SendByte(pUSARTx, array[i]);
}
/* Wait to send finished */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXC) == RESET)
;
}
#pragma import(__use_no_semihosting)
struct __FILE {
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
/* retarget the C library printf function to the USART */
int fputc(int ch, FILE* f)
{
USART_SendData(USARTx, (uint8_t)ch);
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXDE) == RESET)
;
return (ch);
}
static uint8_t buf66[] = {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66};
void Cmd_Parse(uint8_t buf)
{
switch(Uart1_Cmd_State) {
case kCmd_Head1 : // <EFBFBD><EFBFBD>ʼ״̬<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>һ<EFBFBD><EFBFBD>ͷ
if(buf == 0x55) { Uart1_Cmd_State = kCmd_Head2; } // <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
break;
case kCmd_Head2 : // <EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>ҵڶ<EFBFBD><EFBFBD><EFBFBD>ͷ
if(buf == 0x55) { Uart1_Cmd_State = kCmd_Len; } // <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else { Uart1_Cmd_State = kCmd_Head1; } // <EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʼ̬
break;
case kCmd_Len : // <EFBFBD>ҵ<EFBFBD><EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ȣ<EFBFBD>Ŀǰ<EFBFBD><EFBFBD><EFBFBD>ȹ̶<EFBFBD>Ϊ0x01<EFBFBD><EFBFBD>
if(buf == 0x01) { Uart1_Cmd_State = kCmd_Id; } // <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else { Uart1_Cmd_State = kCmd_Head1; } // <EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʼ̬
break;
case kCmd_Id : // <EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD>Ŀǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IDֻ<EFBFBD><EFBFBD>0x01<EFBFBD><EFBFBD>IAP<EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
if(buf == 0x01) { Uart1_Cmd_State = kCmd_data; } // <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>
else { Uart1_Cmd_State = kCmd_Head1; } // <EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD>ʼ̬
break;
case kCmd_data :
if(buf == 0xAA) {
// ִ<EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>
__disable_irq(); /* <EFBFBD><EFBFBD>ֹȫ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
Usart_SendArray(USARTx, buf66, sizeof(buf66));
Set_IAP_UpdateFlag(); // дFlash<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD>±<EFBFBD>־
__set_FAULTMASK(1); // <EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
NVIC_SystemReset(); // ִ<EFBFBD>и<EFBFBD>λ
}
break;
}
}
void USART1_IRQHandler(void)
{
uint8_t buf_temp;
//
if(USART_GetFlagStatus(USARTx, USART_INT_RXDNE) != RESET) {
USART_ClrIntPendingBit(USARTx, USART_INT_RXDNE);
buf_temp = USART_ReceiveData(USARTx);
uart1_recv_time = g_tim3_count;
Cmd_Parse(buf_temp); // Buf<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}