使用STM32F407VET6移植RT-Thread GitHub源码(基于RTT官方keil移植教程)
相当于官方教程的简单翻新,凑活看吧
例程实现
- 复制通用模板
- 使用 CubeMX 工具配置工程
- 修改 BSP 中的 Kconfig 文件
- 修改构建工程相关文件
- 重新生成工程
1.下载RT-Thread 源码
下载源码: RT-Thread GitHub源码.
2.复制通用模板
复制f4系列的通用模板
修改名称放在指定目录下(放在这个目录下不用修改后续的Kconfig中RTT源码所在的根目录)
3.CubeMX配置
打开: CubeMX.(一款图形化设置STM32工程软件)
CubeMX中打开RCC,SYS,USART1
配置时钟频率,基本默认就行
文件路径默认就行
生成代码
4.文件修改
在 board/board.c 文件中存放了函数 SystemClock_Config()
,该函数负责初始化系统时钟。当使用 CubeMX 工具对系统时钟重新配置的时候,需要将board/CubeMX_Config/Src/main.c文件中的 SystemClock_Config()
复制到 board/board.c 中 。
在 board/board.h 修改flash与ram的值
修改 board/Kconfig
:- 芯片型号和系列 - BSP 上的外设支持选项
修改link.sct 中flash与ram的值
修改如下
board/SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件。
在这一步中需要修改芯片型号以及芯片启动文件的地址,修改内容如下图所示:
5.keil模板文件修改
打开keil模板工程文件
配置芯片型号及下载器
6.env工具生成mdk5工程
在对应目录中使用env工具
在 env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示:
打开外设
生成mdk5工程
简单测试
信号量同步测试,线程1实现1s点亮一下led灯,线程2接受线程1 500ms后发送的信号量关闭led灯。
/****************************************************变量定义*****************************************************/
static rt_thread_t led_thread;
static rt_thread_t usart2_recv_thread = RT_NULL;
/****************************************************线程入口函数声明*****************************************************/
void led_threa_entry(void *parameter);
void usart2_recv_thread_entry(void *parameter);
/****************************************************线程初始化声明*****************************************************/
void TaskInit(void)
{
usart2_recv_sem=rt_sem_create("usart2_recv_sem",//串口2信号量
0,
RT_IPC_FLAG_FIFO);
if(usart2_recv_sem!= RT_NULL)
{rt_kprintf("信号量usart2_recv_sem创建成功\n\n");
}
led_thread = rt_thread_create("ledThread",//创建线程led
led_threa_entry,
RT_NULL,
256,
2,
10);
if(led_thread != RT_NULL)
{
rt_thread_startup(led_thread);
}
usart2_recv_thread= rt_thread_create("usart2_recv_thread",//创建线程usart
usart2_recv_thread_entry,
RT_NULL,
512,
2,
10);
if(usart2_recv_thread != RT_NULL)
{
rt_thread_startup(usart2_recv_thread);
}
}
MSH_CMD_EXPORT(TaskInit, show RT-Thread version information);
/****************************************************入口函数编写*****************************************************/
void led_threa_entry(void *parameter)
{
while(1)
{
rt_pin_write(LED0_PIN, PIN_HIGH);rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_kprintf("System Running time :%d s\n",rt_tick_get()/RT_TICK_PER_SECOND);
rt_sem_release(usart2_recv_sem);rt_thread_mdelay(500);
}
}
void usart2_recv_thread_entry(void *parameter)
{
rt_err_t uwRet = RT_EOK;
while(1)
{
uwRet=rt_sem_take(usart2_recv_sem, RT_WAITING_FOREVER);
if(RT_EOK==uwRet)
{
rt_pin_write(LED1_PIN, PIN_HIGH);rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
}
在主函数中调用开启这两个线程。
int main(void)
{
TaskInit();
while (1)
{
rt_thread_mdelay(500);
}
}