STM32
登录
直播中
郭中
10年用户
1027经验值
擅长:存储技术
私信
关注
[问答]
如何去实现STM32的串口数据发送呢
开启该帖子的消息推送
STM32
串口数据
Printf
如何去实现
STM32
的串口数据发送呢?
如何去实现STM32的printf函数重定向呢?有哪些步骤?
回帖
(1)
周伟
2021-12-1 11:40:27
【stm32】实现STM32的串口数据发送和printf函数重定向
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。
对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤:
1 1、RCC始终初始化,对端口和USARTX使能时钟
2 2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出
3 3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
4 4、看需要是否开中断,我这里没开
设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢?
这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。
1 #include
//标准的库函数 2 3 //重写这个函数就可以了 4 #ifdef _PRINTF_ 5 int fputc(int ch, FILE *f) 6 { 7 USART_SendData(USART3, (u8) ch); 8 9 while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))10 {11 }12 13 return ch;14 }15 #endif
还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面使用printf输出数据就OK了,对于调试来说还是相当好用的。
初始化设置:
void Uart_RccInit(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);}void Uart_GpioInit(void){ GPIO_InitTypeDef GPIO_InitStructure; //PB10作为US1的TX端,打开复用,负责发送数据 GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //PB11作为US1的RX端,负责接收数据 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure);}void Uart_UartInit(void){ USART_InitTypeDef USART_InitStructure; USART_StructInit(&USART_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART3, &USART_InitStructure); // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); USART_Cmd(USART3, ENABLE);}
【stm32】实现STM32的串口数据发送和printf函数重定向
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。
对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤:
1 1、RCC始终初始化,对端口和USARTX使能时钟
2 2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出
3 3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
4 4、看需要是否开中断,我这里没开
设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢?
这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。
1 #include
//标准的库函数 2 3 //重写这个函数就可以了 4 #ifdef _PRINTF_ 5 int fputc(int ch, FILE *f) 6 { 7 USART_SendData(USART3, (u8) ch); 8 9 while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))10 {11 }12 13 return ch;14 }15 #endif
还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面使用printf输出数据就OK了,对于调试来说还是相当好用的。
初始化设置:
void Uart_RccInit(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);}void Uart_GpioInit(void){ GPIO_InitTypeDef GPIO_InitStructure; //PB10作为US1的TX端,打开复用,负责发送数据 GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //PB11作为US1的RX端,负责接收数据 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure);}void Uart_UartInit(void){ USART_InitTypeDef USART_InitStructure; USART_StructInit(&USART_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART3, &USART_InitStructure); // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); USART_Cmd(USART3, ENABLE);}
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32
串口数据
Printf
STM32
串口
数据
发送
该如何
去
实现
呢
2021-12-07
1064
如何
去
实现
基于
stm32
f103zet6的
串口
使用DMA
发送
数据
呢
2021-12-07
709
stm32
通过
串口
向上位机
发送
数据
的程序该如何
去
实现
呢
2021-12-10
1484
STM32
串口
是如何
去
实现
数据
发送
与接收的
2021-12-10
1452
如何
去
实现
STM32
F401的UART
串口
接收并
发送
数据
呢
2021-12-13
1907
如何
去
实现
STM32
串口
发送
数据
和接收
数据
呢
2021-12-07
1440
怎样用
stm32
去
编写
串口
发送
程序
呢
2022-02-18
913
STM32
的
串口
发送
和接收代码该如何
去
实现
呢
2021-12-09
1050
如何
去
实现
STM32
串口
printf函数的重定向
呢
2021-12-07
881
STM32
是怎样使用FIFO
去
实现
USART
串口
发送
中断的
2021-11-16
1454
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分