1. 生成初始化工程
我们使用rt-thread的已有bsp来生成我们需要的mdk5的工程,使用如下图的bsp基础工程
使用env工具来生成工程,在当前bsp目录下执行scons –dist ,然后在dist目录下就会生成相对应的工程
以下是生成后的目录结构
2. 工程配置
打开mdk5的工程,配置芯片和debug选项
3. 下载调试
工程默认用的console串口是uart2,我想在工程中用uart1作为console和DEBUG用的串口,所以直接在配置文件中做了修改,如下:
但是配置之后发现串口没有数据输出,那问题应该会出现在哪里呢,先从串口初始化的未知查起,我们知道HAL库中硬件的初始化都是在库中定义了一个__weak函数,这相当于一个接口函数真正的实现需要我们用户去实现一个同名的函数,rt-thread这块的实现全部放在了stm32fxx_hal_msp.c文件中,如下是关于串口实现的部分:
我们发现uart1的初始化函数传入的参数是 USART_HandleTypeDef husart ,关于uart和usart的解释如下:*
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。
具体实物表现为独立的模块化芯片,或作为集成于微处理器中的周边设备。一般是RS-232C规格的,与类似Maxim的MAX232之类的标准信号幅度变换芯片进行搭配,作为连接外部设备的接口。在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitter)。
我们再查看rt-thread中关于串口的初始化部分发现用的是HAL_UART_Init(), 所以我们的uart1是用的usart初始化函数,并没有被rt-thread初始化,这就是导致没有数据输出的原因
接下来我们把uart的HAL库初始化部分完善一下,如下:
/**
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA8 ------> USART1_CK
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART1_MspInit 1 */
/* USER CODE END USART1_MspInit 1 */
}
else if(huart->Instance==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART2_MspInit 1 */
/* USER CODE END USART2_MspInit 1 */
}
}
放在UART初始化函数中,然后重新编译下载,串口log数据打印出来了
4. 参考
https://www.rt-thread.org/document/site/application-note/setup/standard-project/an0017-standard-project/