功率監測與控制系統DIY——搭建環境,定時器翻轉LED
1 任務目標
使用單片機定時器實現1s翻轉LED驗證開發板時鐘晶振是否正確
2 開發工具
STM32支持的開發環境很多,我現在中意下面的組合:
● STM32CubeMX圖形化配置、生成工程;
● STM32CubeCLT意法半導體退出的一體化、多操作系統支持的命令行工具,主要面向第三發集成開發環境提供商,允許他們在自己的IDE框架內集成對STM32微控制器的支持,包括代碼編譯、燒錄、調試等功能;
● CLion 一個功能強大的且智能化的C/C++開發環境,具有高效的代碼編輯、調試和項目管理能力;
● STM32CubeIDE/Keil MDK/IAR曾經非常流行的STM32開發環境,這里不做介紹;
分別安裝STM32CubeMX/STM32CubeCLT以及CLion,然后再Clion 中新建STM32CubeMX 工程。
在CLion 中第一次新建STM32CubeMX,還需要配置STM32CubeMX和STM32CubeCLT工具路徑,下圖中(2)出點擊“編輯”分別選擇對應的路徑即可。
● 下圖在SDK目錄中新建一個工程;
● STM32CubeMX和STM32CubeCLT工具檢測OK;
● 啟動STM32CubeMX配置工程,導出CMake工程即可
● 然后CLion打開剛才生成的工程目錄即可,自動加載CMakeLists.txt并配置工程
第一次打開CMakeLists.txt工程,彈出下面的配置對話框,一般選擇Debug類型即可
3 ST-Link固件升級
第一次調試工程,彈出ST-Link固件升級提示,按照下面的提示操作,升級固件通過。
點擊右下角的YES開始升級固件
固件升級成功
升級后固件版本號變了
4 用戶LED
LED是指用戶LED,即板子上的綠色LD2,對應PA5,原理圖如下:
4.1 定時器
這里使用定時器1,配置如下:
● 時鐘源,選擇Internal Clock(TIM1 位于APB2 Timer Clock)
● 預分頻為1000-1
● 向上計數模式
● 計數周期10000-1
4.2 為什么這么設置預分頻和計數周期呢?
因為參考手冊中STM32F411xx的TIM1位于APB2 Timer clock 上,見下圖。而且在時鐘樹中把APB2 Timer Clock 設置為100 MHz。
所以預分頻1000-1把TIM1時鐘頻率配置為100MHz/1000=100kHz
計數周期10000-1即0.1秒鐘產生中斷。【要實現1 秒鐘翻轉LED,需要計數10 次】
最后使能TIM1的中斷,中斷類型是TIM1 update interrupt and TIM10 global interrupt,表示定時器溢出產生中斷。
5 流程
● 主流程中初始化硬件(GPIO、UART2、TIM1)然后已開啟中斷的方式啟動TIM1
● 在TIM1的溢出中斷服務函數中層層調用到HAL_TIM_PeriodElapsedCallback() 函數,計數10 次達到1 秒鐘,翻轉用戶LD2
6 關鍵代碼
6.1 主函數
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_TIM1_Init(); // 配置定時器TIM1
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim1);//啟動定時器TIM1
/*USER CODE END 2 */
/*Infinite loop */
/*USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(200);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
6.2 TIM1定時溢出回調函數
tim.c中新增加一個函數,定時器溢出回調函數HAL_TIM_PeriodElapsedCallback()中實現1秒鐘翻轉LED2
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == htim1.Instance)//確保是特定的定時器實例(例如TIM1、TIM2 等)
{
tim_elapsed_cnt++;
if (tim_elapsed_cnt % 10 == 0)
{
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}
}
}
7 實測演示
7.1 LD2閃爍
板子中心的綠色LD 每隔一秒鐘點亮、熄滅一次。
(本文來源于《EEPW》202507)
評論