之前学习I2C时尝试实现OLED显示电机速度以观测pid的功能,但受困于难以在OLED上实时更新数字,最终只能做到显示一些图片或汉字。今天结合野火和正点原子的资料,融合二者的代码,实现了在0.96i2c四针屏幕上实时显示JY61反馈角度的功能。
有点懒,还是先记一下代码,过几天空闲了添加解读,方便以后复习。
主函数:
/**
******************************************************************************
* @author YCHEN
* @version V1.5
* @date 2021-10-24
* @brief 备战电赛
******************************************************************************
*
* 型号 :STM32F103VET6
* 博客 :https://blog.csdn.net/YANGCHEN144?spm=1000.2115.3001.5343
* 参考资料 :野火教程
* 程序功能 :
1.LED灯
2.配置了USART1,USART2,USART3,其中1用来与JY61通信,2用来监视串口
3.200ms的定时
4.两个按键中断
5.加入了OLED显示角度系统
******************************************************************************
*/
#include "stm32f10x.h"
#include "bsp_led.h"
#include "./usart/bsp_usart.h"
#include <string.h>
#include <stdio.h>
#include "./JY61/JY61.h"
#include "./TimBase/bsp_TiMbase.h"
#include "./EXTI/bsp_exti.h"
#include "./SysTick/bsp_SysTick.h"
//#include "./oled/OLED_I2C.h"
#include "./sys/sys.h"
#include "./oled/oled.h"
#define SOFT_DELAY Delay(0x00FFFF);
void Delay(__IO u32 nCount);
struct SAcc stcAcc;
struct SGyro stcGyro;
struct SAngle stcAngle;
//用串口1给JY模块发送指令
void sendcmd(char cmd[])
{
char i;
for(i=0;i<3;i++)
UART1_Put_Char(cmd[i]);
}
void sendcmd5(char cmd[])
{
char i;
for(i=0;i<10;i++)
UART1_Put_Char(cmd[i]);
}
//CopeSerialData为串口2中断调用函数,串口每收到一个数据,调用一次这个函数。
void CopeSerial2Data(unsigned char ucData)
{
static unsigned char ucRxBuffer[250];
static unsigned char ucRxCnt = 0;
//Usart_SendByte( DEBUG_USARTx2, ucData);
//printf("欢迎使用\n\n");
ucRxBuffer[ucRxCnt++]=ucData; //将收到的数据存入缓冲区中
if (ucRxBuffer[0]!=0x55) //数据头不对,则重新开始寻找0x55数据头
{
ucRxCnt=0;
return;
}
if (ucRxCnt<11) {return;}//数据不满11个,则返回
else
{
switch(ucRxBuffer[1])//判断数据是哪种数据,然后将其拷贝到对应的结构体中,有些数据包需要通过上位机打开对应的输出后,才能接收到这个数据包的数据
{
//memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据结构体里面,从而实现数据的解析。
case 0x51: memcpy(&stcAcc,&ucRxBuffer[2],8);break;
case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break;
case 0x53: memcpy(&stcAngle,&ucRxBuffer[2