M0扩展篇之Printf
本文介绍了如何通过syscfg配置和代码实现串口通信。首先,在syscfg配置中,主要需要修改引脚设置,波特率默认为9600。接着,通过代码示例展示了如何使用printf函数和重定向函数fputc、fputs实现串口数据发送,并解释了阻塞与非阻塞函数的区别。随后,文章进一步封装了发送字符串的函数SendString,简化了代码结构,并展示了如何通过封装函数与多个串口(如蓝牙和OpenMv)进行通信
·
一、syscfg配置
别的都保持默认,需要改的只有引脚。波特率默认是9600,串口的端口不要选错

二、代码讲解




#include "ti_msp_dl_config.h"
#include "ti/driverlib/m0p/dl_core.h"
#include "stdio.h"
#include "string.h"
int a=100;
int main(void)
{
SYSCFG_DL_init();
while (1) {
printf("Hello %d\r\n",a);
delay_cycles(32000000);//等待一秒钟的时间
}
}
/*
这个int fputc(int c,FILE* stream)函数在#include "stdio.h"这个头文件里面
使用printf就需要使用fputc这个函数
*/
int fputc(int c, FILE* stream)//重定向函数
{
DL_UART_Main_transmitDataBlocking(UART_0_INST,c);
/*
DL_UART_Main_transmitData();
这个函数不是阻塞函数。
当执行到这个函数的时候,它会把这个字符c发送给串口UART进行发送,把这个数据写入给寄存器之后就会返回,继续执行下面的程序
但是此时还没有发送完成,只是发出了发送的请求,但是整个发送还没有完成
DL_UART_Main_transmitDataBlocking();
这个函数是一个阻塞函数。
它会把这个字符发给那边串口的寄存器,等待串口发送完成后,它再执行后续的程序
DL_UART_Main_transmitDataBlocking();//内容发送完了才执行下一步的程序
DL_UART_Main_transmitDataBlocking();
这两句话这么写是没有问题的
DL_UART_Main_transmitData();//只是发送了一个发送请求,但是内容还未发送完
DL_UART_Main_transmitData();
但是要这么写就有问题了
*/
return c;
}
/*如果只使用上面的fputc这个函数,那么就只能打印helloword这个字符串,不能打印后面的参数
所以我们要使用后面的fputs这个才能打印后面的参数
fputs和puts是同时定义的,如果只使用其中一个的话有时候会提示一个重定向的报错
*/
int fputs(const char* restrict s, FILE* restrict stream)
{
uint16_t i,len;
len=strlen(s);
for (i=0; i<len; i++)
{
DL_UART_Main_transmitDataBlocking(UART_0_INST,s[i]);
}
return len;
}
int puts(const char *_ptr)
{
int count =fputs(_ptr, stdout);
count +=fputs("\n", stdout);
return count;
}
效果展示
三、封装的打印代码



#include "ti_msp_dl_config.h"
#include "stdio.h"
#include "string.h"
#include "ti/driverlib/m0p/dl_core.h"//这个头文件我也不知道是干嘛的
void SendString(char *str)//这句话是单纯的发送一个字符串
{
while (*str !='\0')
{
DL_UART_Main_transmitDataBlocking(UART_0_INST,*str++);
}
}
int a=3507;
char txBuf[100];
int main(void)
{
SYSCFG_DL_init();
while (1)
{
sprintf(txBuf, "MSPM0 %d\r\n", a);//把发送的内容MSPM03507存储到txBuf[100]这个里面
SendString(txBuf);//发送的内容就是txBuf也就是MSPM03507
//第一句只是一个打印内容的作用,第二句才是正式发送的内容
delay_cycles(32000000);//等待一秒钟的时间
}
}
四、封装代码的实用性
使用封装的代码的话,就可以不再使用上面的printf的底层函数,一句函数就完成了,使用便利。
同时使用封装代码,可以跟几个不同的串口进行通信,需要修改的地方可以看基础篇的配置,在扩展篇里面只需要配置一下引脚,波特率默认是9600



#include "ti_msp_dl_config.h"
#include "stdio.h"
#include "string.h"
#include "ti/driverlib/m0p/dl_core.h"
void BT_SendString(char *str)//跟蓝牙通信的串口发送
{
while (*str !='\0')
{
DL_UART_Main_transmitDataBlocking(UART_BT_INST,*str++);
}
}
void OpenMv_SendString(char *str)//跟OpenMv通信的串口发送
{
while (*str !='\0')
{
DL_UART_Main_transmitDataBlocking(UART_OpenMv_INST ,*str++);
}
}
int a=3507;
char txBuf[100];
int main(void)
{
SYSCFG_DL_init();
while (1)
{
sprintf(txBuf, "MSPM0 %d\r\n", a);//把发送的内容MSPM03507存储到txBuf[100]这个里面
BT_SendString(txBuf);//跟蓝牙通信的串口发送
OpenMv_SendString(txBuf);//跟OpenMv通信的串口发送
delay_cycles(32000000);//等待一秒钟的时间
}
}
更多推荐



所有评论(0)