本帖最后由 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( );
}
}
下面来看看测试效果
好了,今天的串口驱动的展示就到这里。
|