本文介紹了利用ADXL345中斷喚醒停止模式下的STM32F103C8T6,為進一步開發(fā)計步器做準備。
從上位機串口通訊記錄了整個過程, 代碼中有關OLED顯示屏可以不接。
1. ADXL345寄存器, 有好多,為了觀察明顯,這里設置了ACTIVITY和INACTIVITY模式,都能觸發(fā)INT2:(ADXL345.c)
Single_Write_ADXL345(THRESH_ACT,0x20); //檢測活動的閾值為2g時產(chǎn)生中斷,認為是開始活動了
Single_Write_ADXL345(THRESH_INACT,0x01); //0.1875g,小于它,就認為是不活動
Single_Write_ADXL345(TIME_INACT,0x02); //不活動2秒,就認為是不活動中斷觸發(fā)
Single_Write_ADXL345(ACT_INACT_CTL,0xEE); //使能X、Y、Z三軸的Activity和Inactivity功能
Single_Write_ADXL345(INT_MAP,0x18); //00011000, Activity和Inactivity 活動都映射到INT2 Single_Write_ADXL345(INT_ENABLE,0x18); //80 DATA_READY中斷開啟, 10 Activity 08 inactivity
2. 觀察中斷是哪個活動觸發(fā)的:訪問寄存器:INT_SOURCE (main.c)
printf("\r\n INT_SOURCE: 0X30= %lX After Read\r\n", Single_Read_ADXL345(0X30)); //INT_SOURCE
讀兩遍INT_SOURCE (0X30)可以得到
INT_SOURCE: 0X30= 93 After Read 93=10010011,從右到左第1位是OVERRUN,第2位是Watermark,第5位是ACTIVITY,第8位是DATA_READY
INT_SOURCE: 0X30= 83 After Read 83=10000011,可以看到本次中斷是由ACTIVITY觸發(fā)的,其它三個標志位不用管它
3. STM32 的進入停機模式:(main.c)
鋰電池供電的情況下最好采用停機模式。(低功耗還有待機模式, 等于從頭開機運行,而行走的步數(shù)需要在喚醒后讀到, 所以不用它)。
/* 進入停止模式,設置電壓調節(jié)器為低功耗模式,等待中斷喚醒 */
PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
4. 中斷處理函數(shù):(exit.c)
EXTI0_IRQHandler可以提供給一個按鍵,喚醒顯示步數(shù)在OLED上面,包括打開顯示屏。
EXTI1_IRQHandler處理的是INT2中斷,setADXL345()函數(shù)記錄了標志位為1,供main.c 在主循環(huán)里面進行處理
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
printf("\r\n -----------------------EXTI0_IRQHandler----------------------- \r\n");
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); //清除EXTI0線路掛起位
}
}
void EXTI1_IRQHandler(void)
{
//確保是否產(chǎn)生了EXTI Line中斷
if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
{
//由于停止喚醒后使用的是HSI時鐘,與原來使用的HSE時鐘時的頻率不一致,會影響波特率,若此處直接printf會亂碼
printf("\r\n -----------------------EXTI1_IRQHandler----------------------- \r\n");
setADXL345();
//清除中斷標志位
EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);
}
}
5. 主循環(huán)里的ADXL數(shù)據(jù)讀取:(main.c)
由中斷設置的標志位在這里處理, ReadData_x(); 讀取到temp_X,temp_Y,temp_Z, 進行步數(shù)的計算。
if(getADXL345()== 1) {
reSetADXL345(); //及時讀取adxl345數(shù)據(jù)
ReadData_x(); //三軸檢測函數(shù)
printf("\r\n temp_X %lf. \r\n",temp_X );
printf("\r\n temp_Y %lf. \r\n",temp_Y );
printf("\r\n temp_Z %lf. \r\n",temp_Z );
printf("\r\n INT_SOURCE: 0X30= %lX After Read\r\n", Single_Read_ADXL345(0X30)); //INT_SOURCE
printf("\r\n INT_SOURCE: 0X30= %lX After Read\r\n", Single_Read_ADXL345(0X30)); //INT_SOURCE
CheckNum++;
if((temp_Y>450)||(temp_Y<-450)) //查看正常次數(shù)
{
Normal_num++; //正常次數(shù)++
printf("\r\n Normal_num %d \r\n",Normal_num );
}
else
{
Error_num++;//傾斜次數(shù)
printf("\r\n Error_num %d \r\n",Error_num );
}
if((Error_num!=0)&&(Normal_num!=0))//檢測到步數(shù)
{
BuShu++; //步數(shù)脈沖量++
printf("\r\n BuShu %d \r\n",BuShu );
Error_num=0; //清除一個周期檢測
Normal_num=0;
}
}
調試結果:
[14:51:28.491]收←◆
進入停止模式,A0端口按鍵或A1端口ADXL345->INT2可喚醒
[14:53:38.943]收←◆\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
[14:53:39.375]收←◆
已退出停止模式
temp_X 124.800003.
temp_Y 254155.203125.
temp_Z 9297.599609.
INT_SOURCE: 0X30= 93 After Read
INT_SOURCE: 0X30= 83 After Read
Normal_num 10
[14:53:40.591]收←◆
-----------------------EXTI1_IRQHandler-----------------------
[14:53:41.577]收←◆
temp_X 156.000000.
temp_Y 254155.203125.
temp_Z 9328.799805.
INT_SOURCE: 0X30= 8A After Read
INT_SOURCE: 0X30= 83 After Read
Normal_num 11
[14:53:43.771]收←◆
temp_X 187.199997.
temp_Y 254186.406250.
temp_Z 9328.799805.
INT_SOURCE: 0X30= 83 After Read
INT_SOURCE: 0X30= 83 After Read
Normal_num 12
[14:53:52.143]收←◆
進入停止模式,A0端口按鍵或A1端口ADXL345->INT2可喚醒
制作出來的實物圖如下:
1270671061.jpg (237.08 KB, 下載次數(shù): 42)
下載附件
2022-10-26 00:50 上傳
Keil代碼下載:
Keil程序.7z
(211.6 KB, 下載次數(shù): 46)
2022-10-26 17:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|