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初始化遮蔽掉即可,具體原因有空再去了解吧~~~~。