RT-Thread 学习二:基于 RT Thread studio (联合cubemx)的stm32l475VETX pwm 呼吸灯实验

2024-04-02 03:44

本文主要是介绍RT-Thread 学习二:基于 RT Thread studio (联合cubemx)的stm32l475VETX pwm 呼吸灯实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、基于芯片创建呼吸灯项目

基于rtthread studio 可以帮助我们创建好底层驱动,我们只需要做简单配置

2、配置pwm 设备

基于芯片生成的项目默认只打开了 uart 和 pin的驱动,对于其它硬件驱动需要自行配置; 

对于pwm和设备的驱动分为四步,官方在board.h 中也已经给出;

2.1、第一步 设置rtthreadseting:

官方给出sep1;

 STEP 1, open pwm driver framework support in the RT-Thread Settings file

打开我们的RT-Thread Settings file 找到组件下的设备并打开pwm开关;

2.2、sep2:设置宏定义

STEP 2, define macro related to the pwm  such as     #define BSP_USING_PWM1

在board.h中设置宏定义,这个需要根据自己所使用的tim定时器来确定,pwm1 d对应 tim1;

2.3:sep3 cubemx 配置tim定时器;

 * STEP 3, copy your pwm timer init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end if board.c file
such as     void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)  and void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim

打开项目下的Cube MX Settings

配置pE9 为TIM1 的 CH1;

然后打开tim1 定时器的设置;将 ch1 设置为比较输出:

然后保存并生成代码:

然后将 项目目录cubemx下的 stm32l4xx_hal_msp.c

中的三个函数复制到board.c的末尾;

/**
* @brief TIM_OC MSP Initialization
* This function configures the hardware resources used in this example
* @param htim_oc: TIM_OC handle pointer
* @retval None
*/
void HAL_TIM_OC_MspInit(TIM_HandleTypeDef* htim_oc)
{if(htim_oc->Instance==TIM1){/* USER CODE BEGIN TIM1_MspInit 0 *//* USER CODE END TIM1_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_TIM1_CLK_ENABLE();/* USER CODE BEGIN TIM1_MspInit 1 *//* USER CODE END TIM1_MspInit 1 */}}void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(htim->Instance==TIM1){/* USER CODE BEGIN TIM1_MspPostInit 0 *//* USER CODE END TIM1_MspPostInit 0 */__HAL_RCC_GPIOE_CLK_ENABLE();/**TIM1 GPIO ConfigurationPE9     ------> TIM1_CH1*/GPIO_InitStruct.Pin = GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);/* USER CODE BEGIN TIM1_MspPostInit 1 *//* USER CODE END TIM1_MspPostInit 1 */}}
/**
* @brief TIM_OC MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param htim_oc: TIM_OC handle pointer
* @retval None
*/
void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef* htim_oc)
{if(htim_oc->Instance==TIM1){/* USER CODE BEGIN TIM1_MspDeInit 0 *//* USER CODE END TIM1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_TIM1_CLK_DISABLE();/* USER CODE BEGIN TIM1_MspDeInit 1 *//* USER CODE END TIM1_MspDeInit 1 */}}

复制完之后; 打开drivers 里的 drv_pwm.c 找到 stm32_hw_pwm_init这个函数,在TIM初始化之前初始化以下时钟引脚。


在图里所示的位置调用这个函数

第三步就完成了:

2.4、sep 4 :配置config文件;

 * STEP 4, modify your stm32xxxx_hal_config.h file to support pwm peripherals. define macro related to the peripherals
 *                 such as     #define HAL_TIM_MODULE_ENABLED

找到driver 目录下的 stm32xxx_hal_config.h 文件,定义宏 #define HAL_TIM_MODULE_ENABLED

3、重新编译项目

如果cubemx 目录下出现报错,点击排除构建:

运行查看设备: pwm1 

新建文件编写测试应用函数控制 pwm :代码如下


#include <rtthread.h>
#include <rtdevice.h>
#define PWM_DEV_NAME "pwm1" /* PWM设 备 名 称 */
#define PWM_DEV_CHANNEL 1 /* PWM通 道 */
struct rt_device_pwm *pwm_dev; /* PWM设 备 句 柄 */
static int pwm_led_sample(int argc, char *argv[])
{
rt_uint32_t period, pulse, dir;
period = 500000; /* 周 期 为0.5ms, 单 位 为 纳 秒ns */
dir = 1; /* PWM脉 冲 宽 度 值 的 增 减 方 向 */
pulse = 0; /* PWM脉 冲 宽 度 值, 单 位 为 纳 秒ns */
/* 查 找 设 备 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
/* 设 置PWM周 期 和 脉 冲 宽 度 默 认 值 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/* 使 能 设 备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
while (1)
{
rt_thread_mdelay(50);
if (dir)
{
pulse += 5000; /* 从0值 开 始 每 次 增 加5000ns */
}
else
{
pulse -= 5000; /* 从 最 大 值 开 始 每 次 减 少5000ns */
}
if (pulse >= period)
{
dir = 0;
}
if (0 == pulse)
{
dir = 1;
}
/* 设 置PWM周 期 和 脉 冲 宽 度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}
}
/* 导 出 到 msh 命 令 列 表 中 */
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);

运行 pwm_led_sample 指令,观察led 灯运行效果:

这篇关于RT-Thread 学习二:基于 RT Thread studio (联合cubemx)的stm32l475VETX pwm 呼吸灯实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868874

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个