|
移植硬汉的串口例程,STM32H7 串口发送无输出问题,1.9的HAL初始化后, 移植硬汉串口例程,串口没输出程序会跑一会儿会卡死
现象,串口无输出printf,RTT printf有输出,运行一会儿会导致程序卡死,表现为按键无反应,RTT printf也会卡死掉,按键什么都没反应。
按照H7 MX 1.9版本自动生成的初始化配置,串口打印正常。跟踪程序卡死在如截图位置,是啥问题头大,之前F407移植也卡在串口这里.
主函数
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t ucKeyCode; /* 按键代码 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
//HAL_Init();
/* USER CODE BEGIN Init */
button_init(&btn1, read_button1_GPIO, 0);
/* USER CODE END Init */
/* Configure the system clock */
//SystemClock_Config();
/* USER CODE BEGIN SysInit */
bsp_Init();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
//MX_USART1_UART_Init();
//MX_ADC3_Init();
//MX_TIM2_Init();
/* USER CODE BEGIN 2 */
bsp_StartAutoTimer(0, 300); /* 启动1个100ms的自动重装的定时器,软件定时器0 */
bsp_StartAutoTimer(1, 1000); /* 启动1个100ms的自动重装的定时器,软件定时器1 */
printf("\r\n This is a STM32H743VI DEMO Test! \r\n");
SEGGER_RTT_printf(0,"This is a STM32H743VI DEMO Test!\r\n");
button_attach(&btn1, PRESS_DOWN, button_callback);
button_attach(&btn1, PRESS_UP, button_callback);
button_attach(&btn1, PRESS_REPEAT, button_callback);
button_attach(&btn1, SINGLE_CLICK, button_callback);
button_attach(&btn1, DOUBLE_CLICK, button_callback);
button_attach(&btn1, LONG_RRESS_START, button_callback);
button_attach(&btn1, LONG_PRESS_HOLD, button_callback);
button_start(&btn1);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if (bsp_CheckTimer(1))
{
/* 每隔1000ms 进来一次 */
bsp_LedToggle(1);
SEGGER_RTT_printf(0, "bsp_CheckTimer(1)** SEGGER RTT **\r\n");
printf("\r\n This is a STM32H743VI DEMO Test! \r\n");
comSendChar(COM1, 'A');
}
/* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
ucKeyCode = bsp_GetKey(); /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
if (ucKeyCode != KEY_NONE)
{
switch (ucKeyCode)
{
case KEY_DOWN_K1:
printf("KEY_DOWN_K1\r\n");
SEGGER_RTT_printf(0,"KEY_DOWN_K1\r\n");
break;
case KEY_UP_K1:
printf("KEY_UP_K1---\r\n");
SEGGER_RTT_printf(0,"KEY_UP_K1\r\n");
break;
case KEY_LONG_DOWN_K1:
printf("KEY_LONG_DOWN_K1\r\n");
SEGGER_RTT_printf(0,"KEY_LONG_DOWN_K1\r\n");
break;
case KEY_LONG_UP_K1:
printf("KEY_LONG_UP_K1\r\n");
SEGGER_RTT_printf(0,"KEY_LONG_UP_K1\r\n");
break;
case KEY_AUTO_K1:
printf("KEY_AUTO_K1\r\n");
SEGGER_RTT_printf(0,"KEY_AUTO_K1\r\n");
break;
case KEY_DB_K1:
printf("KEY_DB_K1***\r\n");
SEGGER_RTT_printf(0,"KEY_DB_K1\r\n");
break;
default:
/* 其它的键值不处理 */
break;
}
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
串口初始化函数
static void InitHardUart(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
/*
下面这个配置可以注释掉,预留下来是为了方便以后选择其它时钟使用
默认情况下,USART1和USART6选择的PCLK2,时钟100MHz。
USART2,USART3,UART4,UART5,UART6,UART7和UART8选择的时钟是PLCK1,时钟100MHz。
*/
RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
RCC_PeriphClkInit.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
#if UART1_FIFO_EN == 1 /* 串口1 */
/* 使能 GPIO TX/RX 时钟 */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStruct);
/* 配置NVIC the NVIC for UART */
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* 配置波特率、奇偶校验 */
bsp_SetUartParam(USART1, UART1_BAUD, UART_PARITY_NONE, UART_MODE_TX_RX);
SET_BIT(USART1->ICR, USART_ICR_TCCF); /* 清除TC发送完成标志 */
SET_BIT(USART1->RQR, USART_RQR_RXFRQ); /* 清除RXNE接收标志 */
// USART_CR1_PEIE | USART_CR1_RXNEIE
SET_BIT(USART1->CR1, USART_CR1_RXNEIE); /* 使能PE. RX接受中断 */
#endif
void bsp_SetUartParam(USART_TypeDef *Instance, uint32_t BaudRate, uint32_t Parity, uint32_t Mode)
{
UART_HandleTypeDef huart1;
/*##-1- 配置串口硬件参数 ######################################*/
/* 异步串口模式 (UART Mode) */
/* 配置如下:
- 字长 = 8 位
- 停止位 = 1 个停止位
- 校验 = 参数Parity
- 波特率 = 参数BaudRate
- 硬件流控制关闭 (RTS and CTS signals) */
huart1.Instance = Instance;
huart1.Init.BaudRate = BaudRate;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = Parity;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.Mode = Mode;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.Init.Mode = UART_FIFOMODE_DISABLE;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
ERROR_HANDLER();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
ERROR_HANDLER();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
ERROR_HANDLER();
}
if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
{
ERROR_HANDLER();
}
}
GPIO 配置
#include "bsp.h"
/* 串口1的GPIO PB14, PB15 RS323 DB9接口 */
#define USART1_CLK_ENABLE() __HAL_RCC_USART1_CLK_ENABLE()
#define USART1_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART1_TX_GPIO_PORT GPIOB
#define USART1_TX_PIN GPIO_PIN_14
#define USART1_TX_AF GPIO_AF4_USART1
#define USART1_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
#define USART1_RX_GPIO_PORT GPIOB
#define USART1_RX_PIN GPIO_PIN_15
#define USART1_RX_AF GPIO_AF4_USART1
|
-
|