環境: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節。手冊上這麼說的 對於復用輸出功能,埠必須配置成復用功能輸出模式 推挽或開漏...