1. 程式人生 > >嵌入式應用程式設計經驗之談-引腳複用

嵌入式應用程式設計經驗之談-引腳複用

     目標晶片:STM32F101R6

     這裡談到關於STM32F1系列的晶片的IO口的使用,想必每個朋友在學習這款晶片的時候,第一件事情就是學習怎麼控制晶片的IO口去點亮LED燈。這裡我要談到的不是各種IO口的模式的配置,而是有關於其引腳複用的問題。

    問題發現:這裡我在專案中需要檢測幾個IO口,配置成輸入模式並且檢測其IO口的輸入狀態。但是發現無論外部條件怎麼變化,讀到的IO口的值出現與外部條件不對應的狀態。下面給出我的IO口配置程式碼。

        GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
        //PA15
	GPIO_InitStructure.GPIO_Pin = DIP_SW1_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(DIP_SW1_PORT, &GPIO_InitStructure);
        //PB3
	GPIO_InitStructure.GPIO_Pin = DIP_SW2_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(DIP_SW2_PORT, &GPIO_InitStructure);
	//PA14
	GPIO_InitStructure.GPIO_Pin = DIP_SW3_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(DIP_SW3_PORT, &GPIO_InitStructure);
	//PA13
	GPIO_InitStructure.GPIO_Pin = DIP_SW4_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(DIP_SW4_PORT, &GPIO_InitStructure);
  問題解決:這裡我反覆的去檢查和檢視自己讀取IO口的邏輯程式碼,並沒有發現問題,這裡配置更是感覺沒有任何問題。對於IO口的使用自己也是經常配置,自己也沒想到問題便是處在IO配置上。在配置程式碼中增加這句話問題便得到解決。
        // 關閉JTAG,JTAG口用作普通IO口
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

  問題總結:這裡我們需要注意STM32並不是所有的IO口預設狀態都是作為普通IO口使用。這裡這個專案的主控PA13、PA14預設情況下是用於JTMS、JTCK埠使用,這裡我們需要作為普通的IO口便需要把這兩個的腳的複用功能開啟。上面的程式碼便是關閉SWJ功能,使得IO口作為普通IO口。這裡大家在使用一款晶片的同時需要對其IO口的功能有一個全面的瞭解,才不會犯這樣的錯誤。