一、硬體準備
1. STM32F103C6T6A + STLink 模擬器
2. LED 1 只
3. 杜邦線母對母 2 條,公對母 2 條
4. 麵包板 1 塊
二、線路連線
1. STM32核心板 PA1、PA2 接公對母杜邦線 2 條,末端公頭懸空,等待插入麵包板孔檢測通斷。
2. LED 接母對母杜邦線 2 條,正極接 PA3,負極接 GND。
三、埠配置
1. PA2、PA3 設定為 GPIO_Output
2. PA1 設定為 GPIO_Input
四、程式碼編寫
1. 改寫 GPIO 初始化函式:
1 static void MX_GPIO_Init(void) 2 { 3 GPIO_InitTypeDef GPIO_InitStruct = {0}; 4 /* USER CODE BEGIN MX_GPIO_Init_1 */ 5 /* USER CODE END MX_GPIO_Init_1 */ 6 7 /* GPIO Ports Clock Enable */ 8 __HAL_RCC_GPIOA_CLK_ENABLE(); 9 10 /*Configure GPIO pin Output Level */ 11 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); 12 13 /*Configure GPIO pins : PA2 PA3 */ 14 GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; 15 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 16 GPIO_InitStruct.Pull = GPIO_NOPULL; 17 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 18 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 19 20 /*Configure GPIO pin : PA1 */ 21 GPIO_InitStruct.Pin = GPIO_PIN_1; 22 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 23 GPIO_InitStruct.Pull = GPIO_PULLDOWN; 24 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 25 26 /* USER CODE BEGIN MX_GPIO_Init_2 */ 27 /* USER CODE END MX_GPIO_Init_2 */ 28 }
改寫的程式碼只有第 23 行,電平設為低,也就是接受高電平輸入。
2. main 初始化部分加入 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); 使 PA2 輸出高電平用以通斷檢測。
3. main 迴圈部分:
1 if(GPIO_PIN_SET == HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)) 2 { 3 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); 4 } 5 else 6 { 7 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); 8 }
意思是檢測 PA1 的輸入,如果為高電平則控制 PA3 接 LED 燈亮,否則燈滅(通亮斷滅)。
五、測試執行
燒寫程式碼後,將 PA1 PA2 連線的杜邦線末端公頭分別插入麵包板的兩個孔,若 LED 燈亮,則表示兩孔連通,否則為斷開。
如此便實現了通斷檢測的功能。