使用STM32F030C8T6的SPI1介面

可以看到SPI1的使用是PA4/PA5/PA6/PA7的復用功能,于是代碼如下:
void SPI1_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //中速
GPIO_InitStructure.GPIO_Pin = PIN_SPI1_SCK | PIN_SPI1_MOSI | PIN_SPI1_MISO;
GPIO_Init(SPI1_PORT, &GPIO_InitStructure);
GPIO_PinAFConfig(SPI1_PORT, GPIO_PinSource5, GPIO_AF_0);
GPIO_PinAFConfig(SPI1_PORT, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(SPI1_PORT, GPIO_PinSource7, GPIO_AF_0);
GPIO_InitStructure.GPIO_Pin = PIN_SPI1_CSN; //配置 CSN
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //高速
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_Init(SPI1_PORT, &GPIO_InitStructure);
SPI_I2S_DeInit(SPI1); //將暫存器重設為預設值
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //雙線雙向全雙工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主機模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8 位幀結構
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //通信空閑時 SCK 為低電平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一個時鐘沿捕獲
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //軟體控制 NSS
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //SPI 速度 8 分頻
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //資料傳輸從 MSB 開始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 校驗
SPI_Init(SPI1, &SPI_InitStructure);
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF); //重要,把應答資料位設定為 8 位
SPI_Cmd(SPI1, ENABLE);
}
上面代碼使用引腳功能映射函式:
GPIO_PinAFConfig(SPI1_PORT, GPIO_PinSource5, GPIO_AF_0);
GPIO_PinAFConfig(SPI1_PORT, GPIO_PinSource6, GPIO_AF_0);
GPIO_PinAFConfig(SPI1_PORT, GPIO_PinSource7, GPIO_AF_0);
問題:不使用上述映射函式,SPI也能正常作業,請問GPIO_PinAFConfig函式是必須使用的嗎?
uj5u.com熱心網友回復:
GPIO_PinAFConfig是庫函式,其本質是對這幾個PIN的暫存器進行初始化設定,如果不對暫存器初始化的話(這樣這幾個PIN就會處于默認狀態),一般是不會能使用SPI的。如果你的程式沒有使用庫函式,但是單獨對暫存器進行了設定(前提是正確的配置),則和使用了庫函式效果是一樣的。PS:庫函式的本質就是設定暫存器,如果直接對暫存器操作,MCU的堆疊開銷是顯著小于使用庫函式的,缺點就是修改或移植的時候會有更大的作業量。
uj5u.com熱心網友回復:
GPIO_AF_0 A埠的功能0, 功能0一般是上電后的默認功能但是建議保留映射函式, 這樣換埠、查問題的時候不容易遺漏
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/135640.html
標籤:單片機/工控
