![]() |
發布時間: 2020-5-13 14:03
正文摘要:根據我找到的資料來看,u16是兩個字節十六位的short int。它最大應該可以是32767.但是在我的程序里面它到9之后就不能輸出了。因為我用的proteus仿真,keil5與proteus的聯調,沒有做好。也沒有實際的電路板去調試。所 ... |
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類型,還是出現同樣的問題。求助各位大佬,望不吝賜教。謝謝。 |