<RT-Thread>I/O设备的使用

rt-thread 的设备框架模型如下所示:
在这里插入图片描述
在一个已经自动配置好底层驱动的工程中(包括设备的驱动,设备的注册等,推荐使用
【RT-Studio】),我们仅需要在rtconfig.h的头文件里添加所需要开启的宏,即可完成设备注册。

在这里插入图片描述
在生成的工程中, ②是①更底层的封装,①作用是根据设置的宏定义批量初始化并注册设备,②作用是做好底层驱动,如getc(), putc()等等。
在这里插入图片描述
因此假如你不想深究其中的过程的话,那么你可以根据如下示例使用设备:

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <drv_ext_io.h>

#define DBG_TAG "MAIN"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#define LED_B_PIN GET_PIN(B, 7)

int main(void)
{
    int count = 1;
    rt_pin_mode(LED_B_PIN, PIN_MODE_OUTPUT);
	LOG_D("test..");
	rt_device_t uart3;
	uart3 = rt_device_find("uart3");
	if(uart3 != RT_NULL)
	{
		rt_device_open(uart3, RT_DEVICE_OFLAG_RDWR);
		rt_device_open(uart3, RT_DEVICE_OFLAG_RDWR);
		LOG_D("device opened!");
	}

    while (count++)
    {
		rt_pin_write(LED_B_PIN, PIN_HIGH);
		rt_thread_mdelay(200);
		rt_pin_write(LED_B_PIN, PIN_LOW);
		rt_thread_mdelay(200);
		
		rt_device_write(uart3, 0, "uart3..\r\n", sizeof("uart3..\r\n"));
		if(count == 100)
		{
			rt_device_close(uart3);
		}
		if(count >= 200)
		{
			rt_device_close(uart3);//设备开了多少次就得关多少次才会失效
		}
    }    
    return RT_EOK;
}

by the way: 你需要在stm32f4xx_hal_msp.c中将设备的底层驱动写好,示例如下:

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */
  
  /* USER CODE END USART1_MspInit 1 */
  } //上面是原本有的,下面是自己复制粘贴补充的!!
  else if(huart->Instance==USART3)
  {
    __HAL_RCC_USART3_CLK_ENABLE();
  
    __HAL_RCC_GPIOD_CLK_ENABLE();
    /**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART3_IRQn);
  }

你没看见这里 哈哈哈
RT-Thread其实自带微秒级延时!

void rt_hw_us_delay(rt_uint32_t us)
{
    rt_uint32_t start, now, delta, reload, us_tick;
    start = SysTick->VAL;
    reload = SysTick->LOAD;
    us_tick = SystemCoreClock / 1000000UL;
    do
    {
        now = SysTick->VAL;
        delta = start >= now ? start - now : reload + start - now;
    }
    while (delta < us_tick * us);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值