同步步兵代码,暂时关闭底盘跟随

This commit is contained in:
2025-11-02 21:21:11 +08:00
parent 456cc96c81
commit 3821589bed
693 changed files with 238044 additions and 2735 deletions

View File

@@ -0,0 +1,268 @@
#include "stm32f4xx.h" // Device header
#include "stm32f4xx_conf.h"
#include "MyI2C.h"
#include "Warming.h"
#include "Delay.h"
#define IST8310_Address 0x0E//IST8310的地址
#define IST8310_Who_Am_I 0x00//Who Am I寄存器
#define IST8310_CNTL1 0x0A//控制设置1寄存器
#define IST8310_CNTL2 0x0B//控制设置2寄存器
#define IST8310_AVGCNTL 0x41//采样平均寄存器
#define IST8310_PDCNTL 0x42//脉冲持续时间寄存器
#define IST8310_DataStart 0x03//数据寄存器首地址
#define IST8310_TEMPL 0x1C//温度寄存器-温度低八位
#define IST8310_TEMPH 0x1D//温度寄存器-温度高八位
MyI2C_InitTypedef MyI2C_InitStruction;//I2C配置结构体
uint8_t IST8310_DataStartFlag;//IST8310开始接收数据标志位
int16_t IST8310_RawData[4];//IST8310原始数据,1~3为xyz轴磁场原始数据,4为温度原始数据
float IST8310_MagneticField[3];//IST8310磁场数据,分别为xyz轴磁场数据(单位uT)
float IST8310_Temperature;//IST8310温度数据(单位℃)
/*
*函数简介:IST8310的RSTN延时
*参数说明:无
*返回类型:无
*备注:默认配置RSTN延时500us,重启一次延时1ms
*/
void IST8310_Delay_us(void)
{
uint32_t temp;
SysTick->LOAD=500*21; //时间加载我们要延时500倍的us, 1us是一个fac_ua周期所以总共要延时的周期值为二者相乘最后送到Load中。
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开启使能位 开始倒数
do temp=SysTick->CTRL;
while((temp&0x01) && !(temp&(1<<16))); //用来判断 systick 定时器是否还处于开启状态然后在等待时间到达也就是数到0的时候,此时第十六位设置为1
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器使能位
SysTick->VAL=0x00; //清空计数器
}
/*
*函数简介:IST8310配置RSTN电平
*参数说明:高低电平,0-低电平 1-高电平
*返回类型:无
*备注:规定RSTN为PG6
*备注:RSTN为低电平时重启IST8310
*备注:每次修改RSTN,需要等待一段时间产生作用(测试得到0.5ms足矣)
*/
void IST8310_RSTN(uint8_t x)
{
GPIO_WriteBit(GPIOG,GPIO_Pin_6,(BitAction)(x));
IST8310_Delay_us();//延时0.5ms
}
/*
*函数简介:IST8310重启
*参数说明:无
*返回类型:无
*备注:重启大概耗时1ms
*/
void IST8310_Reset(void)
{
IST8310_RSTN(0);
IST8310_RSTN(1);
}
/*
*函数简介:IST8310初始化
*参数说明:无
*返回类型:无
*备注:规定SCL为PA8,SDA为PC9,DRDY为PG3(下降沿)
*备注:初始化中配置了寄存器并进行了重启,大概耗时1ms
*备注:在初始化中对寄存器进行了配置
*备注:初始化时会检查IST8310的ID,ID错误会进行报警,并且程序会卡死不断的进行检测,具体报警现象见Warming.h
*/
void IST8310_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);//开启时钟
MyI2C_InitStruction.MyI2C_SCL_RCC=RCC_AHB1Periph_GPIOA;//配置SCL为PA8
MyI2C_InitStruction.MyI2C_SCL_GPIOx=GPIOA;
MyI2C_InitStruction.MyI2C_SCL_Pin=GPIO_Pin_8;
MyI2C_InitStruction.MyI2C_SDA_RCC=RCC_AHB1Periph_GPIOC;//配置SDA为PC9
MyI2C_InitStruction.MyI2C_SDA_GPIOx=GPIOC;
MyI2C_InitStruction.MyI2C_SDA_Pin=GPIO_Pin_9;
MyI2C_Init(&MyI2C_InitStruction);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉输入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//配置DRDY(PG3)
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOG,EXTI_PinSource3);//配置PG3与中断线的映射关系
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line3;//配置中断线3
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能中断线
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//配置为外部中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//选择下降沿触发
EXTI_Init(&EXTI_InitStructure);//初始化EXTI
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择NVIC分组为2
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;//配置NVIC通道3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能NVIC通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
while(1)
{
if(MyI2C_CheckDevice(&MyI2C_InitStruction,IST8310_Address)==1 && MyI2C_CheckWhoAmI(&MyI2C_InitStruction,IST8310_Address,IST8310_Who_Am_I)==0x10)//设备连接正常,Who Am I正确
{
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//开启NVIC通道
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_CNTL1,0x03);//配置为连续输出模式,输出频率200Hz
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_CNTL2,0x08);//配置为DRDY下降沿中断,不重启
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_AVGCNTL,0x12);//配置为四次采样平均
MyI2C_WriteRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_PDCNTL,0xC0);//配置为正常脉冲持续时间
IST8310_Reset();//IST8310重启
break;
}
else//设备异常
{
NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE;//关闭NVIC通道
NVIC_Init(&NVIC_InitStructure);//初始化NVIC
Warming_IST8310LinkError();//IST8310连接异常报警
Delay_ms(25);
}
}
while(IST8310_DataStartFlag==0);//等待数据开始接收
}
/*
*函数简介:IST8310数据读取
*参数说明:无
*返回类型:无
*备注:读取三轴磁场(单位uT)和温度(单位℃)
*备注:温度转换比例没找到,暂且以0.001为比例转换
*/
void IST8310_GetData(void)
{
uint8_t IST8310_MagneticFieldReceive[6],TempL,TempH;//三轴磁场返回数据,温度返回数据(低八位),温度返回数据(高八位)
MyI2C_ContinuousReadRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_DataStart,IST8310_MagneticFieldReceive,6);//读取三轴磁场返回数据
TempL=MyI2C_ReadRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_TEMPL);//读取温度返回数据(低八位)
TempH=MyI2C_ReadRegister(&MyI2C_InitStruction,IST8310_Address,IST8310_TEMPH);//读取温度返回数据(高八位)
IST8310_RawData[0]=(int16_t)(((uint16_t)(IST8310_MagneticFieldReceive[1])<<8)|IST8310_MagneticFieldReceive[0]);
IST8310_RawData[1]=(int16_t)(((uint16_t)(IST8310_MagneticFieldReceive[3])<<8)|IST8310_MagneticFieldReceive[2]);
IST8310_RawData[2]=(int16_t)(((uint16_t)(IST8310_MagneticFieldReceive[5])<<8)|IST8310_MagneticFieldReceive[4]);//获取三轴磁场原始数据
IST8310_RawData[3]=(int16_t)(((uint16_t)(TempH)<<8)|TempL);//获取温度原始数据
IST8310_MagneticField[0]=IST8310_RawData[0]*0.3f;
IST8310_MagneticField[1]=IST8310_RawData[1]*0.3f;
IST8310_MagneticField[2]=IST8310_RawData[2]*0.3f;//获取三轴磁场数据
IST8310_Temperature=IST8310_RawData[3]*0.001f;//获取温度
}
/*
*函数简介:IST8310外部中断中断函数
*参数说明:无
*返回类型:无
*备注:在中断函数中读取数据
*/
void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3)==SET)//检测IST8310外部中断触发(即检测EXTI通道3中断触发)
{
EXTI_ClearITPendingBit(EXTI_Line3);//清除标志位
IST8310_GetData();//读取数据
IST8310_DataStartFlag=1;//数据开始接收
}
}
/*硬件I2C的遗骸*/
////void IST8310_I2CInit(void)
////{
////
////
//// GPIO_InitTypeDef GPIO_InitStructure;
//// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
//// GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
//// GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
//// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//// GPIO_Init(GPIOA,&GPIO_InitStructure);
//// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
//// GPIO_Init(GPIOC,&GPIO_InitStructure);
//// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
//// GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
//// GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//// GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
//// GPIO_Init(GPIOG,&GPIO_InitStructure);
////
//// GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_I2C3);
//// GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_I2C3);
////
//// I2C_InitTypeDef I2C_InitStructure;
//// I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;
//// I2C_InitStructure.I2C_ClockSpeed=10000;
//// I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;
//// I2C_InitStructure.I2C_Ack=I2C_Ack_Disable;
//// I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
//// I2C_InitStructure.I2C_OwnAddress1=0x01;
//// I2C_Init(I2C3,&I2C_InitStructure);
////
//// I2C3->CR1 |= I2C_CR1_SWRST;
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_BUSY)==SET);
//// I2C3->CR1 &= ~I2C_CR1_SWRST;
////
//// I2C_Cmd(I2C3,ENABLE);
////
//// GPIO_ResetBits(GPIOG,GPIO_Pin_6);
//// Delay_ms(50);
//// GPIO_SetBits(GPIOG,GPIO_Pin_6);
//// Delay_ms(50);
//// LED_BInit();
////}
////void IST8310_I2CWriteData(uint8_t Address,uint8_t Data)
////{
//// uint8_t B=0;
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_BUSY)==SET);
////
//// I2C_GenerateSTART(I2C3,ENABLE);
//// while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
////
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_BUSY)!=SET);
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_MSL)!=SET);
//// //I2C_SendData(I2C3,0x0E<<1);
//// int i=0;
//// do
//// {
//// I2C_Send7bitAddress(I2C3,i<<1,I2C_Direction_Receiver);
//// i++;
//// if(i==0x8F)break;
//// }
//// while(I2C_GetFlagStatus(I2C3,I2C_FLAG_ADDR)!=SET);
//// if(i<0x8F)LED_BON();
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
//// I2C_SendData(I2C3,0x00);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_BYTE_TRANSMITTING)!=SUCCESS);
////
////// I2C_SendData(I2C3,Data);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
//// I2C_GenerateSTART(I2C3,ENABLE);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
////
//// //I2C_SendData(I2C3,(0x0E<<1)|0x01);
//// I2C_Send7bitAddress(I2C3,0x0E,I2C_Direction_Receiver);
//// //while(I2C_GetFlagStatus(I2C3,I2C_FLAG_AF)==SET);
//// //while(I2C_GetFlagStatus(I2C3,I2C_FLAG_ADDR)!=SET);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
//// B=I2C_ReceiveData(I2C3);
//// //while(I2C_CheckEvent(I2C3,I2C_EVENT_MASTER_BYTE_TRANSMITTING)!=SUCCESS);
////
//// I2C_GenerateSTOP(I2C3,ENABLE);
////}