找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10639|回复: 28
打印 上一主题 下一主题
收起左侧

stm32里面u16最大能是多少

  [复制链接]
跳转到指定楼层
楼主
根据我找到的资料来看,u16是两个字节十六位的short int。它最大应该可以是32767.但是在我的程序里面它到9之后就不能输出了。因为我用的proteus仿真,keil5与proteus的联调,没有做好。也没有实际的电路板去调试。所以希望各位大佬能看一下我到底是哪里出错了,给一些建议。谢谢。下附代码及仿真结果。


void EXTI2_IRQHandler(void)                                                //外部中断服务函数
{
        u16 i = 0;
        unsigned char display[80] ;

                if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==0)//PB2是否为下降沿
                {
                        i++;                }
                else
                {
                        a++;
                }

                printf("i: %d\r\n",i);
        EXTI_ClearITPendingBit(EXTI_Line2);                        //清除中断标志位
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

你好,实际上,我的i就是定义在外面的。定义在exit.c头文件声明下面的,也设置成全局变量了。只是为了上传到网上,所以才放在函数里面的。
回复

使用道具 举报

板凳
ID:736707 发表于 2020-5-13 14:56 | 只看该作者
补充:之后我把变量改成int类型,还是出现同样的问题。求助各位大佬,望不吝赐教。谢谢。
回复

使用道具 举报

地板
ID:280512 发表于 2020-5-13 16:09 | 只看该作者
你输出的是十进制数。i在函数体外面怎么定义的?别定义成char型。
回复

使用道具 举报

5#
ID:739545 发表于 2020-5-13 16:24 | 只看该作者
你只是读取数据的位数,和i取什么类型没毛关系,所以即使你改成char也是同样的结果。这个数值的大小GPIO_Pin_2上发来几次下降沿低电平,和你设置i的类型没关系
回复

使用道具 举报

6#
ID:311846 发表于 2020-5-13 16:38 | 只看该作者
static修饰
回复

使用道具 举报

7#
ID:736707 发表于 2020-5-13 17:41 | 只看该作者
青桑叶 发表于 2020-5-13 16:09
你输出的是十进制数。i在函数体外面怎么定义的?别定义成char型。

我看了一下u16在stdint.h里面的定义,是unsigned short  int类型。 没错。
回复

使用道具 举报

8#
ID:736707 发表于 2020-5-13 17:50 | 只看该作者
lovezjf234 发表于 2020-5-13 16:24
你只是读取数据的位数,和i取什么类型没毛关系,所以即使你改成char也是同样的结果。这个数值的大小GPIO_Pi ...

在proteus仿真时,我同时也在用示波器显示GPIO_PIN_2引脚所接的方波信号。它一直在发送方波信号,这样的话,我的数值应该是一直往上加的才对,那怎么会到9就加不上去了呢?还有,您说的读取数据的位数是指什么啊?抱歉,我不太懂。您能说的明白些吗,麻烦您了。
回复

使用道具 举报

9#
ID:736707 发表于 2020-5-13 17:52 | 只看该作者

您好,您的意思是指:我在变量声明前加上static来进行修饰变量吗?就是说把u16 i;改为static u16 i;是这样吗?
回复

使用道具 举报

10#
ID:311846 发表于 2020-5-13 18:33 | 只看该作者
_q_zj 发表于 2020-5-13 17:52
您好,您的意思是指:我在变量声明前加上static来进行修饰变量吗?就是说把u16 i;改为static u16 i;是 ...

是的 ,加了再试试,记得要有控制对应的外部中断IO口才会进入中断
回复

使用道具 举报

11#
ID:592807 发表于 2020-5-13 18:33 | 只看该作者
能打印出9太令人惊讶,你每次触发中断都会执行一次     u16 i = 0;还能打印出除了 0和1外的数字。
回复

使用道具 举报

12#
ID:160500 发表于 2020-5-13 19:18 | 只看该作者
u16是什么东东?不要问别人问题的时候使用非标准的定义。
回复

使用道具 举报

13#
ID:751115 发表于 2020-5-13 20:24 | 只看该作者
i 在中断处理函数内部,是局部变量,你的问题跟 i 定义的类型无关,应该把 i 放在外面,定义成全局变量才能得到正确的结果。
回复

使用道具 举报

14#
ID:751115 发表于 2020-5-13 20:26 | 只看该作者
u16, unsigned int , 0-65535.
回复

使用道具 举报

15#
ID:736707 发表于 2020-5-13 20:30 | 只看该作者
权威人物 发表于 2020-5-13 18:33
是的 ,加了再试试,记得要有控制对应的外部中断IO口才会进入中断

您好,我试了一下。还是一样。串口输出9之后,还是会卡掉。不管怎么说,谢谢您。
回复

使用道具 举报

16#
ID:736707 发表于 2020-5-13 20:37 | 只看该作者
黄youhui 发表于 2020-5-13 18:33
能打印出9太令人惊讶,你每次触发中断都会执行一次     u16 i = 0;还能打印出除了 0和1外的数字。

你好,你的回答我没有搞懂,抱歉,我还不会发图片。我在网上搜到的都说 在stm32上面u16是int类型,为什么不能输出0和1外的数字呢?
回复

使用道具 举报

17#
ID:736707 发表于 2020-5-13 20:40 | 只看该作者
liuzx66 发表于 2020-5-13 19:18
u16是什么东东?不要问别人问题的时候使用非标准的定义。

您好,实际上我对u16到底是什么也不是很清楚。下面是我找到的一个网址,您可以看一下。如果您看懂了,希望您能告诉我一下。谢谢
网址:https://blog.csdn.net/xuw_xy/article/details/91868992
回复

使用道具 举报

18#
ID:736707 发表于 2020-5-13 20:52 | 只看该作者
下面附上u8、u16、u32定义图片:
C:\Users\home\Desktop\8I1FY}DC60RL{}AJW$L6VKT.png
回复

使用道具 举报

19#
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

第一次上传图片失败,请忽略这个。谢谢。
回复

使用道具 举报

20#
ID:420836 发表于 2020-5-13 23:30 | 只看该作者
每次中断,i 的值都将重置为0。
回复

使用道具 举报

21#
ID:751291 发表于 2020-5-13 23:31 | 只看该作者
u16的意思是无符号16位整形数,能够表示的范围是0~65535,也就是0~2^16-1。
回复

使用道具 举报

22#
ID:751291 发表于 2020-5-13 23:34 | 只看该作者
另外建议楼主把程序里面的u16 i;更改为static u16 i;这样每次进入到程序中不会再重新初始化数据i。
回复

使用道具 举报

23#
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, 下载次数: 52)

51hei截图20200514083247.png
回复

使用道具 举报

24#
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
回复

使用道具 举报

25#
ID:739545 发表于 2020-5-14 10:32 | 只看该作者
_q_zj 发表于 2020-5-13 17:50
在proteus仿真时,我同时也在用示波器显示GPIO_PIN_2引脚所接的方波信号。它一直在发送方波信号,这样的 ...

你把这个函数内容贴上来GPIO_ReadInputDataBit。个人理解是验证数据总共有多少位,而i只是记录位数,所以i一般用unsigned char 就够了。看来下面很多人的观点,都不在关注点上
回复

使用道具 举报

26#
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;
}
回复

使用道具 举报

27#
ID:565305 发表于 2020-5-14 16:15 | 只看该作者
首先,你的代码中,i 每次在进中断时,都被赋值为 0 ,所以这个函数局部变量,加 static 或者在函数外部定义一下(变成全局变量) 再观察一下

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

最后,建议用示波器查一下你监控脚位的脉冲次数,如果只来 10次,那去猜测 u16 上限是没有意义的
回复

使用道具 举报

28#
ID:389856 发表于 2020-5-15 16:55 | 只看该作者
GPIO_ReadInputDataBit是对中断状态置位的函数,SET状态就进入中断。程序中的if判断i是否加1的条件,建议检查一下,是否是等于0,应该是等于SET。另外GPIO_ReadInputDataBit函数应该是在主循环中一直运行才可以
回复

使用道具 举报

29#
ID:483807 发表于 2020-5-15 21:30 | 只看该作者
你先把i设为10看看能不能输出
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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