Устройство: stm32f407vg
IDE: Keil Uvision 5
IDE Версия: Последняя версия
Cubemx Версия: Последняя версия
Я хочу использовать протокол связи USART в моем проекте. Связь обеспечена, но отправлены неверные данные (STM> ПК).
Функция "SystemInit ()" в компиляторе подчеркнута серой линией. Один из пользователей прокомментировал:
"" "" "
SystemInit () должен вызываться только в обработчике сброса
Предполагается, что эта функция возвращает системные часы в состояние по умолчанию, работающее непосредственно от HSI на частоте 16 МГц.
Вы вызываете его в середине функции main (), когда USART1 уже настроен на более высокую тактовую частоту. Пока неизвестно, что будет делать периферийное устройство, когда его источник тактовых импульсов будет изменен на лету.
"" ""
Коды:
#include "spi.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
#include "stm32f4xx_hal.h"
#include "defines.h"
#include "tm_stm32_disco.h"
#include "tm_stm32_delay.h"
#include "tm_stm32_lis302dl_lis3dsh.h"
#include "stm32f4xx.h"
#include "arm_math.h"
#define PID_PARAM_KP 100
#define PID_PARAM_KI 0.025
#define PID_PARAM_KD 0
float pid_error;
extern UART_HandleTypeDef huart1;
char* bufftr="Hello\n\r";
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
TM_LIS302DL_LIS3DSH_t Axes_Data;
MX_GPIO_Init();
MX_TIM1_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
__HAL_UART_ENABLE_IT(&huart1, UART_IT_TC);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
SystemInit();
TM_DELAY_Init();
TM_DISCO_LedInit();
if (TM_LIS302DL_LIS3DSH_Detect() == TM_LIS302DL_LIS3DSH_Device_LIS302DL) {
TM_DISCO_LedOn(LED_GREEN | LED_RED);
TM_LIS302DL_LIS3DSH_Init(TM_LIS302DL_Sensitivity_2_3G, TM_LIS302DL_Filter_2Hz);
} else if (TM_LIS302DL_LIS3DSH_Detect() == TM_LIS302DL_LIS3DSH_Device_LIS3DSH) {
TM_DISCO_LedOn(LED_BLUE | LED_ORANGE);
TM_LIS302DL_LIS3DSH_Init(TM_LIS3DSH_Sensitivity_2G, TM_LIS3DSH_Filter_800Hz);
} else {
TM_DISCO_LedOn(LED_GREEN | LED_RED | LED_BLUE | LED_ORANGE);
while (1);
}
Delayms(300);
TM_DISCO_LedOff(LED_ORANGE);
TM_DISCO_LedOff(LED_BLUE);
arm_pid_instance_f32 PID;
PID.Kp = PID_PARAM_KP;
PID.Ki = PID_PARAM_KI;
PID.Kd = PID_PARAM_KD;
arm_pid_init_f32(&PID, 1);
TM_GPIO_SetPinLow(GPIOD, GPIO_Pin_12);
TM_GPIO_SetPinLow(GPIOD, GPIO_Pin_14);
while (1){
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftr, 8);
HAL_Delay(500);
}
void SystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
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 = 4;
RCC_OscInitStruct.PLL.PLLN = 168;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){
Error_Handler();
}
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_5) != HAL_OK){
Error_Handler();
}
}
static void MX_USART1_UART_Init(void){
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK){
Error_Handler();
}
}
static void MX_GPIO_Init(void){
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
}
void Error_Handler(void){
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line){
}
#endif
Когда я смотрю на файл startup_stm32f407xx.s, в код включаются следующие строки.
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
Как вы думаете, где ошибка? Заранее спасибо.