编写代码:
Serial.c
#include "stm32f10x.h" // Device header
#include "DELAY.h"
#include "OLED.h"
#include "Serial.h"
uint8_t RxData;
uint8_t KeyNum;
int main() {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//下拉输入IPD,上拉输入IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//这一行可以不写,在输入模式下这一行不起作用
GPIO_Init(GPIOA, &GPIO_InitStructure);
OLED_Init();
Serial_Init();
OLED_ShowString(1, 1, "TxData:");
OLED_ShowString(3, 1, "RxData:");
Serial_TxPacket[0] = 0x01;
Serial_TxPacket[1] = 0x02;
Serial_TxPacket[2] = 0x03;
Serial_TxPacket[3] = 0x04;
while(1){
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1){//按键按下,这一位为1
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1);//如果一直不松手那么程序就卡在这里
KeyNum = 1;//返回按键的值
}
if(KeyNum == 1) {
Serial_TxPacket[0] ++;
Serial_TxPacket[1] ++;
Serial_TxPacket[2] ++;
Serial_TxPacket[3] ++;
Serial_SendPacket();
OLED_ShowHexNum(2,1, Serial_TxPacket[0], 2);//RxPacket数组是同时读写的数组,
OLED_ShowHexNum(2,4, Serial_TxPacket[1], 2);
OLED_ShowHexNum(2,7, Serial_TxPacket[2], 2);
OLED_ShowHexNum(2,10, Serial_TxPacket[3], 2);
KeyNum = 0;
}
if(Serial_GetRxFlag() == 1) {
OLED_ShowHexNum(4,1, Serial_RxPacket[0], 2);//RxPacket数组是同时读写的数组,
//当读取速度慢的时候,后面的数据可能会刷新为下一个数据包的数据,可能会造成数据冲突
OLED_ShowHexNum(4,4, Serial_RxPacket[1], 2);
//若在这里(读取的过程中)进入中断,那么数组的数据就可能被覆盖
OLED_ShowHexNum(4,7, Serial_RxPacket[2], 2);
OLED_ShowHexNum(4,10, Serial_RxPacket[3], 2);
}
}
} |