RT-Thread 学习笔记
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
本文基于RTT官方参考文档记录本人RTT使用过程觉得有助于项目开发的一些理解。
硬件:
1.stm32f103c8t6最小系统板
2.st_link v2
3.CANalyst-Ⅱ
软件:
1.RT-Thread Studio
2.USB_CAN Tool
提示:以下是本篇文章正文内容,下面案例可供参考
一、新建工程要做的事
1.时钟相关
在board.h中修改时钟配置
/*-------------------------- CLOCK CONFIG BEGIN --------------------------*/
#define BSP_CLOCK_SOURCE ("HSE")
#define BSP_CLOCK_SOURCE_FREQ_MHZ ((int32_t)8)
#define BSP_CLOCK_SYSTEM_FREQ_MHZ ((int32_t)72)
/*-------------------------- CLOCK CONFIG END --------------------------*/
在drv_clk.c中修改时钟配置
void system_clock_config(int target_freq_Mhz)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
2 .打开设备驱动的三个开关
由顶层到底层有三个配置文件控制着设备驱动代码是否参与编译,通过里面的宏定义修改配置
1.rtconfig.h
在studio中由RT_Thread Setting 配置,在设备层面控制着设备驱动框架层的代码文件如can.c/h。
2.board.h
决定设备驱动层的代码如drv_can.c/h是否参加编译,注意该层文件需要从\RT-ThreadStudio\repo\Extract\RT-Thread_Source_Code\RT-Thread\5.0.2\bsp\stm32\libraries\HAL_Drivers手动添加到工程中
3.stm32f1xx_hal_conf.h
决定hal库中该设备相对应的代码是否参加编译。
二、设备驱动(以CAN设备的写操作为例)
使用设备前要先填写void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)函数初始化引脚和外设时钟,这一步的代码可由cubemx生成,该函数名已在hal库的初始化列表中,启动自动执行。
C语言中用结构体来定义类
以上各类系继承关系,通过共用一个rt_object父类地址联系起来,在rt_can_write函数中通过can = (struct rt_can_device *)dev;以使用驱动层的设备操作方法_can_ops._can_sendmsg。
特别的是最子类stm32_can在注册rt_device设备时传给了device->user_data,在_can_sendmsg函数中通过hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle;把要使用的can设备句柄拿出来,
三、CAN通信控制伺服电机
1.过滤表设置
2.过滤表设置
总结
1.开发快速查表
提示:这里对文章进行总结:
未完///