赞
踩
前两天吧定时器搞了,这次是想把串口搞定,因为串口是作为对外界通信的一个媒介,搞定了串口就可以随时随地的把板子的信息打印出来,查看程序运行的步骤以及调试的消息,虽然用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( );
- }
- }
下面来看看测试效果
好了,今天的串口驱动的展示就到这里。
---------------------
作者:shenxiaolin
链接:https://bbs.21ic.com/icview-3321502-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。