在RT-Thread中使用SPI和UART设备

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通信,也可以参考。

你可能感兴趣的:(在RT-Thread中使用SPI和UART设备)