移植正点的printf

11 篇文章 25 订阅

一、用STM32CubeMX生成基本MDK工程

  生成工程时,需要使能三个中断和2个初始化,中断优先级要大于5
1、DMA接收中断
2、DMA发送中断
3、串口中断
4、初始化一个二值信号量uart2_busy, 只有等到该信号量时,才能使用串口。使用串口DMA发送,在发送完中断中,释放该信号量。定义一个消息队列,txQueue, 需要发送的atkp_t类型数据包先发送到这个队列里。然后由任务从这个队列里取出来发送。
5、定义一个synch信号量,fputc(int ch, FILE *f)往一个中间变量的数据包messageToPrint填数据时同步用。好像不用也可以。
在这里插入图片描述

二、为什么要设置串口中断呢?

  因为DMA发送完成中断,并没有直接调用回调函数释放uart2_busy,而是触发串口发送完成中断,串口中断中再调用回调函数释放uart2_busy。
在这里插入图片描述
  当然,也可以不要串口中断,修改底层,在DMA发送完成中断中,直接调用回调函数。回调函数中释放串口忙标志,不然只能发送一次。不过速度也没有加快。
在这里插入图片描述
在这里插入图片描述

三、加入console.c和radiolink.c文件到工程

A、console.c

1、void consoleInit(),初始化全局变量messageToPrint的ID和创建信号量

2、int consolePutchar(int ch)主要是给fputc(int ch, FILE *f)调用,把发送的内容一个字符一个字符填入一个临时数据包messageToPrint,它是一个全局变量。
当遇到\n字符时,认为一帧数据已填完。把messageToPrint发送到队列txQueue里。

3、int consolePutcharFromISR(int ch)如果当前运行在中断函数里,用这个函数填充临时数据包messageToPrint

B、radiolink.c

1、radiolinkTask(void const * argument)串口发送任务,从txQueue取出数据包。

2、static void uartSendPacket(atkp_t *p) 把上一步取出的数据包,加上帧头和校验,复制到sendBuffer[36]临时数组里, 然后调用DMA把sendBuffer[36]发送出去
在这里插入图片描述
3、重定义fputc(int ch, FILE *f)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值