1、首先准备一个正常的工程
2、在keil中,将rtthread 的nano包加进工程中
3、 准备串口驱动
先搞好
rt_hw_console_output 、 rt_hw_console_getchar这两个函数,具体代码如下:
void rt_hw_console_output(const char *str)
{
rt_size_t i=0,size = 0;
char a='\r';
__HAL_UNLOCK(&huart1);
size = rt_strlen(str);
for(i=0;i<size;i++)
{
if(*(str+i)=='\n')
{
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
}
}
char rt_hw_console_getchar(void)
{
char ch = 0;
while (rt_ringbuffer_getchar(&uart_rxcb, (rt_uint8_t *)&ch) != 1)
{
rt_sem_take(&shell_rx_sem, RT_WAITING_FOREVER);
}
return ch;
}
然后登记串口,具体代码如下:
rt_err_t uart_open(rt_device_t dev, rt_uint16_t oflag)
{
return uart_init();
}
rt_size_t uart_read(rt_device_t dev,
rt_off_t pos,
void *buffer,
rt_size_t size)
{
while (1)
{
if (HAL_UART_Receive(&huart1, buffer, size, 20) == 0)
{
return size;
}
rt_thread_delay(1);
}
}
rt_size_t uart_write(rt_device_t dev,
rt_off_t pos,
const void *buffer,
rt_size_t size)
{
rt_size_t i = 0;
char a = '\r';
const char *val = 0;
val = (const char *)(buffer);
__HAL_UNLOCK(&huart1);
for (i = 0; i < size; i++)
{
if (*(val + i) == '\n')
{
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 20);
}
HAL_UART_Transmit(&huart1, (uint8_t *)(val + i), 1, 20);
}
return 1;
}
struct rt_device uart_dev;
static int uart_register(void)
{
uart_dev.init = uart_init;
uart_dev.open = uart_open;
uart_dev.read = uart_read;
uart_dev.write = uart_write;
rt_device_register(&uart_dev, "uart1", 0);
return 0;
}
INIT_BOARD_EXPORT(uart_register);
完成之后,还不行,在rtconfig.h中需要配置,主要关注几个宏,
RT_USING_HEAP
RT_USING_CONSOLE
RT_CONSOLE_DEVICE_NAME "uart1"
如果在keil中复制出来的,则
#define RTE_USING_DEVICE
RT_USING_DEVICE
RT_USING_SERIAL
#define RTE_USING_FINSH
RT_USING_FINSH
FINSH_USING_MSH
FINSH_USING_MSH_ONLY
FINSH_USING_SYMTAB
以上这些宏必须要有定义