接线图:
实物图:
RXD接PA9,TXD接PA10,PB1接按键,PA1口接LED,长脚接正,短脚接GND。
代码部分:
main.c代码部分:
#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h" #include "Key.h" uint8_t KeyNum; int main(void) { OLED_Init(); Serial_Init(); OLED_ShowString(1,1,"RxData"); OLED_ShowString(3,1,"TxData"); //赋初值 Serial_TxPacket[0]=0x01; Serial_TxPacket[1]=0x02; Serial_TxPacket[2]=0x03; Serial_TxPacket[3]=0x04; while (1) { KeyNum = Key_GetNum(); if(KeyNum==1) { Serial_SendPacket();//发送数据包 Serial_TxPacket[0]++; Serial_TxPacket[1]++; Serial_TxPacket[2]++; Serial_TxPacket[3]++; OLED_ShowHexNum(2,1,Serial_TxPacket[0],2); OLED_ShowHexNum(2,4,Serial_TxPacket[1],2); OLED_ShowHexNum(2,7,Serial_TxPacket[2],2); OLED_ShowHexNum(2,10,Serial_TxPacket[3],2); } if(Serial_GetRxFlag() == 1)//标志位结束判断 { OLED_ShowHexNum(4,1,Serial_TxPacket[0],2); OLED_ShowHexNum(4,4,Serial_TxPacket[1],2); OLED_ShowHexNum(4,7,Serial_TxPacket[2],2); OLED_ShowHexNum(4,10,Serial_TxPacket[3],2); } } }
Serial.c代码部分:
#include "stm32f10x.h" // Device header uint8_t Serial_RxFlag; uint8_t Serial_TxPacket[4]; uint8_t Serial_RxPacket[4];//接收库函数USART_Serial_ReceiveData(USART1)的值, void Serial_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate=9600; USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode=USART_Mode_Tx; USART_InitStruct.USART_Parity=USART_Parity_No; USART_InitStruct.USART_StopBits=1; USART_InitStruct.USART_WordLength=0; USART_Init(USART1,&USART_InitStruct); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStruct); USART_Cmd(USART1,ENABLE); } void Serial_SendByte(uint8_t Byte) { USART_SendData(USART1,Byte); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } void Serial_SendArray(uint8_t *Array,uint16_t Lenth) { uint8_t i; for(i=0;i<Lenth;i++) { USART_SendData(USART1,Array[i]); } } void Serial_SendString(char*String) { uint8_t i; for(i=0;String[i]!= '\0';i++) { Serial_SendByte(String[i]); } } uint32_t Serial_Pow(uint16_t x,uint16_t y) { uint32_t Return; while(y--) { Return*=x; } return Return; } void Serial_SendNumber(uint32_t Number,uint8_t Lenth) { uint8_t i; for(i=0;i<Number;i++) { USART_SendData(USART1,Number/Serial_Pow(10,Lenth-1-i)%10+0x40); } } uint8_t Serial_GetRxFlag(void) { if(Serial_RxFlag==1) { Serial_RxFlag=0; return 1; } else return 0; } //调用该函数,TxPacket的四个数据会自动发送出去 void Serial_SendPacket(void) { Serial_SendByte(0xFF);//发送包头(数据用Byte) Serial_SendArray(Serial_TxPacket,4);//发送载荷数据(数组用Array) Serial_SendByte(0xFE); } //接收数据 void USART1_IRQHandler(void) { static uint8_t RxState=0;//分情况判断 static uint8_t pRxPacket=0;//数组下标判断 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET) { uint8_t RxData=USART_ReceiveData(USART1); if(RxState==0) { if(RxData==0xFF) { RxState=1; pRxPacket=0; } } else if(RxState==1) { Serial_RxPacket[pRxPacket]=RxData;//将RxData放在数组里,pRxPacket表示存的位置 pRxPacket++; if(pRxPacket>=4) { RxState=2; } } else if(RxState==2) { if(RxData==0xFE) { RxState=0; Serial_RxFlag=1;//置标志位,告诉已结束 } } USART_ClearITPendingBit(USART1,USART_IT_RXNE); } }
Serial.h代码部分:
#ifndef __SERIAL_H #define __SERIAL_H extern uint8_t Serial_TxPacket[]; extern uint8_t Serial_RxPacket[]; void Serial_Init(void); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t *Array,uint16_t Lenth); void Serial_SendString(char* String); uint32_t Serial_Pow(uint16_t x,uint16_t y); void Serial_SendNumber(uint32_t Number,uint8_t Lenth); void USART1_IRQHandler(void); uint8_t Serial_GetRxFlag(void); void Serial_SendPacket(void); #endif
个人笔记: