本设计是基于MAX32660板卡开发的一款模拟运动手表的小实验
具有的功能有以下几点:
- 可以显示时、分、秒信息,采用24小时制
- 步数计数,采用MPU6050陀螺仪实现
- 温度测量功能,使用MPU6050内部集成的温度传感器来实现
- 按键功能,P0_12引脚为按键引脚,通过按键可以查看步数和温度数据
本次设计采用KEIL 5 软件来进行开发,需要注意的是开发前的准备工作是在KEIL官网下载MAX32660固件库进行安装。
开发过程分为一下几个部分进行介绍:
GPIO初始化
按键初始化代码为例
#define KEY_Pin PIN_12
#define KEY_GPIO_Port PORT_0
extern gpio_cfg_t GPIO_KEY;
void GPIO_INIT(void){
GPIO_KEY.port = KEY_GPIO_Port;
GPIO_KEY.mask = KEY_Pin;
GPIO_KEY.pad = GPIO_PAD_PULL_UP;
GPIO_KEY.func = GPIO_FUNC_IN;
GPIO_Config(&GPIO_KEY);
}
从板卡原理图中可以看到按键为P0端口的12引脚,宏定义按键的端口和引脚号
采用DEMO的引脚初始化函数,对结构体变量进行赋值和模式、引脚等信息设置即可。
本设计板卡引脚情况使用如下:
0.96’OLED SPI
CS--->P0_4
DC--->P0_3
RES--->P0_2
D1--->P0_5
D0--->P0_6
GY-521 IIC
SDA--->P0_9
SCL--->P0_8
按键
KEY--->P0_12
本设计计数功能采用MPU6050陀螺仪来实现,陀螺仪与板卡的通信方式采用IIC通信。在基础的芯片初始化和数据处理代码采用正点原子的stm32f103战舰开发板的MPU6050示例代码。对于陀螺仪数据处理过程算法是参考CSDN的博客来完成,链接如下:
https://blog.csdn.net/bzy090212/article/details/78861509/?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
MPU6050初始化代码如下:
short ax,ay,az;
short gx,gy,gz;
float pitch,roll,yaw;
extern int error;
uint8_t MPU_Init(void)
{
uint8_t res;
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);
mxc_delay(1000);
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);
MPU_Set_Gyro_Fsr(3);
MPU_Set_Accel_Fsr(0);
MPU_Set_Rate(50); //ÉèÖòÉÑùÂÊ50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00);
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);
MPU_Write_Byte(MPU_FIFO_EN_REG,0Xff);
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);
res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
if(res==MPU_ADDR)
{
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);
MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);
MPU_Set_Rate(50);
} else
return 1;
return 0;
}
在OLED显示设计中,本设计采用定时器中断法,定期对OLED显示内容进行控制和显示同时对按键进行扫描检测,代码如下:
if(GPIO_InGet(&GPIO_KEY)==0)
{
if(mode==1)
{
mode=0;
}
else if(mode==0)
{
mode=1;
}
while(GPIO_InGet(&GPIO_KEY)==0);
}
if(mode==1)
{
SetFontSize(1);
DrawString(0,0,"Step:");
DrawNum(30,0,step_cnt,5);
}
else if(mode==0)
{
a++;
if(a==10)
{
a=0;
temp1=MPU_Get_Temperature()*10;
}
SetFontSize(1);
DrawString(0,0,"Temp:");
DrawChar(30,0,(temp1/100)+48);
DrawChar(36,0,(temp1%100/10)+48);
DrawString(42,0,".");
DrawChar(48,0,(temp1%10)+48);
DrawString(54,0,"C");
}
其中计时功能也是采用定时器来完成,并对计时进行设置,符合24小时制:
void Clock_Handler(void)
{
TMR_IntClear(CLOCK_TIMER);
sec++;
if(sec == 60)
{
sec =0;
min++;
if(min == 60)
{
min=0;
hour++;
if(hour == 24)
{
hour = 0;
step_cnt = 0;
}
}
}
}
心得体会,本人新手小白,在此次活动中学习到很多。对于开发软件的使用上,在刚开始阶段本人使用ECLIPSE软件来进行开发,发现在找资料时去美信官网查找资料非常快捷方便,但是有些教程视频为英文,这个就血药有一定的英语基础。在开发阶段,陀螺仪的步数检测算法参考大佬的帖子,对于一直方面要注意的地方有很多例如数据的格式,参数的传递,IO的配置等等,这个过程中还不小心烧了一块板卡,导致不得不再买了一块,让我学会了在给板卡上电的时候要先检查好引脚,不然短短几秒就会烧掉140元。
至此本设计展示了进本设计思想和核心程序,全部源代码和演示请见附.