STM32CubeMX实现JY61P六轴姿态陀螺仪模块的IIC配置与实践

最近需要用到陀螺仪这个模块,选取的是JY61P这个模块,单片机是正点原子f103的mini板,查资料的过程中发现用串口的代码很多,用iic的几乎没有,而我又需要iic,所以写移植iic代码的笔记

用的是维特智能的JY61P模块,商家会给资料链接:http://:https://wit-motion.yuque.com/wumwnr/docs/np25sf?singleDoc#%20%E3%80%8AJY61P%E4%BA%A7%E5%93%81%E8%B5%84%E6%96%99%E3%80%8B

选协议说明,接着在左边目录找到IIC协议

 我用的是stm32,选对应选项

就来到了对应的教程界面,下载链接下的对应例程代码,我用的是STM32F1的

 然后打开工程文件,就能看到keil工程了

想看代码的可以打开工程文件自己看看,我们移植代码所需要的文件在上一级的Source目录里

Drive里的这三个

还有同样在Source里的 wit_c_sdk文件夹下的所有文件,可以看到有重复的,都是一样的,到时候移植一个就行,现在找到了移植需要的代码,接下来配置CubeMX

一般STM32都是用GPIO模拟,原因如下

看手册可以知道,f1系列的板子留给IIC的是 PB6 PB7,但是我手里的mini板这两个引脚是没有上拉电阻的,所以用PC11 PC12,正点的板子给这两个引脚加了上拉电阻,CubeMX里只需要给这两个引脚选择开漏输出即可

其实用模拟IIC可以任意选取引脚,只要不和其他功能冲突就好,如果所选引脚没有上拉电阻,就得自己接,选开发板直接有上拉电阻的引脚方便一些 

同时为了方便调试,还需要usart1

鼠标左键点击引脚即可选择功能

外设就配置完成了,接下来就是给工程命名,还要选择MDK-ARM,这个才是keil工程

记得勾选分文件编程

最后点击generate code生成代码,然后来到自己选择的工程路径下,找到MDK-ARM文件夹,就能看到生成的工程代码了

下面开始移植 ,所谓移植,其实就是复制粘贴,找到工程目录下的Core文件夹

然后把前面找到的文件复制到这两个文件夹里,Inc放.h文件,Src放.c文件 

下面来看IOI2C.c和IOI2C.h这两个文件

看头文件部分,包含了两个固件库头文件,会和CubeMX生成的HAL库冲突,所以我自己新建了一个iic.c和iic.h

iic.h

例程里的stm32f10x.h会和HAL库冲突,后面编译会有一堆报错,所以注释掉,添加条件编译和#include "main.h",其余的直接复制就好,添加代码如下

#ifndef _IIC_H_
#define _IIC_H_

#include "main.h"
//#include "stm32f10x.h"
#endif 

iic.c

包含自己的头文件,例程里的IIC_Init(void)关于GPIO初始化的东西全部注释掉,我们前面再CubeMX里已经选配过了,其他的直接复制即可,改动代码如下

#include "iic.h"

void Delay(uint32_t count)//400KHzIIC
{
	unsigned int uiCnt = count*8;
	while (uiCnt --);
}

void IIC_Init(void)
{			
//	GPIO_InitTypeDef GPIO_InitStructure;
// 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);		
// 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_11;	
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	SDA_OUT();     
	IIC_SDA=1;	  	  
	IIC_SCL=1;
}

mian.c

添加头文件

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdio.h>
#include "iic.h"
#include "wit_c_sdk.h"
/* USER CODE END Includes */

然后复制例程mian.c的所有内容,下面这个函数里的delay_ms会引起冲突,这个函数HAL库里的HAL_Delay作用一样,所以delay_ms要重新写,复制HAL_Delay的代码,直接写在mian.c里就行

void delay_ms(uint16_t Delay)
{
  uint32_t tickstart = HAL_GetTick();
  uint32_t wait = Delay;

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
  }
}
static void Delayms(uint16_t ucMs)
{
	delay_ms(ucMs);
}

这样移植就完成了,编译没错,就可以用了

作者:早晚像我师傅一样牛*

物联沃分享整理
物联沃-IOTWORD物联网 » STM32CubeMX实现JY61P六轴姿态陀螺仪模块的IIC配置与实践

发表回复