1. 感谢面包板社区与南京沁恒公司给我提供了这次测评机会,支持国产芯片,相信总有一天可以安得芯片千万间,大庇天下硬件俱欢颜。
2. 别人因参加嵌入式芯片与系统设计竞赛接触到了沁恒的赤菟开发板,不得不说颜值是非常能打,颇有艺术品的气息,不过缺点就是IO口太少了,只可以在小范围进行开发,而这次测评的互联型RISC-V 32位单片机CH32V307,在保留其颜值的基础上扩展了IO口,使使用者的使用体验再次上升一个台阶。
赤
菟开发板 RISC-V 32位单片机CH32V307 串口及DMA使用
RISC-V 32位单片机CH32V307搭载了8 个 USART 接口(包含5个UART ),
基本步骤是
1. 创建一个基于CH32V307开发板的RT-Thread新项目
2. 在左侧项目资源管理器中点击“RT-Thread Setting”
3.按照图示进行配置
4.在board.h中添加宏定义
5.在drv——usart.c中添加USART2的配置代码
6. 添加头文件
在main.c中添加头文件关联
在serial_v2.h文件中添加头文件关联
之后右键工程点击属性,按照图示添加之前添加的头文件包含。
7. 到此为止我们对串口及dma的前置工作就已经做完了,终于可以写代码了。
下面我展示了我的主函数的串口2使用函数,包括了回调函数(发送接受到的数据)
rt_device_t u2_dev;
rt_thread_t u2_thread;
struct serial_configure u2_configs=RT_SERIAL_CONFIG_DEFAULT;
struct rt_semaphore sem1_andy;
rt_size_t rx_leng;
rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
{
rx_leng=size;
rt_sem_release(&sem1_andy);
return RT_EOK;
}
void serial_thread_entry(void *parameter)
{
char buffer[512];
rt_size_t len=0;
while(1)
{
rt_sem_take(&sem1_andy, RT_WAITING_FOREVER);
len= rt_device_read(u2_dev, 0, &buffer, rx_leng);
buffer[len]='\n';
rt_kprintf("buffer=%c\n",buffer);
}
}
int main(void)
{
rt_err_t ret=0;
u2_dev=rt_device_find("uart2");
if(u2_dev==RT_NULL)
{ LOG_E("rt_device_find[uart2] failed...\n");
return -EINVAL;
}
ret = rt_device_open(u2_dev, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_DMA_RX);
if(ret<0){
LOG_E("OPEN USART2 FAILED...\n");
return ret;
}
rt_device_control(u2_dev, RT_DEVICE_CTRL_CONFIG, (void *)&u2_configs);
rt_device_set_rx_indicate(u2_dev, rx_callback);
rt_sem_init(&sem1_andy, "andy_sem_rx", 0, RT_IPC_FLAG_FIFO);
u2_thread= rt_thread_create("u2_rx", serial_thread_entry , RT_NULL, 1024, 10, 5);
if(u2_thread==RT_NULL)
{
LOG_E("rt_thread_create failed...\n");
return -EINVAL;
}
rt_thread_startup(u2_thread);
rt_device_write(u2_dev, 0, "UART2 send test\n", rt_strlen("UART2 send test\n"));
return RT_EOK;
}
8. 再将2个usb转ttl接到PA9,PA10(串口1的tx及其rx),PA2,PA3(串口2的TX及其RX),再连接各自的VCC及其GND。
9. 烧录
10. 现象
文章评论(0条评论)
登录后参与讨论