欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13475|回復: 28
收起左側

stm32里面u16最大能是多少

  [復制鏈接]
ID:736707 發表于 2020-5-13 14:03 | 顯示全部樓層 |閱讀模式
根據我找到的資料來看,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);                        //清除中斷標志位
}
回復

使用道具 舉報

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型。
回復

使用道具 舉報

ID:739545 發表于 2020-5-13 16:24 | 顯示全部樓層
你只是讀取數據的位數,和i取什么類型沒毛關系,所以即使你改成char也是同樣的結果。這個數值的大小GPIO_Pin_2上發來幾次下降沿低電平,和你設置i的類型沒關系
回復

使用道具 舉報

ID:311846 發表于 2020-5-13 16:38 | 顯示全部樓層
static修飾
回復

使用道具 舉報

ID:736707 發表于 2020-5-13 17:41 | 顯示全部樓層
青桑葉 發表于 2020-5-13 16:09
你輸出的是十進制數。i在函數體外面怎么定義的?別定義成char型。

我看了一下u16在stdint.h里面的定義,是unsigned short  int類型。 沒錯。
回復

使用道具 舉報

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:52 | 顯示全部樓層

您好,您的意思是指:我在變量聲明前加上static來進行修飾變量嗎?就是說把u16 i;改為static u16 i;是這樣嗎?
回復

使用道具 舉報

ID:311846 發表于 2020-5-13 18:33 | 顯示全部樓層
_q_zj 發表于 2020-5-13 17:52
您好,您的意思是指:我在變量聲明前加上static來進行修飾變量嗎?就是說把u16 i;改為static u16 i;是 ...

是的 ,加了再試試,記得要有控制對應的外部中斷IO口才會進入中斷
回復

使用道具 舉報

ID:592807 發表于 2020-5-13 18:33 | 顯示全部樓層
能打印出9太令人驚訝,你每次觸發中斷都會執行一次     u16 i = 0;還能打印出除了 0和1外的數字。
回復

使用道具 舉報

ID:160500 發表于 2020-5-13 19:18 | 顯示全部樓層
u16是什么東東?不要問別人問題的時候使用非標準的定義。
回復

使用道具 舉報

ID:751115 發表于 2020-5-13 20:24 | 顯示全部樓層
i 在中斷處理函數內部,是局部變量,你的問題跟 i 定義的類型無關,應該把 i 放在外面,定義成全局變量才能得到正確的結果。
回復

使用道具 舉報

ID:751115 發表于 2020-5-13 20:26 | 顯示全部樓層
u16, unsigned int , 0-65535.
回復

使用道具 舉報

ID:736707 發表于 2020-5-13 20:30 | 顯示全部樓層
權威人物 發表于 2020-5-13 18:33
是的 ,加了再試試,記得要有控制對應的外部中斷IO口才會進入中斷

您好,我試了一下。還是一樣。串口輸出9之后,還是會卡掉。不管怎么說,謝謝您。
回復

使用道具 舉報

ID:736707 發表于 2020-5-13 20:37 | 顯示全部樓層
黃youhui 發表于 2020-5-13 18:33
能打印出9太令人驚訝,你每次觸發中斷都會執行一次     u16 i = 0;還能打印出除了 0和1外的數字。

你好,你的回答我沒有搞懂,抱歉,我還不會發圖片。我在網上搜到的都說 在stm32上面u16是int類型,為什么不能輸出0和1外的數字呢?
回復

使用道具 舉報

16#
無效樓層,該帖已經被刪除
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:52 | 顯示全部樓層
下面附上u8、u16、u32定義圖片:
C:\Users\home\Desktop\8I1FY}DC60RL{}AJW$L6VKT.png
回復

使用道具 舉報

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:420836 發表于 2020-5-13 23:30 | 顯示全部樓層
每次中斷,i 的值都將重置為0。
回復

使用道具 舉報

ID:751291 發表于 2020-5-13 23:31 | 顯示全部樓層
u16的意思是無符號16位整形數,能夠表示的范圍是0~65535,也就是0~2^16-1。
回復

使用道具 舉報

ID:751291 發表于 2020-5-13 23:34 | 顯示全部樓層
另外建議樓主把程序里面的u16 i;更改為static u16 i;這樣每次進入到程序中不會再重新初始化數據i。
回復

使用道具 舉報

ID:592807 發表于 2020-5-14 08:35 | 顯示全部樓層
_q_zj 發表于 2020-5-13 20:37
你好,你的回答我沒有搞懂,抱歉,我還不會發圖片。我在網上搜到的都說 在stm32上面u16是int類型,為什么 ...

因為你每次觸發中斷都會執行一次 i= 0的操作。
51hei截圖20200514083247.png
回復

使用道具 舉報

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:739545 發表于 2020-5-14 10:32 | 顯示全部樓層
_q_zj 發表于 2020-5-13 17:50
在proteus仿真時,我同時也在用示波器顯示GPIO_PIN_2引腳所接的方波信號。它一直在發送方波信號,這樣的 ...

你把這個函數內容貼上來GPIO_ReadInputDataBit。個人理解是驗證數據總共有多少位,而i只是記錄位數,所以i一般用unsigned char 就夠了。看來下面很多人的觀點,都不在關注點上
回復

使用道具 舉報

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:565305 發表于 2020-5-14 16:15 | 顯示全部樓層
首先,你的代碼中,i 每次在進中斷時,都被賦值為 0 ,所以這個函數局部變量,加 static 或者在函數外部定義一下(變成全局變量) 再觀察一下

其次,print 這個函數是耗時操作,不清楚你的這個中斷發生頻率以及是否產生中斷嵌套(一個中斷未執行完又進來同樣的一個中斷),中斷嵌套時,會發生各種不可預期、各種神奇、各種離譜的結果

最后,建議用示波器查一下你監控腳位的脈沖次數,如果只來 10次,那去猜測 u16 上限是沒有意義的
回復

使用道具 舉報

ID:389856 發表于 2020-5-15 16:55 | 顯示全部樓層
GPIO_ReadInputDataBit是對中斷狀態置位的函數,SET狀態就進入中斷。程序中的if判斷i是否加1的條件,建議檢查一下,是否是等于0,應該是等于SET。另外GPIO_ReadInputDataBit函數應該是在主循環中一直運行才可以
回復

使用道具 舉報

ID:483807 發表于 2020-5-15 21:30 | 顯示全部樓層
你先把i設為10看看能不能輸出
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表