# <center>ROS和STM32通訊 Ⅱ</center> ###### <center>rosserial搭配STM中斷功能</center> <!--### **<u>前情提要</u>** 我來自清大機器人團隊DIT Robotics,目前大二。在Eurobot2022歐洲自動化機器人比賽中,其中負責的項目之一是處理ROS和STM32的通訊。--> --- ### **<u>前情提要</u>** 之前寫過一篇文章,介紹如何使用rosserial讓ROS和STM32能夠成功通訊,可以點下面連結前往閱讀。今天要介紹如何使用中斷功能,實作出以固定頻率發佈訊息。</br> 上一篇:[ROS和STM32通訊 Ⅰ - rosserial實作](https://hackmd.io/@JINGCCC/rosserial_1) --- ### **<u>中斷功能簡介</u>** STM32提供多種中斷功能,我們這裡使用的是TIM中斷。利用Timer內部時鐘計數,當計數器達到我們設定的值,進入中斷函式。我們可以利用Timer的這個功能,控制進中斷函式的頻率,並在函式中發佈訊息。 --- ### **<u>開始實作</u>** 1. 首先開啟STM專案,並打開ioc檔。 2. 開啟一個TIMER。我選擇TIM4,頻率設定為100Hz。 ● clock source:internal clock ● NVIC setting:勾選TIM4 global interrupt ● parameter setting:prescaler=13,counter period=60000 :::info **parameter setting 設定** 原則:prescaler盡量小,counter period盡量大。 公式:得出的結果即為進中斷函式的頻率 <div style="text-align: center"> <img src="https://i.imgur.com/Ss8LpEV.png"/> </div> <font color=red>※注意:counter period有最大值限制</font>。</br> ※84X$10^6$由clock configuration裡這兩個數字決定,可以去查datasheet確定使用的Timer屬於APB1或APB2,我們將這裡設定成一樣就不需要每次都去查詢。 <div style="text-align: center"> <img src="https://i.imgur.com/UP3Ty9b.png"/> </div> ::: 3. 開啟TIM中斷及啟動Timer ```c= int main(void){ ... MX_TIM4_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim4); //需放在TIM_init的後面 /* USER CODE END 2 */ ... ``` 4. TIM中斷函式 ```c= void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //如果有多個Timer,可以透過判斷式決定要執行的程式 if (htim->Instance == htim4.Instance) { check++; //宣告一全域變數,確定中斷是否執行成功 /*code*/ //在這裡寫puber.publish(),可以控制發佈訊息頻率為100Hz } } ``` 5. 利用現場表達式查看變數check是否持續增加。 (現場表達式開啟:Windows -> Show View -> 現場表達式) <div style="text-align: center"> <img src="https://i.imgur.com/UXoQfzz.png"/> </div> 如果Timer沒有成功啟動,查看htim的instance會是0x0。 6. 恭喜,可以開始應用STM中斷功能在rosserial上了! --- 下一篇:[ROS和STM32通訊 Ⅲ - rosserial改良](https://hackmd.io/@JINGCCC/rosserial_3) --- <h5 style="text-align:right">寫於2022/1/30</h5>