April小红花 发表于 2020-5-13 20:24 你好,实际上,我的i就是定义在外面的。定义在exit.c头文件声明下面的,也设置成全局变量了。只是为了上传到网上,所以才放在函数里面的。 |
你先把i设为10看看能不能输出 |
GPIO_ReadInputDataBit是对中断状态置位的函数,SET状态就进入中断。程序中的if判断i是否加1的条件,建议检查一下,是否是等于0,应该是等于SET。另外GPIO_ReadInputDataBit函数应该是在主循环中一直运行才可以 |
首先,你的代码中,i 每次在进中断时,都被赋值为 0 ,所以这个函数局部变量,加 static 或者在函数外部定义一下(变成全局变量) 再观察一下 其次,print 这个函数是耗时操作,不清楚你的这个中断发生频率以及是否产生中断嵌套(一个中断未执行完又进来同样的一个中断),中断嵌套时,会发生各种不可预期、各种神奇、各种离谱的结果 最后,建议用示波器查一下你监控脚位的脉冲次数,如果只来 10次,那去猜测 u16 上限是没有意义的 |
lovezjf234 发表于 2020-5-14 10:32 你好,下面附上GPIO_ReadInputDataBit内容:它的作用好像是来判断某个IO的电平的吧(个人理解,错了请勿怪)。 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) { uint8_t bitstatus = 0x00; /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GET_GPIO_PIN(GPIO_Pin)); if ((GPIOx->IDR & GPIO_Pin) != (uint32_t)Bit_RESET) { bitstatus = (uint8_t)Bit_SET; } else { bitstatus = (uint8_t)Bit_RESET; } return bitstatus; } |
_q_zj 发表于 2020-5-13 17:50 你把这个函数内容贴上来GPIO_ReadInputDataBit。个人理解是验证数据总共有多少位,而i只是记录位数,所以i一般用unsigned char 就够了。看来下面很多人的观点,都不在关注点上 |
_q_zj 发表于 2020-5-13 20:52 给你寄两个建议 1把i变成全局变量 2吧printf("%d",i)中的%d换成%5d |
_q_zj 发表于 2020-5-13 20:37 因为你每次触发中断都会执行一次 i= 0的操作。 |
51hei截图20200514083247.png (23.24 KB, 下载次数: 76)
另外建议楼主把程序里面的u16 i;更改为static u16 i;这样每次进入到程序中不会再重新初始化数据i。 |
u16的意思是无符号16位整形数,能够表示的范围是0~65535,也就是0~2^16-1。 |
每次中断,i 的值都将重置为0。 |
_q_zj 发表于 2020-5-13 20:52 第一次上传图片失败,请忽略这个。谢谢。 |
下面附上u8、u16、u32定义图片: C:\Users\home\Desktop\8I1FY}DC60RL{}AJW$L6VKT.png |
liuzx66 发表于 2020-5-13 19:18 您好,实际上我对u16到底是什么也不是很清楚。下面是我找到的一个网址,您可以看一下。如果您看懂了,希望您能告诉我一下。谢谢 网址:https://blog.csdn.net/xuw_xy/article/details/91868992 |
黄youhui 发表于 2020-5-13 18:33 你好,你的回答我没有搞懂,抱歉,我还不会发图片。我在网上搜到的都说 在stm32上面u16是int类型,为什么不能输出0和1外的数字呢? |
权威人物 发表于 2020-5-13 18:33 您好,我试了一下。还是一样。串口输出9之后,还是会卡掉。不管怎么说,谢谢您。 |
u16, unsigned int , 0-65535. |
i 在中断处理函数内部,是局部变量,你的问题跟 i 定义的类型无关,应该把 i 放在外面,定义成全局变量才能得到正确的结果。 |
u16是什么东东?不要问别人问题的时候使用非标准的定义。 |
能打印出9太令人惊讶,你每次触发中断都会执行一次 u16 i = 0;还能打印出除了 0和1外的数字。 |
_q_zj 发表于 2020-5-13 17:52 是的 ,加了再试试,记得要有控制对应的外部中断IO口才会进入中断 |
权威人物 发表于 2020-5-13 16:38 您好,您的意思是指:我在变量声明前加上static来进行修饰变量吗?就是说把u16 i;改为static u16 i;是这样吗? |
lovezjf234 发表于 2020-5-13 16:24 在proteus仿真时,我同时也在用示波器显示GPIO_PIN_2引脚所接的方波信号。它一直在发送方波信号,这样的话,我的数值应该是一直往上加的才对,那怎么会到9就加不上去了呢?还有,您说的读取数据的位数是指什么啊?抱歉,我不太懂。您能说的明白些吗,麻烦您了。 |
青桑叶 发表于 2020-5-13 16:09 我看了一下u16在stdint.h里面的定义,是unsigned short int类型。 没错。 |
static修饰 |
你只是读取数据的位数,和i取什么类型没毛关系,所以即使你改成char也是同样的结果。这个数值的大小GPIO_Pin_2上发来几次下降沿低电平,和你设置i的类型没关系 |
你输出的是十进制数。i在函数体外面怎么定义的?别定义成char型。 |
补充:之后我把变量改成int类型,还是出现同样的问题。求助各位大佬,望不吝赐教。谢谢。 |