C STM32L476G发现上的USART通信

C STM32L476G发现上的USART通信,c,stm32,gpio,usart,stm32ldiscovery,C,Stm32,Gpio,Usart,Stm32ldiscovery,我有两块板:核子F411RE和STM32L467G发现 我需要在我的STM32L467G Discovery和我的PC之间建立虚拟Com连接 对于核仁:USART2连接到ST链路,因此我可以通过USB与我的PC进行USART通信。因此,我启用GPIOA和USART2时钟。之后,我将我的GPIOA配置为链接USART2上的端口2和端口3,它工作得很好!我可以在我的电脑上接收一些字符 对于STM32L467G发现:STM32L467G发现在GPIOA上的端口2和端口3上也有USART2。但是,在文档

我有两块板:核子F411RE和STM32L467G发现

我需要在我的STM32L467G Discovery和我的PC之间建立虚拟Com连接

对于核仁:USART2连接到ST链路,因此我可以通过USB与我的PC进行USART通信。因此,我启用GPIOA和USART2时钟。之后,我将我的GPIOA配置为链接USART2上的端口2和端口3,它工作得很好!我可以在我的电脑上接收一些字符

对于STM32L467G发现:STM32L467G发现在GPIOA上的端口2和端口3上也有USART2。但是,在文档中,他们说USART2与GPIOD中端口5和6上的USART2的ST链路相连。所以,我修改了我的源代码,但我的计算机中没有收到任何东西

查看我的资料来源:

Main.c

#include "stm32l4xx.h"
#include "stm32l476g_discovery.h"


UART_HandleTypeDef huart2;
GPIO_InitTypeDef GPIO_InitStruct;
void configure_system_clock(void);

int main(void)
{

    HAL_Init(); // HAL Init

    configure_system_clock(); // Configure Clock


    __GPIOD_CLK_ENABLE(); // Enable GPIOD clock
    __USART2_CLK_ENABLE(); // Enable USART2 Clock


    huart2.Instance = USART2;
    huart2.Init.BaudRate = 9600;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    HAL_UART_Init(&huart2);



            /**USART2 GPIO Configuration
            PA2     ------> USART2_TX
            PA3     ------> USART2_RX
            */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    char *msg = "Hello YOU\n\r";

          HAL_UART_Transmit(&huart2, (uint8_t*)msg, 15, 0xFFFF);
      while (42);
}

void configure_system_clock(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct;
    RCC_ClkInitTypeDef RCC_ClkInitStruct;

    __PWR_CLK_ENABLE();

    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = 6;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLM = 8;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}
此代码在Nucleo-Nucleo-F411RE上运行良好(但使用GPIOA和端口2和3)

在我的STM32L467G发现中,该代码完全失败,GPIOD端口5和6以及GPIOA端口2和3


我看不出问题,你能帮我吗?

使用STM Cube生成启动文件

我这周给了一个处境相似的人。我接受了挑战,因为我经历了同样的挫折

我发现,不管怎样,在开始一个项目时,最好尽可能在最高水平上工作。我希望能够在技术进步出现时利用它们

可移植的、记录良好的高级应用程序易于维护,并且可以快速移植到较新的处理器和体系结构

位和字节级别的优化将在稍后进行,以满足尚未达到的特定性能目标

通过专注于高级解决方案,算法的新方法通常比低级优化产生更好的性能优势

删除臃肿的初始化序列可能会节省几百字节的启动代码并节省几微秒,但启动很少在关键路径上

在反对者面前一个月就有一个有效的产品在货架上是值得的

如果需要提高速度,请在开始之前迁移到更高性能的体系结构,例如STM7系列

探查器将很快产生剩余的瓶颈。可以使用高级实现作为规范对其进行优化

是的,STM LIB(以及许多其他LIB,如sprintf)很大且臃肿,是的,它们不能满足每个人的需求。但它们仍然很有用,并且在我的预算之外不断得到改进

开发成本以工时为单位,节省工时

从配置CUBE中的所有内容并生成代码开始,尽可能多地使用芯片组和库的功能,以提供高级别的最佳解决方案

建立一个第二层解决方案和优化库,您可以在其他应用程序中重用

最近对STMCube和HAL库的升级纠正了我过去遇到的一些问题。不完美,但非常实用,值得一试。目前正在进行改进

花大部分时间开发应用程序,而不是摆弄不必要的低级优化

这往往会让你的老板高兴——即使你唯一的老板是银行经理


希望您(我们)遇到的问题现在已经成为过去。

使用STM Cube生成启动程序

我这周给了一个处境相似的人。我接受了挑战,因为我经历了同样的挫折

我发现,不管怎样,在开始一个项目时,最好尽可能在最高水平上工作。我希望能够在技术进步出现时利用它们

可移植的、记录良好的高级应用程序易于维护,并且可以快速移植到较新的处理器和体系结构

位和字节级别的优化将在稍后进行,以满足尚未达到的特定性能目标

通过专注于高级解决方案,算法的新方法通常比低级优化产生更好的性能优势

删除臃肿的初始化序列可能会节省几百字节的启动代码并节省几微秒,但启动很少在关键路径上

在反对者面前一个月就有一个有效的产品在货架上是值得的

如果需要提高速度,请在开始之前迁移到更高性能的体系结构,例如STM7系列

探查器将很快产生剩余的瓶颈。可以使用高级实现作为规范对其进行优化

是的,STM LIB(以及许多其他LIB,如sprintf)很大且臃肿,是的,它们不能满足每个人的需求。但它们仍然很有用,并且在我的预算之外不断得到改进

开发成本以工时为单位,节省工时

从配置CUBE中的所有内容并生成代码开始,尽可能多地使用芯片组和库的功能,以提供高级别的最佳解决方案

建立一个第二层解决方案和优化库,您可以在其他应用程序中重用

最近对STMCube和HAL库的升级纠正了我过去遇到的一些问题。不完美,但非常实用,值得一试。目前正在进行改进

花大部分时间开发应用程序,而不是摆弄不必要的低级优化

这往往会让你的老板高兴——即使你唯一的老板是银行经理


希望您(我们)遇到的问题现在已经成为过去。

您正在初始化UAR
HAL_Init(); // HAL Init

configure_system_clock(); // Configure Clock

huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
HAL_UART_Init(&huart2); 

 HAL_UART_Transmit(&huart2, (uint8_t*)msg, 15, 0xFFFF);
GPIO_InitTypeDef GPIO_InitStruct;
if(huart->Instance==USART2)
{
 /* Peripheral clock enable */
 __USART2_CLK_ENABLE();
 __GPIOD_CLK_ENABLE();

/**USART2 GPIO Configuration  */
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
}
void USART2_IRQHandler(void)
{
 HAL_UART_IRQHandler(&huart2);
}