SDK——如何快速上手一个接口驱动任务(以iic为例)

如何快速上手一个接口驱动任务:(这里以iic为例)

一、注意这里有一些基本概念需要知道:

1.关于主从模式的选择(以iic为例)

本项目中fpga外接传感器,fpga 通过iic接口对传感器进行读写控制,所以应该看的是iic控制器主模式

2.关于外设的中断模式(intr)和轮询模式(polled)

2.1 轮询模式 (Polling Mode)

工作机制
在轮询模式下,CPU定期主动检查外设的状态,判断是否有事件发生。例如,CPU会不断读取I2C接口的状态寄存器,检查是否有新的数据到达或传输完成。
优点
简单易实现:实现轮询模式的代码通常比较简单,不涉及复杂的中断配置。
可控性强:因为是主动检查,程序流程相对简单,调试也比较容易。
缺点
CPU资源浪费:如果外设事件发生频率低,CPU会在大量时间内无意义地等待。
响应时间不可控:因为需要等待CPU轮询到该事件,所以响应时间不如中断模式。
适用场景
低速外设:例如低频率的数据采集。
简单任务:不需要高实时性和高性能的场景。

2.2 中断模式 (Interrupt Mode)

工作机制
在中断模式下,外设发生事件时,会触发一个中断信号,通知CPU进行处理。CPU暂停当前任务,转而执行中断服务程序(Interrupt Service Routine,ISR)来处理该事件,处理完成后再返回继续执行原来的任务。
优点
高效:CPU只有在有事件发生时才进行处理,大部分时间可以执行其他任务,提高了系统的效率。
实时性好:能够快速响应外设事件,适合对响应时间有较高要求的应用。
缺点
复杂性:中断的实现和管理相对复杂,需要处理中断的优先级、嵌套以及中断上下文切换等问题。
调试困难:由于中断是异步触发,调试和问题定位相对困难。
适用场景
高频事件:如高频率的数据通信或实时性要求高的任务。
多任务系统:如操作系统内核中广泛使用中断来管理多任务。

可以简单的把cpu当成老师,把外设当成学生,
轮询模式就理解成:老师讲课的过程中,每隔一定的时间去问学生有没有不懂的地方
而中断模式则是:老师讲课的过程中,学生主动去打断老师,向老师进行提问。

二、学习iic的驱动

1.通过导入一些示例+gpt解读,快速了解一些基本函数

在这里插入图片描述
在这里插入图片描述
例如这里学习iic时导入下图所示的历程(注意:)
在这里插入图片描述

2.发现常用的函数包括:

XIicPs_LookupConfig: 查找并获取IIC设备的配置结构。
XIicPs_CfgInitialize: 使用获取的配置结构初始化IIC设备。
XIicPs_SelfTest: 对IIC设备执行自检测试,确保设备正常工作。
XIicPs_SetSClk: 设置IIC时钟速率。
XIicPs_MasterSendPolled: 在主设备模式下发送数据,使用轮询方式。
XIicPs_BusIsBusy: 检查IIC总线是否繁忙,等待传输完成。
XIicPs_MasterRecvPolled: 在主设备模式下接收数据,使用轮询方式。

然后对这些函数的使用进行查看即可:

XIicPs_LookupConfig:在这里插入图片描述
XIicPs_CfgInitialize
在这里插入图片描述
。。。。。。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个简单的示例代码,演示如何在STM32F103上使用I2C接口驱动LCD12864。 首先,确保你已经配置好了STM32F103的GPIO和I2C外设。接下来,你需要创建一个新的C文件,例如 `lcd12864.c`,并在其中编写以下代码: ```c #include "lcd12864.h" #include "i2c.h" #define LCD_I2C_ADDR 0x3C // LCD12864的I2C从机地址 void LCD12864_Init(void) { // 初始化I2C外设 I2C_Init(); // 发送初始化命令到LCD12864 // 请根据LCD12864的数据手册配置相应的初始化命令 // 这里仅提供一个示例,具体初始化命令请参考你使用的LCD12864的数据手册 uint8_t initCmds[] = {0x38, 0x0C, 0x06, 0x01}; I2C_WriteData(LCD_I2C_ADDR, initCmds, sizeof(initCmds)); } void LCD12864_Clear(void) { // 发送清屏命令到LCD12864 uint8_t clearCmd = 0x01; I2C_WriteData(LCD_I2C_ADDR, &clearCmd, sizeof(clearCmd)); } void LCD12864_WriteString(uint8_t row, uint8_t col, const char* str) { // 计算光标位置 uint8_t cursorPos = (row == 1) ? (0x80 + col) : (0xC0 + col); // 设置光标位置 uint8_t setCursorCmd[] = {0x80, cursorPos}; I2C_WriteData(LCD_I2C_ADDR, setCursorCmd, sizeof(setCursorCmd)); // 写入字符串 I2C_WriteData(LCD_I2C_ADDR, (uint8_t*)str, strlen(str)); } ``` 上述代码中,`LCD12864_Init`函数用于初始化LCD12864,你需要根据LCD12864的数据手册配置相应的初始化命令。`LCD12864_Clear`函数用于清屏,发送清屏命令到LCD12864。`LCD12864_WriteString`函数用于在指定的行列位置写入字符串。 此外,你还需要创建一个头文件 `lcd12864.h`,并在其中声明上述函数: ```c #ifndef LCD12864_H #define LCD12864_H #include <stdint.h> #include <string.h> void LCD12864_Init(void); void LCD12864_Clear(void); void LCD12864_WriteString(uint8_t row, uint8_t col, const char* str); #endif ``` 最后,根据你的项目需要,在主程序中调用上述函数即可使用LCD12864。 请注意,上述代码仅为示例,实际使用时可能需要根据具体的LCD12864型号和连接方式进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值