找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

stm32里面u16最大能是多少

查看数: 12843 | 评论数: 28 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-5-13 14:03

正文摘要:

根据我找到的资料来看,u16是两个字节十六位的short int。它最大应该可以是32767.但是在我的程序里面它到9之后就不能输出了。因为我用的proteus仿真,keil5与proteus的联调,没有做好。也没有实际的电路板去调试。所 ...

回复

ID:736707 发表于 2020-5-13 21:27
April小红花 发表于 2020-5-13 20:24
i 在中断处理函数内部,是局部变量,你的问题跟 i 定义的类型无关,应该把 i 放在外面,定义成全局变量才能 ...

你好,实际上,我的i就是定义在外面的。定义在exit.c头文件声明下面的,也设置成全局变量了。只是为了上传到网上,所以才放在函数里面的。
ID:483807 发表于 2020-5-15 21:30
你先把i设为10看看能不能输出
ID:389856 发表于 2020-5-15 16:55
GPIO_ReadInputDataBit是对中断状态置位的函数,SET状态就进入中断。程序中的if判断i是否加1的条件,建议检查一下,是否是等于0,应该是等于SET。另外GPIO_ReadInputDataBit函数应该是在主循环中一直运行才可以
ID:565305 发表于 2020-5-14 16:15
首先,你的代码中,i 每次在进中断时,都被赋值为 0 ,所以这个函数局部变量,加 static 或者在函数外部定义一下(变成全局变量) 再观察一下

其次,print 这个函数是耗时操作,不清楚你的这个中断发生频率以及是否产生中断嵌套(一个中断未执行完又进来同样的一个中断),中断嵌套时,会发生各种不可预期、各种神奇、各种离谱的结果

最后,建议用示波器查一下你监控脚位的脉冲次数,如果只来 10次,那去猜测 u16 上限是没有意义的
ID:736707 发表于 2020-5-14 12:26
lovezjf234 发表于 2020-5-14 10:32
你把这个函数内容贴上来GPIO_ReadInputDataBit。个人理解是验证数据总共有多少位,而i只是记录位数,所以 ...

你好,下面附上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;
}
ID:739545 发表于 2020-5-14 10:32
_q_zj 发表于 2020-5-13 17:50
在proteus仿真时,我同时也在用示波器显示GPIO_PIN_2引脚所接的方波信号。它一直在发送方波信号,这样的 ...

你把这个函数内容贴上来GPIO_ReadInputDataBit。个人理解是验证数据总共有多少位,而i只是记录位数,所以i一般用unsigned char 就够了。看来下面很多人的观点,都不在关注点上
ID:592807 发表于 2020-5-14 08:50
_q_zj 发表于 2020-5-13 20:52
下面附上u8、u16、u32定义图片:
C:\Users\home\Desktop\8I1FY}DC60RL{}AJW$L6VKT.png

给你寄两个建议  
1把i变成全局变量
2吧printf("%d",i)中的%d换成%5d
ID:592807 发表于 2020-5-14 08:35
_q_zj 发表于 2020-5-13 20:37
你好,你的回答我没有搞懂,抱歉,我还不会发图片。我在网上搜到的都说 在stm32上面u16是int类型,为什么 ...

因为你每次触发中断都会执行一次 i= 0的操作。

51hei截图20200514083247.png (23.24 KB, 下载次数: 76)

51hei截图20200514083247.png
ID:751291 发表于 2020-5-13 23:34
另外建议楼主把程序里面的u16 i;更改为static u16 i;这样每次进入到程序中不会再重新初始化数据i。
ID:751291 发表于 2020-5-13 23:31
u16的意思是无符号16位整形数,能够表示的范围是0~65535,也就是0~2^16-1。
ID:420836 发表于 2020-5-13 23:30
每次中断,i 的值都将重置为0。
ID:736707 发表于 2020-5-13 21:29
_q_zj 发表于 2020-5-13 20:52
下面附上u8、u16、u32定义图片:
C:\Users\home\Desktop\8I1FY}DC60RL{}AJW$L6VKT.png

第一次上传图片失败,请忽略这个。谢谢。
ID:736707 发表于 2020-5-13 20:52
下面附上u8、u16、u32定义图片:
C:\Users\home\Desktop\8I1FY}DC60RL{}AJW$L6VKT.png
ID:736707 发表于 2020-5-13 20:40
liuzx66 发表于 2020-5-13 19:18
u16是什么东东?不要问别人问题的时候使用非标准的定义。

您好,实际上我对u16到底是什么也不是很清楚。下面是我找到的一个网址,您可以看一下。如果您看懂了,希望您能告诉我一下。谢谢
网址:https://blog.csdn.net/xuw_xy/article/details/91868992
ID:736707 发表于 2020-5-13 20:37
黄youhui 发表于 2020-5-13 18:33
能打印出9太令人惊讶,你每次触发中断都会执行一次     u16 i = 0;还能打印出除了 0和1外的数字。

你好,你的回答我没有搞懂,抱歉,我还不会发图片。我在网上搜到的都说 在stm32上面u16是int类型,为什么不能输出0和1外的数字呢?
ID:736707 发表于 2020-5-13 20:30
权威人物 发表于 2020-5-13 18:33
是的 ,加了再试试,记得要有控制对应的外部中断IO口才会进入中断

您好,我试了一下。还是一样。串口输出9之后,还是会卡掉。不管怎么说,谢谢您。
ID:751115 发表于 2020-5-13 20:26
u16, unsigned int , 0-65535.
ID:751115 发表于 2020-5-13 20:24
i 在中断处理函数内部,是局部变量,你的问题跟 i 定义的类型无关,应该把 i 放在外面,定义成全局变量才能得到正确的结果。
ID:160500 发表于 2020-5-13 19:18
u16是什么东东?不要问别人问题的时候使用非标准的定义。
ID:592807 发表于 2020-5-13 18:33
能打印出9太令人惊讶,你每次触发中断都会执行一次     u16 i = 0;还能打印出除了 0和1外的数字。
ID:311846 发表于 2020-5-13 18:33
_q_zj 发表于 2020-5-13 17:52
您好,您的意思是指:我在变量声明前加上static来进行修饰变量吗?就是说把u16 i;改为static u16 i;是 ...

是的 ,加了再试试,记得要有控制对应的外部中断IO口才会进入中断
ID:736707 发表于 2020-5-13 17:52

您好,您的意思是指:我在变量声明前加上static来进行修饰变量吗?就是说把u16 i;改为static u16 i;是这样吗?
ID:736707 发表于 2020-5-13 17:50
lovezjf234 发表于 2020-5-13 16:24
你只是读取数据的位数,和i取什么类型没毛关系,所以即使你改成char也是同样的结果。这个数值的大小GPIO_Pi ...

在proteus仿真时,我同时也在用示波器显示GPIO_PIN_2引脚所接的方波信号。它一直在发送方波信号,这样的话,我的数值应该是一直往上加的才对,那怎么会到9就加不上去了呢?还有,您说的读取数据的位数是指什么啊?抱歉,我不太懂。您能说的明白些吗,麻烦您了。
ID:736707 发表于 2020-5-13 17:41
青桑叶 发表于 2020-5-13 16:09
你输出的是十进制数。i在函数体外面怎么定义的?别定义成char型。

我看了一下u16在stdint.h里面的定义,是unsigned short  int类型。 没错。
ID:311846 发表于 2020-5-13 16:38
static修饰
ID:739545 发表于 2020-5-13 16:24
你只是读取数据的位数,和i取什么类型没毛关系,所以即使你改成char也是同样的结果。这个数值的大小GPIO_Pin_2上发来几次下降沿低电平,和你设置i的类型没关系
ID:280512 发表于 2020-5-13 16:09
你输出的是十进制数。i在函数体外面怎么定义的?别定义成char型。
ID:736707 发表于 2020-5-13 14:56
补充:之后我把变量改成int类型,还是出现同样的问题。求助各位大佬,望不吝赐教。谢谢。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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