官方文檔很坑,新舊不分開,文檔缺失/分類很亂
有些文檔在IDE RT-STUDIO文檔裏,有些在RTThread標準版文檔裏,逆天
坑:不支持STM32CUBEMX的Advanced工程,記得重新保存生成basic工程才能用。不能使用.c/.h分離。
坑:適配CUBEMX工程的腳本要自己寫
driver/stm32f1xx_hal_conf_bak.h
不一定會生成或替換。
cubemx/下的
- Src/main.c: main()建議使用編譯器的__WEAK宏修飾
- Inc/main.h: 註釋掉
void Error_Handler(void);
的聲明
寫好cubemx的rtt導入腳本,命名並放置爲 <工程工作目錄>/cubemx/SConscript
import os
from building import *
cwd = GetCurrentDir()
src = Glob('Src/*.c')
# add cubemx drivers
src = Split('''
Src/stm32f1xx_hal_msp.c
Src/main.c
''')
path = [cwd]
path += [cwd + '/Inc']
group = DefineGroup('cubemx', src, depend = [''], CPPPATH = path)
Return('group')
SPI總線驅動/IDE文檔裏的:
基於 RT-Thread Studio 的 SPI 驅動開發文檔
SPI從設備驅動/RTT標準版文檔裏的:
坑,官方文檔裏 掛載從設備那篇不見了....
掛載 SPI 設備
SPI代碼片段
絕大部分開關都在 board.h 裏面,請按照官方說明或者頭文件裏的註釋打開 宏聲明 以開啓功能
初始化SPI從設備
設備註冊函數-掛載從設備DEV_DEVNAME到總線DEV_SPIBUS上(rtthread 4.x)
#define DEV_SPIBUS "spi2"
#define DEV_DEVNAME "spi20"//代表spi2下面的第0個設備
static int rt_hw_spi_yourdev_init()
{
rt_err_t err;
spi_dev = (struct rt_spi_device *) rt_malloc(sizeof(struct rt_spi_device));
if (RT_NULL == spi_dev_)
{
rt_kprintf("Failed to malloc the spi device.");
return -RT_ENOMEM;
}
err = rt_hw_spi_device_attach(DEV_SPIBUS, DEV_DEVNAME, GPIOC, GPIO_PIN_4);
if (RT_EOK != err)
{
rt_kprintf("Failed to attach the spi device: ERRCODE=%d", err);
return -RT_ERROR;
}
return RT_EOK;
}
/* 導出到自動初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi__init);
連接SPI從設備
spi_dev = (struct rt_spi_device *) rt_device_find(name);
if (!spi_dev)
{
rt_kprintf("[SPI] init run failed! can't find %s device!\n", name);
return;
}
else
{
rt_spi_configure(spi_dev, &cfg);
}
還可以用 INIT_APP_EXPORT 宏將上面連接SPI從設備的函數加入到RTT應用自啓
但注意不能是INIT_COMPONENT_EXPORT組件自動初始化,因爲這時候所需要的部分成員還沒初始化呢。
SPI發送
//僅發送
rt_spi_send(spi_dev, str, strcnt);
//發送後接收n個字節
rt_err_t err = rt_spi_send_then_recv(spi_dev, str, strcnt, recv_buf, n);
注:如果接收到的都是 0xFF,則說明設備沒工作,甚至沒上電。
由於SPI有四種採樣模式,如果採樣模式配置錯了,那麼採樣點不對會導致數據錯解。這個是因爲SPI沒有容錯機制,主從採樣並沒有協商或者通信機制導致的。
關於GIT
RT-Thread Studio是基於Eclipse開發的,對GIT的支持非常垃圾。
建議GIT管理和代碼編寫跳轉查看都用VSCode。代碼聯想和跳轉都只需要配好VSCode插件即可,這裏不再贅述。