#include "stm32f10x.h"
#include "MYSerial.h"
void MYSerial_Init(void) {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
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_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void MYSerial_SentByte(uint8_t byte) {
USART_SendData(USART1, byte);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
void MYSerial_SentArray(uint8_t* Arr, uint16_t Length) {
for(int i=0;i<Length;i++) MYSerial_SentByte(Arr[i]);
}
void MYSerial_SentString(char* Str) {
for(int i=0;Str[i]!='\0';i++) MYSerial_SentByte(Str[i]);
}
void MYSerial_SentNumber(int Num) {
char Snum[10];
int flag=0;
int i=0;
int b=0;
if(Num<0) {
Num/=-1;
flag=1;
}
while(Num!=0) {
b=Num%10;
Snum[i++]='0'+b;
if(i>9) i=0;
Num/=10;
}
if(flag==1) MYSerial_SentByte('-');
while(i>=0) MYSerial_SentByte(Snum[i--]);
}
uint8_t MYSerial_USART1_RxPacketHead_HEX = 0xff;
uint8_t MYSerial_USART1_RxPacketTail_HEX = 0xfe;
uint8_t MYSerial_USART1_TxPacketData_HEX[4];
uint8_t MYSerial_USART1_RxPacketData_HEX[4];
uint8_t MYSerial_USART1_RxPacketFlag_HEX=0;
uint8_t MYSerial_USART1_GetRxPacketFlag_HEX(void) {
uint8_t tmpFlag=0;
if(MYSerial_USART1_RxPacketFlag_HEX == 1) {
tmpFlag=1;
MYSerial_USART1_RxPacketFlag_HEX=0;
}
return tmpFlag;
}
void MYSerial_USART1_SentPacketData_HEX(void) {
MYSerial_SentByte(MYSerial_USART1_RxPacketHead_HEX);
MYSerial_SentArray(MYSerial_USART1_TxPacketData_HEX, 4);
MYSerial_SentByte(MYSerial_USART1_RxPacketTail_HEX);
}
void USART1_IRQHandler(void) {
static uint8_t flag=0;
static uint8_t pData=0;
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) {
uint8_t rxData = USART_ReceiveData(USART1);
switch(flag) {
case 0:
if(rxData == MYSerial_USART1_RxPacketHead_HEX) flag=1;
break;
case 1:
MYSerial_USART1_RxPacketData_HEX[pData++] = rxData;
if(pData>3) {
pData=0;
flag=2;
}
break;
case 2:
if(rxData == MYSerial_USART1_RxPacketTail_HEX) {
flag=0;
MYSerial_USART1_RxPacketFlag_HEX=1;
}
break;
}
USART_ClearITPendingBit(USART1, USART_FLAG_RXNE);
}
}
#ifndef __MYSERIAL_H
#define __MYSERIAL_H
void MYSerial_Init(void);
void MYSerial_SentByte(uint8_t byte);
void MYSerial_SentArray(uint8_t* Arr, uint16_t Length);
void MYSerial_SentString(char* Str);
void MYSerial_SentNumber(int Num);
uint8_t MYSerial_USART1_GetRxPacketFlag_HEX(void);
void MYSerial_USART1_SentPacketData_HEX(void);
extern uint8_t MYSerial_USART1_RxPacketData_HEX[4];
extern uint8_t MYSerial_USART1_TxPacketData_HEX[4];
void USART1_IRQHandler(void);
#endif