說明:驅動基於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...