STM32G031K LL庫的使用 SPI

2021-10-04 09:46:04 字數 4018 閱讀 5899

說明:驅動基於stm32g031k6測試,其他型號需自行做改動。

spi在開始配置的時候遇到些問題,這裡也記錄下,我這邊用的是spi2,其他spi也可以參考

spi2 初始化:

void stm32llspi2init(void)

; ll_gpio_inittypedef gpio_initstruct = ;

ll_apb1_grp1_enableclock(ll_apb1_grp1_periph_spi2); //使能外設時鐘

ll_iop_grp1_enableclock(ll_iop_grp1_periph_gpiob); //gpio時鐘使能

/**spi2 gpio configuration

pb6 ------> spi2_miso

pb7 ------> spi2_mosi

pb8 ------> spi2_sck

*/gpio_initstruct.pin = gpiospi2_miso_pin; //misopin指定

gpio_initstruct.mode = ll_gpio_mode_alternate; //io模式配置為復用功能

gpio_initstruct.speed = ll_gpio_speed_freq_high; //設定為高速率

gpio_initstruct.outputtype = ll_gpio_output_pushpull; //設定pin為輸出模式

gpio_initstruct.pull = ll_gpio_pull_no; //輸入口設定不帶上拉

gpio_initstruct.alternate = ll_gpio_af_4; //當前晶元pb6復用功能af4為spi2的miso,其他晶元的配置參考相應的晶元手冊

ll_gpio_init(gpiob, &gpio_initstruct);

gpio_initstruct.pin = gpiospi2_mosi_pin; //mosipin指定

gpio_initstruct.mode = ll_gpio_mode_alternate; //

gpio_initstruct.speed = ll_gpio_speed_freq_high; //

gpio_initstruct.outputtype = ll_gpio_output_pushpull; //

gpio_initstruct.pull = ll_gpio_pull_down; //輸出口配置為下拉

gpio_initstruct.alternate = ll_gpio_af_1; //io 功能選擇

ll_gpio_init(gpiob, &gpio_initstruct);

gpio_initstruct.pin = gpiospi2_sck_pin;

gpio_initstruct.mode = ll_gpio_mode_alternate;

gpio_initstruct.speed = ll_gpio_speed_freq_high;

gpio_initstruct.outputtype = ll_gpio_output_pushpull;

gpio_initstruct.pull = ll_gpio_pull_down; //輸出口配置為下拉

gpio_initstruct.alternate = ll_gpio_af_1; //io 功能選擇

ll_gpio_init(gpiob, &gpio_initstruct);

/* spi2 interrupt init */ //因為spi需要進行不同裝置資料讀取,所以這裡不使用中斷模式會更方便

//nvic_setpriority(spi2_irqn, 0);

//nvic_enableirq(spi2_irqn);

spi_initstruct.transferdirection = ll_spi_full_duplex; //spi功能選擇全雙工

spi_initstruct.mode = ll_spi_mode_master; //spi主裝置模式

spi_initstruct.datawidth = ll_spi_datawidth_8bit; //資料寬度8位

spi_initstruct.clockpolarity = ll_spi_polarity_high; //clk空閒時狀態為高 根據使用的從裝置進行配置

spi_initstruct.clockphase = ll_spi_phase_2edge; //在第二次時鐘跳變開始傳送資料

spi_initstruct.nss = ll_spi_nss_soft; //片選方式為軟體設定

spi_initstruct.baudrate = ll_spi_baudrateprescaler_div2; //時鐘波特率設定

spi_initstruct.bitorder = ll_spi_msb_first; //位元組傳輸方式,從高位開始

spi_initstruct.crccalculation = ll_spi_crccalculation_disable;//不開啟crc校驗

spi_initstruct.crcpoly = 7; //crc多項式

ll_spi_init(spi2, &spi_initstruct);

ll_spi_setstandard(spi2, ll_spi_protocol_motorola); //使用的spi協議,可選mt和ti的

ll_spi_enablensspulsemgt(spi2); //僅做主裝置時可用

/* configure the spi2 fifo threshold */

ll_spi_setrxfifothreshold(spi2, ll_spi_rx_fifo_th_quarter);//設定rx非空事件產生的fifo閾值,根據通訊時最小資料的大小設定,我這邊最小為8位,所以設定為四分之一

ll_spi_enable(spi2); //最後不要忘記使能spi2,也可以在其他初始化完了之後的地方使能,為了防止忘記,這裡先使能了

}

我個人在配置的時候,就是因為gpio_initstruct.alternate 都設定的預設的af0,導致一直通訊不成功,曾一度懷疑是硬體問題。這裡也提醒大家一下。

spi資料收發:

//通過spi在從裝置內讀寫乙個位元組的資料,spi特性,在mosi寫資料的時候miso會獲得應答資料

uint8_t stm32llspi2wrbyte(uint8_t byte) //因為採用的非中斷方式,所以資料直接獲取

ll_spi_transmitdata8(spi2, byte); //傳送8位資料

wait_cnt = 0;

while(!ll_spi_isactiveflag_rxne(spi2)) //等待接收快取非空

return ll_spi_receivedata8(spi2); //返回spi2接收到的資料

}

spi的讀寫多個位元組的操作,都可以通過迴圈呼叫讀寫乙個位元組的函式去實現,這裡不做說明。

STM32G031無線溫濕度儀開源專案 1,任務

本專案mcu使用stm32g031c8t6,微控制器讀取溫濕度資料後 aht10 通過zigbee模組 drf1609h 無線傳送給電腦,由於zigbee組網的特性,每個點可以作為其它點的自動中繼。獲取溫濕度資料可以通過以下三種方式 1,modbus指令,下發modbus讀取指令,輪詢溫濕度資料 2...

STM32庫的理解

1 條件編譯的作用是避免重複包含 2 暫存器說白了就是記憶體,對暫存器的操作就是對記憶體的操作 3 51微控制器對暫存器是直接操作的,而stm32則是間接操作,如下圖 明白了以上三點,我們就可以來揭開庫的那層神秘的面紗了 因為我們對暫存器的操作,即對記憶體的操作,是間接的。是通過庫函式來實現的,也就...

STM32中斷的使能

lib v3.0.0 的標頭檔案misc.c的void nvic init nvic inittypedef nvic initstruct 說 enable the selected irq channels nvic iser nvic initstruct nvic irqchannel 0x...