萌新求助!stm32 GPIO_ReadInputDataBit读取数据问题??

Hadron_pan 2020-04-25 11:41:16
我用GPIO_ReadInputDataBit读取GPIOA 0口设置为上拉输入
用proteus仿真时,GPIO_ReadInputDataBit返回值一直是0.按理说没按下的话,读到的应该是1,灯熄灭。



...全文
1021 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ye_Shi_Wo 2021-01-25
  • 打赏
  • 举报
回复
我来踩你啦,记得回踩
yishumei 2020-04-26
  • 打赏
  • 举报
回复
右键查看一下按键的初始状态
STM32调试报告 1、头文件 初始化相应的函数,同时最好将相应的引脚进行宏定义,方便后面写主函数时方面。 2、 c函数 c函数要将相应的头文件包括进去,同时初始化相应头文件里面的自己定义的函数。对相应的函数进行编写,包括引入结构体,时钟初始化,选择相应的引脚、引脚输入输出模式、如果是输出需要设置输出速度。 3、 main函数 4、 GPIO端口七个寄存器 两个32位配置寄存器GPIO_CRL AND GPIO_CRH. TWO 32bit dateregister GPIO_IDR AND DPIO_ODR 一个32位置位/复位寄存器GPIO_BSRR 一个16位复位寄存器GPIO_BRR 一个32位锁存寄存器GPIO_LCKR GPIO_CRL寄存器的复位值为 0X4444 4444,从图 6.1.4 可以看到,复位值其实就是配置端口为浮空 输入模式。从上图还可以得出:STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位的模式。 每个 IO 端口的位占用 CRL 的 4 个位,高两位为 CNF,低两位为 MODE。这里我们可以记住几 个常用的配置,比如 0X0 表示模拟输入模式(ADC 用)、0X3 表示推挽输出模式(做输出口用, 50M 速率)、0X8 表示上/下拉输入模式(做输入口用)、0XB 表示复用输出(使用 IO 口的第二 功能,50M 速率)。 在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 比如我要读 GPIOA.5 的电平状态,那么方法是: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); 返回值是 1(Bit_SET)或者 0(Bit_RESET); 在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现 的: void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); GPIO_WriteBit(GPIOR,GPIO_Pin_0,(BitAction)(1));//LED控制 位操作使用ODR AND IDP寄存器 在使用寄存器BSRR 和寄存器BRR时,使用规则总结如下: 1、置GPIOD->BSRR低16位的某位为’1’,则对应的I/O端口置’1’;而置GPIOD->BSRR低16位的某位为’0’,则对应的I/O端口不变。 2、置GPIOD->BSRR高16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BSRR高16位的某位为’0’,则对应的I/O端口不变。 3、置GPIOD->BRR低16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BRR低16位的某位为’0’,则对应的I/O端口不变。 使用场合举例如下: 1)要设置D0、D5、D10、D11为高,而保持其它I/O口不变,只需一行语句: GPIOD->BSRR = 0x0C21;// 使用规则1 2)要设置D1、D3、D14、D15为低,而保持其它I/O口不变,只需一行语句: GPIOD->BRR = 0xC00A;// 使用规则三 3)要同时设置D0、D5、D10、D11为高,设置D1、D3、D14、D15为低,而保持其它I/O口不变,也只需一行语句: GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二 实例3 假设需要对 GPIOA_Pin_6 输出高电平。采用改写 ODR 寄存器的方式时,使用“读-改-写”操作,代码如下: uint32_t temp; temp = GPIOA->ODR; temp = temp | GPIO_Pin_4; GPIOA->ODR = temp; 而使用改写 BSRR 寄存器时,仅需要使用如下语句: GPIOA->BSRR = GPIO_Pin_6; 在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器(即读-改-写形式改变位的状态)。而对 BSRR 的操作,是写 1 有效,写 0 不改变原状态,因此可以对端口 6 置 1,其他位保持为 0。BSRR 为 1 的位,会修改相应的 ODR 位,从而控制输出电平。 因此,在设置单个 IO 口输出时,使用 BSRR 进行操作会更加方便。 在固件库中操作 IDR 寄存器
stm32f103rct6 模拟iic 驱动mpu9250 驱动部分由网络上参考移植 移植需要修改的宏定义 #define I2C_SDA_H GPIO_SetBits(GPIOB,GPIO_Pin_0) //实现SDA高电平 #define I2C_SDA_L GPIO_ResetBits(GPIOB,GPIO_Pin_0) #define I2C_SCL_H GPIO_SetBits(GPIOB,GPIO_Pin_1) #define I2C_SCL_L GPIO_ResetBits(GPIOB,GPIO_Pin_1) #define I2C_SDA_GET GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)//定义读取iic数据 是一个if条件 需要修改的函数 /*************************************************************** ?Name: II2_Config ?Params: void ?Return: void ?Description: 配置引脚工作模式 ***************************************************************/ /* SCL=>PB6 SDA=>PB7 */ void I2C_Work_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为推免输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速度为50MHZ GPIO_Init(GPIOB, &GPIO;_InitStructure);//调用库函数,初始化GPIO } void Mpu_IO_OUT(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为推免输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置引脚速度为50MHZ GPIO_Init(GPIOB, &GPIO;_InitStructure);//调用库函数,初始化GPIO } void Mpu_IO_IN(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO;_InitStructure); } 可能需要修改的函数(延时) void Delay_ms(uint16_t nms) { uint16_t i,j; for(j = nms;j > 0;j --) for(i = 0;i < 1000;i ++); } void Delay_us(u32 ustime) { // us级别的时间,NOP方式,72Mhz主频 u32 i; for(i=0;idata Mpu9250; extern void I2C_Work_Init(void);//模拟iic初始化引脚 extern int Mpu9250_Work_Mode_Init(void);//初始化 extern void READ_MPU9250_MAG(void) ;//读取地磁 extern void READ_MPU9250_GYRO(void) ;//读取陀螺仪 extern void READ_MPU9250_ACCEL(void) ;//读取加速度
杭电电子综合设计全文共4页,当前为第1页。杭电电子综合设计全文共4页,当前为第1页。 杭电电子综合设计全文共4页,当前为第1页。 杭电电子综合设计全文共4页,当前为第1页。 课程设计报告 课程设计名称 电子系统综合设计 实验内容 STM32与PC通信 姓名 学号 专业 电子信息工程 批次 指导教师 二 一三年 七 月 十 日 杭电电子综合设计全文共4页,当前为第2页。杭电电子综合设计全文共4页,当前为第2页。系统框图 杭电电子综合设计全文共4页,当前为第2页。 杭电电子综合设计全文共4页,当前为第2页。 用一个图描述课程设计所涉及的电子系统的原理框图(非原理图) STM32端关键代码 1、if (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET) { adval = ADC_GetConversionValue(ADC1); sprintf((char *)sendstr, "%.1fv\r\n", adval * 3.3 / 4096); USART1_Puts(sendstr); } 单片机进行模拟采样,将采样值赋给adval,对adval进行AD转换,sprintf((char *)sendstr, "%.1fv\r\n", adval * 3.3 / 4096);的函数原型为:sprintf( char *buffer, const char *format, [ argument] … );本句是将ad的值表示成有一位小数的浮点数,然后再在后面加上'v'和换行字符一起放到数组sendst中r 2、oldkey = 0; while (1) { if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == RESET) key = 2; else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == RESET) 杭电电子综合设计全文共4页,当前为第3页。杭电电子综合设计全文共4页,当前为第3页。 key = 3; 杭电电子综合设计全文共4页,当前为第3页。 杭电电子综合设计全文共4页,当前为第3页。 else key = 0; if(key != oldkey) ……… ……… } 不断的检测按键 2,3是否被按下,然后对key进行赋值,在判断原来键值的状态, 然后将信息发送给PC机。 3、USART_InitStructure.USART_BaudRate = 9600; //波特率//9600bps USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数//据位8位 PC端关键代码 1、void CMy09082212Dlg::DataScan(const CString &str) { //检测下位机上传电压信息 *,*v if (str.GetLength() >= 4 && str[7] == 'v') { double dat = atof(str); if(dat < 0) dat = 0; else if(dat > 3.3) dat = 3.3; if(v_data.size() > 260) v_data.erase(v_data.begin(), v_data.begin() + 1); v_data.push_back(dat); DrawBK(); DrawData(); } } 对单片机发送的数据进行读取,对数组str的位长和7位进行判断,当位长大于等于4且第7位为'v',将字符串str转换成浮点数赋给dat,当dat小于等于0时,dat=0;当dat大于等于3.3时,dat=3.3。由于我们在画图时定义宽度为260个点,杭电电子综合设计全文共4页,当前为第4页。杭电电子综合设计全文共4页,当前为第4页。所以当data的位数大于260时,删除多于的数据,做出数据图表和数据曲线。 杭电电子综合设计全文共4页,当前为第4页。 杭电电子综合设计全文共4页,当前为第4页。 2、dc.FillSolidRect(280, 100, 260, 200, RGB(255, 255, 255));//设置画图的起始坐标以及//图的宽度和高度,RGB(, , )用来设置填充的颜色,此处设置的为白色。 CPen ps(PS_DOT, 1, RGB(64, 64, 64));//设置划虚线的颜色(灰) 3、CPen ps(PS_SOLID, 1, RGB(0, 128, 0));设置对上传到的AD划线的颜色(暗绿色) 4、void CMy09082212Dlg::OnButtonSend() { CString str; Ge

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧