打印
[STM32H5]

【NUCLEO- H563ZI 测评】-05-串口打印测试及串口重定向

[复制链接]
393|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 shenxiaolin 于 2023-8-17 23:45 编辑

前两天吧定时器搞了,这次是想把串口搞定,因为串口是作为对外界通信的一个媒介,搞定了串口就可以随时随地的把板子的信息打印出来,查看程序运行的步骤以及调试的消息,虽然用Hall库还是不太熟练,但是还是在慢慢接纳这一程序的表现方式。
好啦,我们先来查看一下,我们的的原理图,以及数据手册,

PC10和PC11,两个引脚在数据手册中

由数据手册是UART4,所以,我们将这两个的串口直接引了出来,一个调试器可以做调试,程序下载,还可以做串口的输出。


修改之后,就是这个样子,因为板载的调试器无法使用,所以这个测评还是有点艰难,祝愿一切顺利吧。
好了,开始挑调试代码了。在调用了复用模式的情况下,需要查找手册,保证串口启用复用功能,并且保证开启了引脚的时钟。
下面是这个的代码:
#include "DRV_UART.h"


UART_HandleTypeDef huart4;

void UART4_AF_Init(void)
{
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_UART4_CLK_ENABLE();
        GPIO_InitTypeDef  gpio_init_structure;
        
        //--PC10- UART4-TXD--
        gpio_init_structure.Pin   =GPIO_PIN_10;
        gpio_init_structure.Mode  = GPIO_MODE_AF_PP;
        gpio_init_structure.Pull  = GPIO_NOPULL;
        gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        gpio_init_structure.Alternate=GPIO_AF8_UART4;//--设置引脚复用功能--
        HAL_GPIO_Init(GPIOC, &gpio_init_structure);

        //--PC11- UART4-RXD---
        gpio_init_structure.Pin   =GPIO_PIN_11;
        gpio_init_structure.Mode  = GPIO_MODE_OUTPUT_PP;
        gpio_init_structure.Pull  = GPIO_NOPULL;
        gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
        gpio_init_structure.Alternate=GPIO_AF8_UART4;//--设置引脚复用功能--
        HAL_GPIO_Init(GPIOC, &gpio_init_structure);
        
        
}





void USART4_Init(void)
{

    UART4_AF_Init();
        huart4.Instance = UART4;
        huart4.Init.BaudRate = 115200;
        huart4.Init.WordLength = UART_WORDLENGTH_8B;
        huart4.Init.StopBits = UART_STOPBITS_1;
        huart4.Init.Parity = UART_PARITY_NONE;
        huart4.Init.Mode = UART_MODE_TX_RX;
        huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
        huart4.Init.OverSampling = UART_OVERSAMPLING_16;
        huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
        huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
        huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
        if (HAL_UART_Init(&huart4) != HAL_OK)
        {

        }
        if (HAL_UARTEx_SetTxFifoThreshold(&huart4, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
        {

        }
        if (HAL_UARTEx_SetRxFifoThreshold(&huart4, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
        {

        }
        if (HAL_UARTEx_DisableFifoMode(&huart4) != HAL_OK)
        {

        }

}



整个串口的代码相对比较简单,不过还没有重定向,如果重定向好了,那么就可以使用printf 函数了。
那么就来一下串口输出的结果吧。

完成了这一步,我们算是完成了差u纽扣的基本发送的函数,接下来就是printf的重定向的工作,这一步的话想对的简单得多,网上的例子也很多。
只需要添加下面的函数即可
int fputc(int ch,FILE *f)
{

        HAL_UART_Transmit(&huart4,(unsigned char *)&ch,1,20);
        return ch;
}


然后下面修改一下主函数来进行transmit以及printf的测试
#include "stm32h5xx_hal.h"
#include "DRV_LED.h"
#include "DRV_TIM.h"
#include "DRV_UART.h"
unsigned char TestFData[]="Thes is a Uart Demo\r\n";
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  Tim1_Init();
  LED_GPIO_Init();
  USART4_Init();
  while (1)
  {
         HAL_UART_Transmit(&huart4,TestFData,21,20);
         printf("This is Printf Test !\r\n");
     LED_Test( );
  }
}


下面来看看测试效果

好了,今天的串口驱动的展示就到这里。




使用特权

评论回复
沙发
Candic12e| | 2024-1-12 16:42 | 只看该作者
哇,还有正点原子的调试器,是不是很好用啊?

使用特权

评论回复
板凳
yangjiaxu| | 2024-1-12 16:43 | 只看该作者
其实用cubemx配置重定向好像也是可以,而且自己不用改了

使用特权

评论回复
地板
Charlene沙| | 2024-1-12 16:43 | 只看该作者
之前我重定向过串口2,哈哈,用printf确实很爽哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:运达电气-产品经理
简介:毕业于西南科技大学,从事MCU、MPU开发工作近8年,熟悉嵌入式软硬件开发流程,产品管理以及现场项目管理。

32

主题

411

帖子

3

粉丝