OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4773|回复: 6

新人第一次发贴,请多指点!!战舰IIC源码移植到STM32F030上的IIC问题

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-8-10
在线时间
16 小时
发表于 2015-12-8 17:56:15 | 显示全部楼层 |阅读模式
5金钱
最近学习战舰的板子,在myIIC.H里有这么几句,我移植到STM320303C8T6的时候,编译不通过,
//IO方向设置
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

//IO操作函数  
#define IIC_SCL    Bout(6) //SCL
#define IIC_SDA    Bout(7) //SDA  
#define READ_SDA   PBin(7) //输入SDA 


编译错误信息:..\HARD\myiic.c(24): error:  #136: struct "<unnamed>" has no field "CRL"

什么原因呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-8-10
在线时间
16 小时
 楼主| 发表于 2015-12-8 19:45:19 | 显示全部楼层
看了看STM32F030的手册,发现030的控制寄存器和F1的配置寄存器完全不一样,我把前面两行宏定义这么改了,不知道改对没有(SDA->A3,)
#define SDA_IN()   {GPIOA->MODER&=0XFFFFFF3F;GPIOA->MODER|=(u32)0<<6;GPIOA->UPDR&=0XFFFFFF3F;GPIOA->UPDR|=(u32)1<<7;}    //设置GPIOA_3为输入MODER3[1:0]:00 //设置GPIOA_3为下拉PUPDR3[1:0]:10
#define SDA_OUT()  {GPIOA->MODER&=0XFFFFFF3F;GPIOA->MODER|=(u32)1<<6;GPIOA->OTYPER&=0XFFFFFFF7;GPIOA->OTYPER|=(u32)0<<3;}  //设置GPIOA_3为输出MODER3[1:0]:01//设置GPIOA_3为推挽OTYPER3[3]:0
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-8-10
在线时间
16 小时
 楼主| 发表于 2015-12-8 19:48:53 | 显示全部楼层
后面的三行,不知道怎么改了,也是编译错误,看了看前辈的帖子,发现F0不支持位操作,迷茫....
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-12-8 20:29:09 | 显示全部楼层
那就用笨方法,论坛也有,可以搜索一下,不过是在F103的,好像
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-8-10
在线时间
16 小时
 楼主| 发表于 2015-12-8 20:47:00 | 显示全部楼层
我现在有一笨办法就是
GPIO_SetBits(GPIOB,GPIO_Pin_6)代替IIC_SCL=1;
GPIO_ResetBits(GPIOB,GPIO_Pin_6)代替IIC_SCL=0;
现在主要是我战舰带的好多例程,我不能直接移植到我的F0当中了
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-8-10
在线时间
16 小时
 楼主| 发表于 2015-12-8 20:48:27 | 显示全部楼层
论坛之前有贴回复用这个办法
#define    buzzer_port         GPIOA 
#define     buzzer_port_b     GPIO_Pin_10 
#define  fun_set_port_bit(GPIO_N)           do{GPIO_N##->BSRRL =GPIO_N##_b; }while(0)     
#define  fun_reset_port_bit(GPIO_N)         do{GPIO_N##->BSRRH =(GPIO_N##_b); }while(0) 

fun_set_port_bit(buzzer_port);


 
     

仔细看了看这串代码,好像是这个意思 
fun_set_port_bit(GPIO_N)已经将GPIOA——>IN10置1了,如果直接用 
GPIO_SetBits(GPIOA,GPIO_Pin_3|GPIO_Pin_4);感觉更直观一些, 
而F1里面的PAout(x)只定义了端口,未赋值,个人感觉,意义不大
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2015-8-10
在线时间
16 小时
 楼主| 发表于 2015-12-8 21:16:03 | 显示全部楼层
八度老师点了我一下,我用下面方法后编译通过,但不知道结果是否正确,晒晒:
用下面5行替代原来的三行宏定义
#define IIC_SDA_1 GPIO_SetBits(GPIOA,GPIO_Pin_3)
#define IIC_SCL_1 GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define IIC_SDA_0 GPIO_ResetBits(GPIOA,GPIO_Pin_3)
#define IIC_SCL_0 GPIO_ResetBits(GPIOA,GPIO_Pin_4)

#define READ_SDA  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)

把程序中所有的IIC_SDA=1换为IIC_SDA_1,其它类同
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 19:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表