本示例将演示如何在Niobe WiFi IoT开发板上进行IIC_GYRO开发
osThreadId_t osThreadNew(osThreadFunc_t func, void *argument,const osThreadAttr_t *attr )
描述:
函数osThreadNew通过将线程添加到活动线程列表并将其设置为就绪状态来启动线程函数。线程函数的参数使用参数指针*argument传递。当创建的thread函数的优先级高于当前运行的线程时,创建的thread函数立即启动并成为新的运行线程。线程属性是用参数指针attr定义的。属性包括线程优先级、堆栈大小或内存分配的设置。可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。
注意 :不能在中断服务调用该函数
参数:
名字 | 描述 |
---|---|
func | 线程函数. |
argument | 作为启动参数传递给线程函数的指针 |
attr | 线程属性 |
IoTGpioInit函数是一个初始化GPIO管脚的函数,函数返回初始化结果。此函数在管脚使用之前调用,避免重复调用,避在再中断中使用。
函数参数值传递需要使用到的引脚号,可选引脚参数有如下:
typedef enum {
IOT_GPIO_IO_GPIO_0 = 0,
IOT_GPIO_IO_GPIO_1,
IOT_GPIO_IO_GPIO_2,
IOT_GPIO_IO_GPIO_3,
IOT_GPIO_IO_GPIO_4,
IOT_GPIO_IO_GPIO_5,
IOT_GPIO_IO_GPIO_6,
IOT_GPIO_IO_GPIO_7,
IOT_GPIO_IO_GPIO_8,
IOT_GPIO_IO_GPIO_9,
IOT_GPIO_IO_GPIO_10,
IOT_GPIO_IO_GPIO_11,
IOT_GPIO_IO_GPIO_12,
IOT_GPIO_IO_GPIO_13,
IOT_GPIO_IO_GPIO_14,
IOT_GPIO_IO_GPIO_MAX
} IOT_GPIO_IO_NAME;
IoTGpioSetDir函数用来设置GPIO引脚方向,函数传递两个参数,一个是需要设置的引脚号,一个是引脚方向。函数返回设置结果。
参数 | 描述 |
---|---|
id | 引脚号,参考初始化函数的引脚设置 |
dir | 引脚方向,参考IotGpioDir枚举值。 |
/**
* @brief Enumerates GPIO directions.
*/
typedef enum {
/** Input */
IOT_GPIO_DIR_IN = 0,
/** Output */
IOT_GPIO_DIR_OUT
} IotGpioDir;
IoTGpioSetDir函数用来设置GPIO的复用功能,函数传递两个参数,一个是需要设置的引脚号,一个是复用为什么功能。函数返回设置结果。
参数 | 描述 |
---|---|
id | 引脚号,参考初始化函数的引脚设置 |
val | 复用为什么功能,参考各个GPIO的复用枚举值。 |
/**
* GPIO_13 pin function.CNcomment:GPIO_13管脚功能。CNend
*/
typedef enum {
HI_IO_FUNC_GPIO_13_SSI_DATA,
HI_IO_FUNC_GPIO_13_UART0_TXD,
HI_IO_FUNC_GPIO_13_UART2_RTS_N,
HI_IO_FUNC_GPIO_13_SDIO_D0,
HI_IO_FUNC_GPIO_13_GPIO,
HI_IO_FUNC_GPIO_13_PWM4_OUT,
HI_IO_FUNC_GPIO_13_I2C0_SDA,
HI_IO_FUNC_GPIO_13_I2S0_WS,
} hi_io_func_gpio_13;
IotIoSetPull函数用来设置GPIO的pull功能,函数传递两个参数,一个是需要设置的引脚号,一个是设置GPIO为上拉还是下拉。函数返回设置结果。
参数 | 描述 |
---|---|
id | 引脚号,参考初始化函数的引脚设置 |
val | GPIO的pull值,参考IOT_IO_PULL枚举。 |
typedef enum {
/** No pull */
IOT_IO_PULL_NONE,
/** Pull-up */
IOT_IO_PULL_UP,
/** Pull-down */
IOT_IO_PULL_DOWN,
/** Maximum value */
IOT_IO_PULL_MAX,
} IOT_IO_PULL;
unsigned int IoTGpioRegisterIsrFunc(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity, GpioIsrCallbackFunc func, char *arg);
/**
I2C(Inter Integrated Circuit)总线是由Philips公司开发的一种简单、双向二线制同步串行总线。
I2C以主从方式工作,通常有一个主设备和一个或者多个从设备,主从设备通过SDA(SerialData)串行数据线以及SCL(SerialClock)串行时钟线两根线相连,如图1 所示。
I2C数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个bit进行传输。
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,当主设备需要和某一个从设备通信时,通过广播的方式,将从设备地址写到总线上,如果某个从设备符合此地址,将会发出应答信号,建立传输。
I2C接口定义了完成I2C传输的通用方法集合,包括:
I2C控制器管理: 打开或关闭I2C控制器
I2C消息传输:通过消息传输结构体数组进行自定义传输
2. I2C去初始化函数:unsigned int IoTI2cDeinit(unsigned int id)
参数说明:
id: 对应的I2C号
return: IOT_SUCCESS表示去除初始化成功
3. I2C写数据函数:unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen)
参数说明:
id: 对应的I2C号
deviceAddr: I2C设备地址
data: 写入的数据缓冲区地址
dataLen: 写入的数据字节数
return: IOT_SUCCESS表示写入成功
4. I2C读数据函数:unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen)
参数说明:
id: 对应的I2C号
deviceAddr: I2C设备地址
data: 读取数据缓冲区地址
dataLen: 读取的字节数
return: IOT_SUCCESS表示读取成功
5. I2C速率设置函数:unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate)
参数说明:
id: 对应的I2C号
baudrate: 设置的I2C速率值
本案例通过不断循环读取MPU6050的Accel和Gyro数据,通过这个算法条件X + 100 < Gyro_Data.Accel[0] || X - 100 > Gyro_Data.Accel[0] ||
Y + 100 < Gyro_Data.Accel[1] || Y - 100 > Gyro_Data.Accel[1] || Z + 100 < Gyro_Data.Accel[2] || Z - 100 > Gyro_Data.Accel[2]来控制LED1
和LED2的亮灭变化
static void GryoExampleTask(void)
{
GyroInit();
while (1)
{
printf("=======================================\r\n");
printf("*************E53_SC2_example***********\r\n");
printf("=======================================\r\n");
GyroReadData();
printf("\r\n******************************Temperature is %d\r\n", (int)Gyro_Data.Temperature);
printf("\r\n******************************Accel[0] is %d\r\n", (int)Gyro_Data.Accel[0]);
printf("\r\n******************************Accel[1] is %d\r\n", (int)Gyro_Data.Accel[1]);
printf("\r\n******************************Accel[2] is %d\r\n", (int)Gyro_Data.Accel[2]);
printf("\r\n******************************Gyro[0] is %d\r\n", (int)Gyro_Data.Gyro[0]);
printf("\r\n******************************Gyro[1] is %d\r\n", (int)Gyro_Data.Gyro[1]);
printf("\r\n******************************Gyro[2] is %d\r\n", (int)Gyro_Data.Gyro[2]);
if (X == 0 && Y == 0 && Z == 0)
{
X = (int)Gyro_Data.Accel[0];
Y = (int)Gyro_Data.Accel[1];
Z = (int)Gyro_Data.Accel[2];
}
else
{
printf("MPU6050 second ReadAcc Gyro_Data.Accel[0] ==%d\t Gyro_Data.Accel[1] ==%d\t Gyro_Data.Accel[2] ==%d\n",Gyro_Data.Accel[0],Gyro_Data.Accel[1],Gyro_Data.Accel[2]);
if (X + 100 < Gyro_Data.Accel[0] || X - 100 > Gyro_Data.Accel[0] || Y + 100 < Gyro_Data.Accel[1] || Y - 100 > Gyro_Data.Accel[1] || Z + 100 < Gyro_Data.Accel[2] || Z - 100 > Gyro_Data.Accel[2])
{
printf("\r\n*******************led1 off led2 on******************\r\n");
LEDD1StatusSet(OFF);
LEDD2StatusSet(ON);
}
else
{
printf("\r\n*******************led2 off led1 on******************\r\n");
LEDD1StatusSet(ON);
LEDD2StatusSet(OFF);
}
X = (int)Gyro_Data.Accel[0];
Y = (int)Gyro_Data.Accel[1];
Z = (int)Gyro_Data.Accel[2];
printf("MPU6050 second ReadAcc X ==%d\t Y ==%d\t Z ==%d\n",X,Y,Z);
}
usleep(1000000);
}
}
修改 applications\app
路径下 BUILD.gn 文件,指定 gpio_led_example
参与编译。
# "TW001_OS_helloworld:helloworld",
#"TW002_OS_thread:os_thread_example",
#"TW003_OS_timer:os_timer_example",
#"TW004_OS_event:os_event_example",
#"TW005_OS_mutex:os_mutex_example",
#"TW006_OS_semp:os_semp_example",
#"TW007_OS_message:os_message_example",
#"TW101_GPIO_led:gpio_led_example",
#"TW102_EXTI_key:exti_key_example",
#"TW103_PWM_led:pwm_led_example",
#"TW104_ADC_voltage:adc_voltage_example",
#"TW105_I2C_sht30:i2c_sht30_example",
#"TW106_UART:uart_example",
"TW207_Module_gyro:module_gyro_example",
#"TW301_APP_oled:app_oled_example",
#"TW302_APP_nfc:app_nfc_example"
修改好BUILD.gn,代码编译烧录代码后,按下开发板的RESET按键。不同角度LED1、LED2会有不同的亮灭变化,打开串口工具也能看到相对应的log打印
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。