本章内容主要实现从官网上下载一个FreeRTOS例程,并去做一些简单的程序改写,实现串口调试的功能。例程以STM32F103为例。
经过本次设计,可以在实现串口输出UART TEST。但这还没有使用FreeRTOS
获取一个FreeRTOS例程
下载方法
到FreeRTOS官网,点击下载
选择第一个进行下载
找到例程源码
接下来是找到例程源码的路径,以STM32F103为例
路径为:\FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil
其中FreeRTOSv202212.01是官网下载的包
打开工程,提示如下信息,点击红框选项,这是将原文件的KEIL4更新为KEIL5
更新完成后,重新打开工程。编译0错误0警告
修改官方源码
由于没有官方的LCD,所以改用串口来进行调试。
为了防止很多的错误,这里并不删除LCD相关的内容,只对main进行修改和添加自己的串口调试代码。
注意:这种方法当然是会存在大量冗余代码,但该文章的目的是快速搭建一个可以进行调试FreeRTOS例程,而不是注重怎么修改源码。
main函数修改
在main函数中只保留两个函数,这之间的函数注释掉
修改之后编译,有两个定义了但未使用的警告,不用在意。
添加串口初始化代码
在工程文件的Demo Files的serial.c中进行添加串口初始化代码。
同样,这里并不删除serial.c的任何东西,也会产生大量冗余,但这不妨碍调试。
具体初始化代码如下(直接复制即可):
void SerialPortInit(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable USART1 clock */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );
/* Configure USART1 Rx (PA10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init( GPIOA, &GPIO_InitStructure );
/* Configure USART1 Tx (PA9) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init( GPIOA, &GPIO_InitStructure );
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Clock = USART_Clock_Disable;
USART_InitStructure.USART_CPOL = USART_CPOL_Low;
USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_InitStructure.USART_LastBit = USART_LastBit_Disable;
USART_Init( USART1, &USART_InitStructure );
USART_Cmd( USART1, ENABLE );
}
将上述代码添加到下图的位置
在.c添加完成之后:
- 在serial.h中去声明一下这个函数
- 在main的prvSetupHardware函数之后调用该函数
改写fputc
fputc在源码中已经改写过了,这里需要查找到原来的fputc把它删除掉。之后在serial.c中重新编写
将fputc添加到SerialPortInit函数之前
具体代码如下:
int fputc( int ch, FILE *f )
{
USART_TypeDef* USARTx = USART1;
while((USARTx->SR & (1<<7)) == 0);
USARTx->DR = ch;
return ch;
}
最终main函数
int main( void )
{
#ifdef DEBUG
debug();
#endif
prvSetupHardware();
SerialPortInit();
printf("UART TEST\r\n");
vTaskStartScheduler();
return 0;
}