一、用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)。