OpenEdv-开源电子网

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

继昨天BSRR问题导致的新问题.关于BSRRH,BSRRL对引脚的电平设置

[复制链接]

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
发表于 2015-12-9 11:44:34 | 显示全部楼层 |阅读模式
5金钱
在昨天发现BSRR这个写法在STMF4中并不应用了,而是改成了BSRRH,BSRRL.
于是这么写了
#define SCL_H GPIOB->BSRRH = GPIO_Pin_6
#define SCL_L GPIOB->BSRRL = GPIO_Pin_6
·········
 while(1)
 {
 delay_ms(1000);

 SCL_H;
 SDA_H;
  
 delay_ms(1000);
  
 SCL_L;
 SDA_L;  
}
然后用示波器查看引脚口波形, 可以看到每隔一秒就会翻转一次.  于是很高兴的拿着自己的I2C,丢进去.
结果是,嗯,很好,依旧是老朋友——不行.(同样的I2C写法我在F1是可以用的,只是当了下copy忍者So,这部分应该是可以得).

很好,我于是单独去测试I2C_Start(),先贴出I2C,代码.
bool I2C_Start(void)
{
 SDA_H;
 SCL_H;
 delay_us(4);
 if(!SDA_read)return FALSE; //SDA线为低电平则总线忙,退出
 SDA_L;
 delay_us(4);
 if(SDA_read) return FALSE; //SDA线为高电平则总线出错,退出
 SDA_L;
 delay_us(4);
 return TRUE;
}
··················
在Main中while里是这么执行的:temp初始值为2.

 temp = I2C_Start();
  
 if(temp == 1)  printf("应答为TURE");
 else  if(temp == 0)  printf("应答为FLASE"); 
 else  printf("无应答");

串口返回的数据为:应答为FLASE  示波器持续低电平.


于是我看了下,我在I2C中已经用了SCL_H(在之前的测试中也是有翻转的.)于是摸不着头脑. 我把SCL_H改成了SCL_L,很好.这次确实变成了高电平了.  那么问题来了.SCL_H关联的是BSRRH为什么是置引脚口低电平? SCL_L关联的是BSRRL,却是置高. 请问是否是头文件中的一个错误?还是我哪里对BSRRH,BSRRL的理解有误.

请大虾指点.

最佳答案

查看完整内容[请看2#楼]

不好意思,昨天粗心,把那个弄反了。其实是 #define SCL_L GPIOB->BSRRH = GPIO_Pin_6 #define SCL_H GPIOB->BSRRL = GPIO_Pin_6 BSRRH和BSRRL代表BSRR的高16位和低16位 建议问问题之前先百度搜索一下
< 主啊,请你温柔的笑吧 >
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2015-12-9 11:44:35 | 显示全部楼层
不好意思,昨天粗心,把那个弄反了。其实是
#define SCL_L GPIOB->BSRRH = GPIO_Pin_6
#define SCL_H GPIOB->BSRRL = GPIO_Pin_6
BSRRH和BSRRL代表BSRR的高16位和低16位
建议问问题之前先百度搜索一下
回复

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
236
金钱
236
注册时间
2015-12-7
在线时间
59 小时
 楼主| 发表于 2015-12-9 11:44:35 | 显示全部楼层
回复【2楼】lvehe:
---------------------------------
嗯,我查了下,是我昨天理解你意思理解错了.  我以为他们很人性化的直接就可以置电平,所以HL理解为电平了. 
  
/*————————————————————————————————————————*/
做一下解释给后来的朋友如果看到这个问题:

其实这里H是指高16位的BRy即BSRR位16-位31(对应引脚口0-15).哪一个BRy置1引脚口就会置0 即输出低电平.   

反之,BSy就是BSRR的低16位.(也是对应引脚口0-15),哪一位BSy置1引脚口就会置1 即输出高电平.

/*————————————————————————————————————————*/

我这里已经把MPU6050的参数读出来了.各部分问题也明白了,谢谢 Lvehe 吖,真的很热心呢+1.
< 主啊,请你温柔的笑吧 >
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 18:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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