RT Thread stm32 spi 使用筆記

2021-10-24 15:28:05 字數 3474 閱讀 8475

環境:ubuntu scons rt-thread stm32f407vgt6 nrf24l01

1. 配置 rtconfig.h,新增如下定義。

#define rt_using_spi

#define bsp_using_spi3

2. 修改 board/cubemx_config/src/stm32f4xx_hal_msp.c,增加spi3的配置。

void hal_spi_mspinit(spi_handletypedef* hspi)

; if(hspi->instance==spi1)

if(hspi->instance==spi3)

}

3. 向spi3匯流排註冊從機裝置(除錯中發現,如果直接使用spi3作為裝置,程式執行到 rt_spi_configure()的時候會報錯)。

static int rt_hw_spi_flash_init(void)

/* 匯出到自動初始化 */

init_component_export(rt_hw_spi_flash_init);

4. 初始化spi。

uint8_t nrf24l01_bus_init(nrf24l01_t* _nrf24l01, const char* dev_name)

; _spi_bus = (struct rt_spi_device*)rt_device_find(dev_name);

if (_spi_bus == rt_null)

rt_spi_configure(_spi_bus, &cfg);

_nrf24l01->spi_bus = _spi_bus;

return 0;

}

5. 初始化nrf24l01,使用irq引腳作為外部中斷來判斷是否接收到資料。

void nrf24l01_irqhandler(void * args)

}rt_uint8_t nrf24l01_init(void)

6. main函式中初始化nrf24l01的ce,csn,irq 引腳。

static void mx_gpio_init(void)

; /* gpio ports clock enable */

__hal_rcc_gpioa_clk_enable();

__hal_rcc_gpiod_clk_enable();

// nrf24l01 csn.

gpio_initstruct.pin = gpio_pin_6;

gpio_initstruct.mode = gpio_mode_output_pp;

gpio_initstruct.pull = gpio_nopull;

gpio_initstruct.speed = gpio_speed_freq_high;

hal_gpio_init(gpioa, &gpio_initstruct);

// nrf24l01 ce,

gpio_initstruct.pin = gpio_pin_0;

hal_gpio_init(gpiod, &gpio_initstruct);

hal_gpio_writepin(gpioa,gpio_pin_6,1);

// nrf24l01 irq.

gpio_initstruct.pin = gpio_pin_0;

gpio_initstruct.mode = gpio_mode_it_falling;

gpio_initstruct.pull = gpio_nopull;

gpio_initstruct.speed = gpio_speed_freq_low;

hal_gpio_init(gpioa, &gpio_initstruct);

}

7. 用外部irq引腳中斷接收資料,觸發中斷後,傳送乙個訊號量,然後通過乙個執行緒接收資料。

void nrf24l01_receive_thread(void *parameter)

}}

main函式如下:

/*

* * spdx-license-identifier: apache-2.0

* * change logs:

* date author notes

* 2018-11-06 misonyo first version

*/#include #include #include #include #include "24l01_cmd.h"

struct rt_semaphore sem_nrf;

rt_mutex_t nrf_mutex = rt_null;

static void mx_gpio_init(void)

; /* gpio ports clock enable */

__hal_rcc_gpioa_clk_enable();

__hal_rcc_gpiod_clk_enable();

__hal_rcc_gpiob_clk_enable();

// nrf24l01 csn.

gpio_initstruct.pin = gpio_pin_6;

gpio_initstruct.mode = gpio_mode_output_pp;

gpio_initstruct.pull = gpio_nopull;

gpio_initstruct.speed = gpio_speed_freq_high;

hal_gpio_init(gpioa, &gpio_initstruct);

// nrf24l01 ce,

gpio_initstruct.pin = gpio_pin_0;

hal_gpio_init(gpiod, &gpio_initstruct);

hal_gpio_writepin(gpioa,gpio_pin_6,1);

// nrf24l01 irq.

gpio_initstruct.pin = gpio_pin_0;

gpio_initstruct.mode = gpio_mode_it_falling;

gpio_initstruct.pull = gpio_nopull;

gpio_initstruct.speed = gpio_speed_freq_low;

hal_gpio_init(gpioa, &gpio_initstruct);

}int main(void)

tid = rt_thread_create("nrf_receive", nrf24l01_receive_thread, rt_null, 512, 5, 1);

rt_thread_startup(tid);

return rt_eok;

}

ESP32 SDCard使用筆記

例程參考 examples storage sd card 修改sdkconfig中的棧空間為10240 config main task stack size 102401 4 line 這裡遮蔽line55的slot config.width,採用4 line to use 1 line sd ...

STM32值SPI的使用及SPI初始化注意事項

在stm32f10x系列晶元中,雖然所擁有的spi同步串列埠數量不相同,但是初始化的方法都是一樣的。其中使用spi時候我們回憶gpio的使用,要注意6點,我們這裡主要講解一點。根據系統對該不同功能的要求,初始化不同功能外設,初始化gpio,初始化spi同步串列埠裝置就會比較複雜。stm32f10x系...

STM32 SPI初始化和使用

序列外設介面 spi 初始化步驟 1 連線spi外設時鐘,通過rcc apb2enr設定。2 連線被復用的gpio的外設時鐘,也是通過rcc apb2enr設定 為什麼還要連線gpio時鐘,參見stm32參考手冊8.1.4節。手冊上這麼說的 對於復用輸出功能,埠必須配置成復用功能輸出模式 推挽或開漏...