实现STM32的串口数据发送和printf函数重定向
来源:互联网 发布:淘宝助手无法登陆 编辑:程序博客网 时间:2024/06/05 06:08
【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 <stdio.h>//标准的库函数
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);
}
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。
对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤:
1 1、RCC始终初始化,对端口和USARTX使能时钟
2 2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出
3 3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
4 4、看需要是否开中断,我这里没开
设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢?
这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。
1 #include <stdio.h>//标准的库函数
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);
}
阅读全文
0 0
- 【stm32】实现STM32的串口数据发送和printf函数重定向
- 实现STM32的串口数据发送和printf函数重定向
- STM32之串口重定向printf函数和scanf函数
- STM32的USART重定向实现printf函数
- STM32的USART重定向实现printf函数
- STM32的printf函数重定向
- STM32的printf函数重定向
- STM32 printf 函数重定向
- STM32 printf() 函数重定向
- stm32 printf函数重定向
- STM32中关于串口通信的printf()函数重定向问题
- STM32中ADC的使用/printf函数重定向串口显示内部温度传感器测量值
- STM32中关于串口通信的printf()函数重定向问题
- STM32中关于串口通信的printf()函数重定向问题
- STM32中printf重定向到串口
- STM32串口通信printf重定向方法
- STM32中printf重定向到串口
- STM32中printf重定向到串口
- gzip: stdin: unexpected end of file 错误
- 228
- 光流神经网络
- recovery升级遇到的问题及其流程简单分析
- java课程设计源码(游戏:急速生存)
- 实现STM32的串口数据发送和printf函数重定向
- Codeforcess 535C Tavas and Karafs【二分+数据处理】
- laravel5.4报remember_token错误解决方法
- Android学习笔记——Git高级
- 关于BeanCreationException的异常处理
- java数据结构与算法-双向链表
- Mac OSX 正确地同时安装Python 2.7 和Python3
- mysql 会造成隐式提交的语句
- 程序员的心理世界~~~