修改freertos时基心跳为tim14,更新引脚lable

This commit is contained in:
NeoZng
2023-02-04 15:38:05 +08:00
parent 1262f9a516
commit 429aa17fa4
32 changed files with 621 additions and 1840 deletions

View File

@@ -3,16 +3,18 @@
#include "memory.h"
#include "stdlib.h"
static IST8310Instance *ist8310_instance = NULL;
// 一般这个模块只有一个实例,所以直接保存在这里,实际上不保存也可以,application可以自己保存
static IST8310Instance *ist8310_instance = NULL; // 用于存储IST8310实例的指针
#define IST8310_WRITE_REG_NUM 4 // 方便阅读
#define IST8310_DATA_REG 0x03 // ist8310的数据寄存器
#define IST8310_WHO_AM_I 0x00 // ist8310 id 寄存器值
#define IST8310_WHO_AM_I_VALUE 0x10 // 用于检测是否连接成功,读取ist8310的whoami会返回该值
// -------------------初始化写入数组,只使用一次,详见datasheet-------------------------
// the first column:the registers of IST8310. 第一列:IST8310的寄存器
// the second column: the value to be writed to the registers.第二列:需要写入的寄存器值
// the third column: return error value.第三列:返回的错误码
#define IST8310_WRITE_REG_NUM 4
#define IST8310_DATA_REG 0x03 // 数据寄存器
#define IST8310_WHO_AM_I 0x00 // ist8310 id 寄存器值
#define IST8310_WHO_AM_I_VALUE 0x10 // ist8310 id 寄存器值,用于检测是否连接成功
static uint8_t ist8310_write_reg_data_error[IST8310_WRITE_REG_NUM][3] = {
{0x0B, 0x08, 0x01}, // enalbe interrupt and low pin polarity.开启中断,并且设置低电平
{0x41, 0x09, 0x02}, // average 2 times.平均采样两次
@@ -27,64 +29,72 @@ static uint8_t ist8310_write_reg_data_error[IST8310_WRITE_REG_NUM][3] = {
*/
static void IST8310Decode(IICInstance *iic)
{
static int16_t temp[3];
static IST8310Instance *ist;
ist = (IST8310Instance *)(iic->id);
static int16_t temp[3]; // 用于存储解码后的数据
static IST8310Instance *ist; // 用于存储IST8310实例的指针
ist = (IST8310Instance *)(iic->id); // iic的id保存了IST8310实例的指针(父指针)
memcpy(temp, ist->iic_buffer, 6 * sizeof(uint8_t));
memcpy(temp, ist->iic_buffer, 6 * sizeof(uint8_t)); // 不要强制转换,直接cpy
for (uint8_t i = 0; i < 3; i++)
ist->mag[i] = (float)temp[i] * MAG_SEN;
ist->mag[i] = (float)temp[i] * MAG_SEN; // 乘以灵敏度转换成uT(微特斯拉)
}
// EXTI中断回调函数,说明DRDY拉低.主机启动传输并在结束后调用IST8310Decode进行数据解析
// 注意IICAccessMem是阻塞的
/**
* @brief EXTI中断回调函数,说明DRDY拉低.主机启动传输并在结束后调用IST8310Decode进行数据解析
* @note 注意IICAccessMem是阻塞的
*
* @param gpio 发生中断的GPIO实例
*/
static void IST8310StartTransfer(GPIOInstance *gpio)
{
// 先获取IST8310实例的指针(通过gpio实例的父指针id)
IST8310Instance *ist_for_transfer = (IST8310Instance *)gpio->id;
// 中断说明ist已经准备好读取数据寄存器;6个字节,读取后会进入IST8310Decode函数
IICAccessMem(ist_for_transfer->iic, IST8310_DATA_REG, ist_for_transfer->iic_buffer, 6, IIC_READ_MEM);
// 传输完成后会进入IST8310Decode函数进行数据解析
IST8310Decode(ist_for_transfer->iic);
}
IST8310Instance *IST8310Init(IST8310_Init_Config_s *config)
{
static const uint8_t sleepTime = 50;
uint8_t check_who_i_am = 0;
static const uint8_t sleepTime = 50; // 50ms,ist8310的复位时间
uint8_t check_who_i_am = 0; // 用于检测ist8310是否连接成功
// 这个变量只会用到一次,出了这个函数就没用了,所以不用分配空间,直接定义在栈上(因为多看一眼就会爆炸)
// 分配空间,清除flash
// 分配空间,清除flash防止已经填充的垃圾值
IST8310Instance *ist = (IST8310Instance *)malloc(sizeof(IST8310Instance));
memset(ist, 0, sizeof(IST8310Instance));
// c语言赋值从右到左
// c语言赋值从右到左,全部指向同一个地址(这些bspinstnace的父节点都是ist,即ist拥有这些instances)
config->iic_config.id = config->gpio_conf_exti.id = config->gpio_conf_rst.id = ist;
// 传入回调函数
config->iic_config.callback = IST8310Decode;
config->gpio_conf_exti.gpio_model_callback = IST8310StartTransfer;
// 注册两个GPIO和IIC
// 分别注册两个GPIO和IIC
ist->iic = IICRegister(&config->iic_config);
ist->gpio_exti = GPIORegister(&config->gpio_conf_exti);
ist->gpio_rst = GPIORegister(&config->gpio_conf_rst);
// 重置IST8310,需要HAL_Delay等待完成Reset
// 重置IST8310,需要HAL_Delay()等待传感器完成Reset
GPIOReset(ist->gpio_rst);
HAL_Delay(sleepTime);
GPIOSet(ist->gpio_rst);
HAL_Delay(sleepTime);
// 读取IST8310的ID,如果不是0x10,则返回错误
// 读取IST8310的ID,如果不是0x10(whoami macro的值),则返回错误
IICAccessMem(ist->iic, IST8310_WHO_AM_I, &check_who_i_am, 1, IIC_READ_MEM);
if (check_who_i_am != IST8310_WHO_AM_I_VALUE)
return NULL; // while(1)
// 进行初始化配置写入并检查是否写入成功
// 进行初始化配置写入并检查是否写入成功,这里用循环把最上面初始化数组的东西都写进去
for (uint8_t i = 0; i < IST8310_WRITE_REG_NUM; i++)
{ // 写入配置
{ // 写入配置,写一句就读一下看看ist8310是否仍然在线
IICAccessMem(ist->iic, ist8310_write_reg_data_error[i][0], &ist8310_write_reg_data_error[i][1], 1, IIC_WRITE_MEM);
IICAccessMem(ist->iic, ist8310_write_reg_data_error[i][0], &check_who_i_am, 1, IIC_READ_MEM); // 读回自身id
if (check_who_i_am != ist8310_write_reg_data_error[i][1])
while (1)
ist8310_write_reg_data_error[i][2]; // 掉线/写入失败/未知错误,返回对应的错误码
ist8310_write_reg_data_error[i][2]; // 掉线/写入失败/未知错误,返回对应的错误码
}
ist8310_instance = ist;
ist8310_instance = ist; // 保存ist8310实例的指针
return ist;
}

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once // 防止头文件重复包含,也可以用header guard
#include "bsp_iic.h"
#include "bsp_gpio.h"
@@ -14,15 +14,16 @@
/**
* @brief IST8310 实例定义
* @attention 配置GPIO Pin的时候注意使用GPIO_PIN_x(1,2,3,...,这是一个宏),而不是1,2,3的整形!
*
*/
typedef struct tempist8310
{
IICInstance *iic; // iic实例
GPIOInstance* gpio_rst; // gpio实例,用于复位
GPIOInstance* gpio_exti; // gpio实例,用于获取MAG_DRDY引脚状态,判断数据是否准备好(EXTI外部中断)
uint8_t iic_buffer[8]; // iic接收缓冲区
float mag[3]; // 三轴磁力计数据,[x,y,z]
IICInstance *iic; // iic实例
GPIOInstance *gpio_rst; // gpio实例,用于复位
GPIOInstance *gpio_exti; // gpio实例,用于获取MAG_DRDY引脚状态,判断数据是否准备好(EXTI外部中断)
uint8_t iic_buffer[8]; // iic接收缓冲区
float mag[3]; // 三轴磁力计数据,[x,y,z]
void (*ist_module_callback)(IICInstance *); // 模块回调函数
// 后续有需要再添加
@@ -31,22 +32,19 @@ typedef struct tempist8310
/**
* @brief IST8310 初始化配置结构体
* @attention 配置GPIO Pin的时候注意使用GPIO_PIN_x(1,2,3,...,这是一个宏),而不是1,2,3的整形!
*
*/
typedef struct
{
IIC_Init_Config_s iic_config; // iic初始化配置
GPIO_Init_Config_s gpio_conf_rst; // gpio初始化配置,用于复位
IIC_Init_Config_s iic_config; // iic初始化配置
GPIO_Init_Config_s gpio_conf_rst; // gpio初始化配置,用于复位ist8310,看数据手册
GPIO_Init_Config_s gpio_conf_exti; // gpio初始化配置,用于获取MAG_DRDY引脚状态,判断数据是否准备好(EXTI外部中断)
} IST8310_Init_Config_s;
/**
* @brief IST8310 初始化.
* @note 一条i2c总线只能挂载一个IST8310
* @note 注意一条i2c总线只能挂载一个IST8310,他们的地址是固定的,不能改变.
*
*/
IST8310Instance *IST8310Init(IST8310_Init_Config_s *config);
void rest(int aa);
int nit(int bb);