实现STM32的串口数据发送和printf函数重定向

发布者:SereneSerenity最新更新时间:2021-06-02 来源: eefocus关键字: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  串口  数据发送  printf函数  重定向 引用地址:实现STM32的串口数据发送和printf函数重定向

上一篇:STM32中断机制
下一篇:STM32学习笔记 — 之GPIO端口篇

推荐阅读最新更新时间:2024-11-10 22:09

STM32的IIC应用详解1
概要 IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。 IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。 多主机I2C总线结构 注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。 IIC协议 空闲状态 协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。 起始信号和停止信号 起始信号:SCL为高电平时,SDA电平发生高到低的跳变 停止信号:SCL为高电平时,SDA电平发生低到高的跳变 应答信号 发送器每发送完一个字节(8个脉冲),在第9个脉
[单片机]
使用Msp430的串口中断接收一包数据
假设有一数据包,数据格式如表所示: 数据包总长度为: Data_len + 5 字节,最长不能超过512字节。 #include msp430x22x4.h typedef struct newStruct { unsigned char startFlag; unsigned char finishFlag; unsigned char lenHighFlag; unsigned char lenLowFlag; unsigned char dataFlag; unsigned char lrcFlag; unsigned char buf ; unsigned
[单片机]
使用Msp430的<font color='red'>串口</font>中断接收一包<font color='red'>数据</font>
STM32 基础系列教程 18 – IWDG
前言 学习stm32 独立看门狗(IWDG)接口使用,学会用STM32内部独立看门狗(IWDG)实现程序异常时自复位功能。 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外,能够完
[单片机]
<font color='red'>STM32</font> 基础系列教程 18 – IWDG
STM32是如何进入中断服务函数xxx_IRQHandler的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口。 以串口中断服务函数void USART1_IRQHandler(void) 为例,首先用到串口中断,需要先设定串口中断初始化以及串口初始化,另外void USART1_IRQHandler(void) 中断服务函数也应该写好。 发现在stm32的启动文件startup_stm32f10x_md.s中写到 DCD USART1_IRQHandler 其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。 库里定义 #define USART1 ((
[单片机]
STM32学习笔记之按键查询方式控制led灯的亮灭
其实接触STM32已经快半年了,端断续续的也学习了一下的STM32的各个模块的基本功能,刚开始的时候也是看比人的写的代码,看懂了然后再去修改,能够在自己的平台上实现基本的功能,也就是到现在才能真正的按照自己的想法来实现写功能,在本文中我将介绍下比较经典的按键驱动程序的实现方式--查询,当然中断方式的应用也比较广泛,在此先不做介绍了。 首先我的硬件平台是奋斗版STM32,之所以选择这款开发版是因为板子提供了许多关于ucos和ucgui的例程,想往这方面发展的童鞋可以考虑哦,呵呵,不多说了,开发板带的芯片型号是STM32F103VET6: 64K 片内SRAM,512K 片内FALSH. 本文所用到的外设:3个le
[单片机]
stm32 在线升级 总结
一、前两篇博客实现的功能是在APP和IAP之间进行程序跳转; 二、这里面有以下需要注意的地方; 1、程序跳转函数切记不要在定时器中断里编写,否则程序可以正常跳转但是中断功能却不能执行。原因,可以参考以下链接; http://xzq1019.blog.163.com/blog/static/5996566520100181146689/ 就是,在中断里进行跳转的话,stm32会认为跳转函数只是中断处理函数的一部分,所以会出现挂起,不能再响应中断。一般的做法是在中断里设标志位,在主函数里进行跳转。 2、在IAP程序跳转前关闭总中断,在跳转到APP程序后,打开总中断。 3、中断的打开和关闭可以利用下面的函数 __disable_irq(
[单片机]
STM32之JTAG、SWD模式
说在前面的话 最近YKY项目做了新的硬件设计,其中键盘接口采用矩阵式键盘(4*4),有两个接口使用了STM32 (PB3、PB4), 调试中发现,这两个接口对应的两行均不能正常扫描到按键值,查看数据手册才知道这是系统接口,需要进行设置才可以 作为普通IO口使用。如图是数据手册对这两个接口的介绍: 解决方法 寄存器版本: 1 //JTAG模式设置,用于设置JTAG的模式 2 //mode:jtag,swd模式设置;00,全使能;01,使能SWD;10,全关闭; 3 //#define JTAG_SWD_DISABLE 0X02 4 //#define SWD_ENABLE 0X01
[单片机]
13.Smart210串口驱动基于12的补充
上面的12节里,已经讲了2440有关串口的设置和操作。本来,2440,6410和210的串口操作应该是几乎一样的。在进行6410和210的设置的时候,发现在波特率的设置,6410和210的原理是一样的,但是跟2440有点不一样。所以下面以210为例子,说明6410和210波特率的设置。 寄存器: UBRDIV0=(int)(PCLK_PSYS/(BAUD*16)-1);//UBRDIV0保存该公式计算后的整数部分。 UBRDIV0=(int)(66000000/(115200*16)-1)=(int)(35.8-1)=(int)(34.8)=34。即取整数部分为34. //UDISLOT0=保存该公式计算后的小数部分*
[单片机]
13.Smart210<font color='red'>串口</font>驱动基于12的补充
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved