提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
实现串口uart1的中断接收(PA9、PA10)
开放出串口1的接口,串口1接收到数据后进入线程
调试串口是uart2,PA2、PA3
一、串口uart1开发
1. 寻找设备
/寻找设备****/
u1_dev = rt_device_find(“uart1”);
rt_err_t ret=0;
u1_dev = rt_device_find("uart1");
if(u1_dev==RT_NULL)
{
LOG_E("rt_device_find[uart1] failed...\n");
return -EINVAL;
}
2.打开设备
/打开设备****/
ret=rt_device_open(u1_dev, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
ret=rt_device_open(u1_dev, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
if(ret<0)
{
LOG_E("rt_device_find[uart1] failed...\n");
return ret;
}
3.控制设备(设置波特率、数据位、停止位等)
/控制设备(配置设备)*****/
rt_device_control(u1_dev, RT_DEVICE_CTRL_CONFIG , (void *)&u1_configs);
4.设置接收回调函数
/****设置接收回调函数/
rt_device_set_rx_indicate(u1_dev, rx_callback) ;
串口接收到数据后调用回调函数,在回调函数中释放信号量
/**********串口接收到数据后调用回调函数,在回调函数中释放信号量***********/
rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&sem);
return RT_EOK;
}
5.设置信号量
/****设置信号量/
rt_sem_init(&sem, “rx_sem”, 0, RT_IPC_FLAG_FIFO);
6.创建串口线程
u1_th=rt_thread_create(“serial1_recv”, serial_thread_entry, NULL, 1024, 10, 5);
开启线程
rt_thread_startup(u1_th);
在串口线程中一直等待信号量的释放
/*******************************在串口线程中一直等待信号量的释放***************************/
void serial_thread_entry(void *parameter)
{
char buffer;
while(1)
{
while(rt_device_read(u1_dev,0,&buffer,1)!=1)//接收一个就触发一次中断
{
rt_sem_take(&sem, RT_WAITING_FOREVER);
}
rt_kprintf("%c",buffer);
rt_pin_write(LED0_PIN, 0);
rt_thread_delay(1000);
rt_pin_write(LED0_PIN, 1);
}
}
二、完整代码
/*
* Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-12-11 RT-Thread first version
*/
#include <rtthread.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include <drv_common.h>
#include <drivers/pin.h>
#define LED0_PIN GET_PIN(F,9)
rt_device_t u1_dev;
rt_thread_t u1_th;
struct rt_semaphore sem;
struct serial_configure u1_configs = RT_SERIAL_CONFIG_DEFAULT;
/*******************************串口接收到数据后调用回调函数,在回调函数中释放信号量***************************/
rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&sem);
return RT_EOK;
}
/*******************************在串口线程中一直等待信号量的释放***************************/
void serial_thread_entry(void *parameter)
{
char buffer;
while(1)
{
while(rt_device_read(u1_dev,0,&buffer,1)!=1)//接收一个就触发一次中断
{
rt_sem_take(&sem, RT_WAITING_FOREVER);
}
rt_kprintf("%c",buffer);
rt_pin_write(LED0_PIN, 0);
rt_thread_delay(1000);
rt_pin_write(LED0_PIN, 1);
}
}
int main(void)
{
/*******************寻找设备***********************/
rt_err_t ret=0;
u1_dev = rt_device_find("uart1");
if(u1_dev==RT_NULL)
{
LOG_E("rt_device_find[uart1] failed...\n");
return -EINVAL;
}
/*******************打开设备***********************/
ret=rt_device_open(u1_dev, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_INT_RX);
if(ret<0)
{
LOG_E("rt_device_find[uart1] failed...\n");
return ret;
}
/******************控制设备***********************/
rt_device_control(u1_dev, RT_DEVICE_CTRL_CONFIG , (void *)&u1_configs);
/*******************************设置接收回调函数***************************/
rt_device_set_rx_indicate(u1_dev, rx_callback) ;
/*******************************设置信号量***************************/
rt_sem_init(&sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
/*******************************创建串口线程***************************/
u1_th=rt_thread_create("serial1_recv", serial_thread_entry, NULL, 1024, 10, 5);
rt_thread_startup(u1_th);
//rt_device_write(u1_dev, 0, "Uart1 config\n", rt_strlen("Uart1 config\n"));
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
LOG_D("Hello RT-Thread!");
return RT_EOK;
}