1. 程式人生 > >STM32 PA6引腳輸出低電平不正常的問題

STM32 PA6引腳輸出低電平不正常的問題

使用環境(藍色粗體字為特別注意內容)

1、軟體環境:Keil uv5.15

2、硬體環境:STM32F103C8T6 最小系統

在一個專案中需要用到STM32 的PA6引腳,發現工作異常。由於是自己做的最小系統,所以檢查了晶片引腳,並沒有發現虛焊、或者跟其他引腳連在一起的情況,初步判斷是微控制器或者程式的問題,硬體電路應該沒有問題,硬體電路如下所示。

 手工做的板子,電路還在除錯,還沒來得及清潔,所以有點髒。拿出示波器觀察波形輸出

從示波器可以看出,PA6引腳輸出低電平無法到0v,而是2.1v左右。檢視引腳初始化程式碼如下

void gpioInit()
{
	GPIO_InitTypeDef g;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	g.GPIO_Pin = GPIO_Pin_6;
	g.GPIO_Speed = GPIO_Speed_50MHz;
	g.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
	GPIO_Init(GPIOA, &g);
}

main函式如下

void main()
{
	(省略一些初始化工作)
	while(1)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_6);
		delay_ms(200);
		GPIO_ResetBits(GPIOA, GPIO_Pin_6);
		delay_ms(200);
	}
}

整個過程沒有發現什麼異常的地方,突然想到之前有個demo是正常的,經排查,發現初始化程式碼寫成如下的形式(即將GPIO_Pin_6改為GPIO_Pin_All)就能夠正常輸出

void gpioInit()
{
	GPIO_InitTypeDef g;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	g.GPIO_Pin = GPIO_Pin_All;
	g.GPIO_Speed = GPIO_Speed_50MHz;
	g.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
	GPIO_Init(GPIOA, &g);
}

輸出波形如下:

很納悶,為什麼將GPIOA引腳初始化為GPIO_Pin_6工作異常,而初始化為GPIO_Pin_All就正常呢?繼續排查,發現問題竟然是出現在SPI初始化函式中!將標紅的語句註釋掉即可

 SPI_InitStructure.SPI_CPOL =SPI_CPOL_High ; //始終懸空高  // SPI_CPOL_Low//始終懸空低 
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第2個時鐘沿捕獲 //SPI_CPHA_1Edge第1個時鐘沿捕獲 
  // SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;     //硬體控制NSS訊號(ss) 置成軟體時,NSS腳可以他用 

檢視資料手冊可以發現PA6引腳跟SPI通訊相關,可能是操作PA6引腳的時候跟SPI衝突所致,正好專案中沒有用到SPI通訊,所以將SPI初始化遮蔽掉即可,具體原因有空再去了解吧~~~~。