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);
}
这样移植就完成了,编译没错,就可以用了
作者:早晚像我师傅一样牛*