RT-Thread采用了类似于linux的函数调用方法,这里说明一下如何简单的使用设备。
- 硬件环境 :STM32F103RBT6
用户程序位置
用户程序在bsp文件夹下面的applications中的applications.c中书写和调用,如果程序比较多,再新建一个c文件分离出去。
SPI 驱动文件
stm32f10x下面的drivers并没有spi驱动,我们需要将stm32f107对应的spi驱动移植过来。将rt_stm32f10x_spi.c,rt_stm32f10x_spi.h,以及platform.c文件复制过去,然后在rt_init_thread_entry函数中添加rt_platform_init();的调用,在对应文件中加入头文件。然后修改SConscript添加对platform.c,rt_stm32f10x_spi.c的编译,并在config中添加RT_USING_SPI和RT_USING_SPI1的宏定义
在platform.c中spi初始化加入如下代码,配置频率
/* config spi */
{
struct rt_spi_configuration cfg;
cfg.data_width = 8;
cfg.mode = RT_SPI_MODE_3 | RT_SPI_MSB; /* SPI Compatible Modes 3 and SPI_FirstBit_MSB in lis302dl datasheet */
//APB2=168M/2=84M, SPI1 = 84/2,4,8,16,32 = 42M, 21M, 10.5M, 5.25M, 2.625M ...
cfg.max_hz = 2625000; /* SPI_BaudRatePrescaler_16=84000000/16=5.25MHz. The max_hz of lis302dl is 10MHz in datasheet */
rt_spi_configure(&spi_device, &cfg);
} /* config spi */
硬件配置
硬件管脚被配置在platform.c文件中, 我们不修改默认的配置,也就是 PA4567这几个管脚为默认的spi输入输出管脚
/*
* SPI1_MOSI: PA7
* SPI1_MISO: PA6
* SPI1_SCK : PA5
*
* CS0: PA4 SD card. 这里可以改成自己的spi设备的cs管脚
*/
SPI调用
SPI调用不用使用open函数,只需执行
rt_spi_transfer(spi_device, &ReadAddr, &pBuffer, 1);
或者rt_spi_send_then_recv也可以实现不同的效果。
UART调用
UART调用需要使用open函数,这里给出一个简单的例子使用串口设备。
void device_thread_entry(void* parameter)
{
rt_device_t device;
device = rt_device_find("uart2");
rt_device_open(device, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
char test[10] = "abc";
while(1){
rt_size_t reclen = rt_device_read(device, 0, test, 10);
if(reclen > 0) rt_device_write(device, 0, test, reclen);
rt_thread_delay(500);
}
}
可以开启这个线程,我们在uart2中输入10个以内的字符,在5秒后就会回显。如果超过10个字符,应该会在下一次5秒显示。
在官方markdown文档中,使用了消息机制来处理UART通信,也可以参考。