wambob 发表于 2016-11-16 22:56:26

STM32F767 使用STM32CubeMX生成串口乱码

本帖最后由 wambob 于 2016-11-19 13:25 编辑

   如果起点错了,没有人指点,就会在寻找错误的路上越走越远,越来越迷惑...



首先测试过板子串口是没有问题的,但是使用STM32CubeMX生成KEIL5或IAR都是乱码,开始考虑是不是STM32CubeMX 4.17版本的问题,使用072 nucleo测试有串口输出,没出现乱码,证明软件也没问题。      
       没办法了,只好用内部时钟测试了,结果串口输出不乱码了,顿时觉得掉坑里了,1天就这么浪费了:L
       无图无真相,设置很简单,就是开启了外部时钟和串口3。


串口配置

先使用外部时钟导致的乱码

到处工程编译下载。连接串口助手

使用内部时钟

串口输出


既然串口设置一样,一个乱码一个正常,串口初始化代码没问题,问题出在时钟上了*/
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

    /**Configure the main internal regulator output voltage
    */
__HAL_RCC_PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 432;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    Error_Handler();
}

    /**Activate the Over-Drive mode
    */
if (HAL_PWREx_EnableOverDrive() != HAL_OK)
{
    Error_Handler();
}

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
{
    Error_Handler();
}

PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3;
PeriphClkInitStruct.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
    Error_Handler();
}

    /**Configure the Systick interrupt time
    */
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}上面是外部时钟配置。
下面是内部时钟配置。
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;

    /**Configure the main internal regulator output voltage
    */
__HAL_RCC_PWR_CLK_ENABLE();

__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 216;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    Error_Handler();
}

    /**Activate the Over-Drive mode
    */
if (HAL_PWREx_EnableOverDrive() != HAL_OK)
{
    Error_Handler();
}

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)
{
    Error_Handler();
}

PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART3;
PeriphClkInitStruct.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
    Error_Handler();
}

    /**Configure the Systick interrupt time
    */
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USART3 init function */
static void MX_USART3_UART_Init(void)
{

huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_ODD;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
    Error_Handler();
}

}可是时钟配置根本看不出什么问题。不会是外部晶振的问题吧。再次把最大频率降至100,依然乱码。
谁有这个板子可以测试下,是不是晶振坏了。
附上乱码的代码:








wambob 发表于 2016-11-16 23:05:18

沙发我坐了,问题找到了,我可以睡个好觉了:lol:lol

andrewz 发表于 2016-11-16 23:16:00

^_^,一个串口也能折腾一天.



wambob 发表于 2016-11-16 23:52:58

andrewz 发表于 2016-11-16 23:16
^_^,一个串口也能折腾一天.

开始用外部晶振的,谁想到会出问题啊,严格来说来说也不是一天,其实是两个晚上

peter001 发表于 2016-11-17 08:11:58

:D:D时钟配错了是吧

xhzheng 发表于 2016-11-17 08:25:58

LZ,啥情况导致的,晶振坏了??

andrewz 发表于 2016-11-17 08:32:45

wambob 发表于 2016-11-16 23:52
开始用外部晶振的,谁想到会出问题啊,严格来说来说也不是一天,其实是两个晚上 ...

:lol

cube配置好,再抄参数.

limale 发表于 2016-11-17 12:45:02

串口配置的数据位是8位,串口工具用的7位,不知道有没有影响。

wambob 发表于 2016-11-17 20:02:14

limale 发表于 2016-11-17 12:45
串口配置的数据位是8位,串口工具用的7位,不知道有没有影响。

跟串口没关系

wambob 发表于 2016-11-17 20:02:59

andrewz 发表于 2016-11-17 08:32
cube配置好,再抄参数.

肯定先配好的
页: [1] 2
查看完整版本: STM32F767 使用STM32CubeMX生成串口乱码