Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
STM32 I2C模拟问题
发布于 2014-10-02 13:09:56 浏览:5875
订阅该版
```/* 设置文件 */ #include "stm32f10x.h" #include "rtdef.h" #include "i2c.h" #include "i2c-bit-ops.h" #include "board.h" #include
#include
//GPIO 设置 i2c2与usart3脚相同 i2c1与FSMC引脚冲突 /* I2C2 */ #define I2C2_GPIO_SCL GPIO_Pin_10 #define I2C2_GPIO_SDA GPIO_Pin_11 #define I2C2_GPIO GPIOB /* GPIO */ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = I2C2_GPIO_SCL|I2C2_GPIO_SDA; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C2_GPIO, &GPIO_InitStructure); GPIO_SetBits(I2C2_GPIO,I2C2_GPIO_SCL|I2C2_GPIO_SDA); } /* RCC */ void RCC_Configuration() { RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); } /* rt_hw_i2c_init */ void stm32_set_sda(void *data, rt_int32_t state) { if(state==1) GPIO_SetBits(I2C2_GPIO,I2C2_GPIO_SDA); else if(state==0) GPIO_ResetBits(I2C2_GPIO,I2C2_GPIO_SDA); } void stm32_set_scl(void *data, rt_int32_t state) { if(state==1) GPIO_SetBits(I2C2_GPIO,I2C2_GPIO_SCL); else if(state==0) GPIO_ResetBits(I2C2_GPIO,I2C2_GPIO_SCL); } /* 读i2c线状态 */ rt_int32_t stm32_get_sda(void *data) { return RT_EOK; } rt_int32_t stm32_get_scl(void *data) { return RT_EOK; } void stm32_udelay(rt_uint32_t us) { rt_uint32_t delta; /* 获得延时经过的tick数 */ us = us * (SysTick->LOAD/(1000000/RT_TICK_PER_SECOND)); /* 获得当前时间 */ delta = SysTick->VAL; /* 循环获得当前时间,直到达到指定的时间后退出循环 */ while (delta - SysTick->VAL< us); } static const struct rt_i2c_bit_ops stm32_i2c_bit_ops = { // .data = (void*)0xaa, // .set_sda = stm32_set_sda, // .set_scl = stm32_set_scl, // .get_sda = stm32_get_sda, // .get_scl = stm32_get_scl, // .udelay = stm32_udelay, // .delay_us = 20, // .timeout = 5 }; void rt_hw_i2c_init(void) { struct rt_i2c_bus_device stm32_i2c; RCC_Configuration(); GPIO_Configuration(); rt_memset((void *)&stm32_i2c, 0, sizeof(struct rt_i2c_bus_device)); stm32_i2c.ops = (void *)&stm32_i2c_bit_ops; rt_i2c_bit_add_bus(&stm32_i2c, "i2c"); } ``` 这是我写的I2C模拟驱动的借口部分,调试的时候会死在rt_i2c_bit_add_bus的断言部分,提示i2c设备结构private部分为空。 给private填充值之后,又会死在rt_mutex_take里的RT_DEBUG_IN_THREAD_CONTEXT上。 初学者已经弄了好多天了,请各路大神指条明路。。。。
查看更多
7
个回答
默认排序
按发布时间排序
wulamao
2014-10-02
这家伙很懒,什么也没写!
``` stm32_i2c.priv = (void *)&stm32_i2c_bit_ops; //填充private ```
wulamao
2014-10-02
这家伙很懒,什么也没写!
我把初始化 放进i2c线程里去了之后 能够运行了但是又出现了新的问题: ``` | / - RT - Thread Operating System / | 1.2.2 build Oct 2 2014 2006 - 2013 Copyright by rt-thread team psr: 0x21000000 r00: 0x200027a0 r01: 0x10000000 r02: 0xf0000000 r03: 0x00000020 r04: 0x20001080 r05: 0x200014ac r06: 0x00000000 r07: 0x00000000 r08: 0x00000000 r09: 0xdeadbeef r10: 0xdeadbeef r11: 0xdeadbeef r12: 0x08007e25 lr: 0x08006709 pc: 0x08006708 hard fault on thread: i2c thread pri status sp stack size max used left tick error -------- ---- ------- ---------- ---------- ---------- ---------- --- tidle 0x1f ready 0x00000040 0x00000100 0x00000040 0x00000020 000 i2c 0x06 suspend 0x00000040 0x00000200 0x00000090 0x00000009 000 init 0x08 ready 0x00000040 0x00000800 0x00000040 0x00000014 000 led 0x14 ready 0x00000040 0x00000200 0x00000040 0x00000005 000 bus fault: SCB_CFSR_BFSR:0x04 IMPRECISERR ``` ...
wulamao
2014-10-03
这家伙很懒,什么也没写!
最后我把i2c初始化和线程一起放进 board_init 里初始化就好了。。。。
pangwei
2014-10-09
这家伙很懒,什么也没写!
放init线程里面即可
yesjyo
2014-10-28
这家伙很懒,什么也没写!
请教 wulamao 我目前使用STM32F051去写I2C功能,我照你贴的程式去编释程式, rt_hw_i2c_init我是放在board_init,但是程式执行起来还是有错误,我使用Finsh调式的讯息如下,拜托指点一下我是哪一个环节没有注意到 谢谢 ``` SYSCLK_Frequency is 48000000HZ PCLK_Frequency is 48000000HZ HCLK_Frequency is 48000000HZ CECCLK_Frequency is 32786HZ ADCCLK_Frequency is 14000000HZ USART1CLK_Frequency is 48000000HZ I2C1CLK_Frequency is 8000000HZ SystemCoreClock is 48000000HZ Function[rt_mutex_take] shall not be used before scheduler start (0) assert failed at rt_mutex_take:648 ```
FMagic
2015-03-05
这家伙很懒,什么也没写!
OD
撰写答案
登录
注册新账号
关注者
0
被浏览
5.9k
关于作者
wulamao
这家伙很懒,什么也没写!
提问
1
回答
3
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【NXP-MCXA153】 定时器驱动移植
2
GD32F450 看门狗驱动适配
3
【NXP-MCXA153】看门狗驱动移植
4
RT-Thread Studio V2.2.9 Release Note
5
CherryUSB的bootuf2配置
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
16
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
9
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部