Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AB32VG1
PWM
RT-Thread Studio
AB32VG1 PWM测评
发布于 2021-03-28 22:38:44 浏览:1191
订阅该版
一.硬件介绍 1.主控芯片介绍 AB5301A 基于 RISCV内核,具有125M主频 片上集成 RAM 192 KB,ROM 1MB,含有丰富的外设。包含ADC,DAC,PWM,USB,SD,UART等资源。 2.芯片中pwm相关外设 AB5301A中可以输出PWM的外设有两种。一种是TIM 高级定时器,另一种是PWM外设。高级定时器可以设置为定时器模式,计数器模式,输入捕获模式,PWM输出模式。 而PWM外设这是专门用来产生PWM的外设。 每一个输出PWM的外设都对应一个IO引脚来输出PWM方波。 T3对应 PB0 PWM0对应PE4 T4对应 PA6 PWM1对应PA1 T5对应 PE2 PWM2对应PA2 PE0 3.开发板RGB彩灯电路  开发板的RGB彩灯电路如上所示 相当于 三组LED灯集成到一起。当一个LED对应的IO输出为低电平时,LED点亮;为高时,LED熄灭。 二.测试方案 1.安装AB32VG1的板级支持包 点击 IDE上方栏目中的SDK Manager  点击安装板级支持包 Bluetrum的最新版本。  2.新建工程 选择基于开发板创建RT-Thread项目,开发板选择AB32VG1,给工程命名后点击完成。  3.配置系统 创建工程后工程目录结构如上所示。点击RT-Thread Settings配置工程选项。 若要使用PWM方式驱动RGB彩灯需要在硬件一栏点击Enable PWM的以下部分  PE1对应 t5pwm设备的 3通道 PE4对应lpwm0设备的1通道 PA2 对应lpwm2设备的3通道 4.编写测试代码  在工程项目中的applications 文件夹中新建pwm_test.c文件。 调用头文件 ``` #include
#include "board.h" ``` 定义新建线程相关的宏 以及线程块 ``` #define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 static rt_thread_t tid1 = RT_NULL; ``` 定义需要用到的PWM设备的名字与通道,以及相关的设备句柄 ``` #define R_PWM_DEV_NAME "t5pwm" /* PWM设备名称 */ #define G_PWM_DEV_NAME "lpwm0" /* PWM设备名称 */ #define B_PWM_DEV_NAME "lpwm2" /* PWM设备名称 */ #define R_PWM_DEV_CHANNEL 3 /* PWM通道 */ #define G_PWM_DEV_CHANNEL 1 /* PWM通道 */ #define B_PWM_DEV_CHANNEL 3 /* PWM通道 */ struct rt_device_pwm *RED; /* PWM设备句柄 */ struct rt_device_pwm *GREEN; struct rt_device_pwm *BLUE; ``` 定义全局变量 pwm 的周期 以及 红灯,绿灯,蓝灯,以及停止标志位 ``` rt_uint32_t period = 500000; rt_uint8_t green_flag,red_flag,blue_flag; rt_uint8_t stop_flag; ``` 创建 pwm_rgb_sample 测试函数 该函数的功能 一是查找相关 PWM设备 设定初值并且使能 二是创建一个动态线程并使能 将该函数导入到 命令列表中 ``` static int pwm_rgb_sample(int argc, char *argv[]) { /* 查找设备 */ RED = (struct rt_device_pwm *)rt_device_find(R_PWM_DEV_NAME); if (RED == RT_NULL) { rt_kprintf("pwm sample run failed! can't find %s device!\n", R_PWM_DEV_NAME); return RT_ERROR; } GREEN = (struct rt_device_pwm *)rt_device_find(G_PWM_DEV_NAME); if (GREEN == RT_NULL) { rt_kprintf("pwm sample run failed! can't find %s device!\n", G_PWM_DEV_NAME); return RT_ERROR; } BLUE = (struct rt_device_pwm *)rt_device_find(B_PWM_DEV_NAME); if (BLUE == RT_NULL) { rt_kprintf("pwm sample run failed! can't find %s device!\n", B_PWM_DEV_NAME); return RT_ERROR; } /* 设置PWM周期和脉冲宽度默认值 */ rt_pwm_set(RED, R_PWM_DEV_CHANNEL, period, period); rt_pwm_set(GREEN,G_PWM_DEV_CHANNEL, period, period); rt_pwm_set(BLUE, B_PWM_DEV_CHANNEL, period, period); /* 使能设备 */ rt_pwm_enable(RED, R_PWM_DEV_CHANNEL); rt_pwm_enable(GREEN, G_PWM_DEV_CHANNEL); rt_pwm_enable(BLUE, B_PWM_DEV_CHANNEL); /* 创建线程1,名称是thread1,入口是thread1_entry*/ tid1 = rt_thread_create("thread1", thread1_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); /* 如果获得线程控制块,启动这个线程 */ if (tid1 != RT_NULL) rt_thread_startup(tid1); } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_rgb_sample, pwm sample); ``` 新建的线程功能如下 主要是通过改变pwm的占空比实现呼吸灯的功能 通过命令行中改变 灯标志位 可以选择让哪一种颜色的灯亮 ``` static void thread1_entry(void *parameter) { rt_uint32_t count = 0; rt_uint32_t pulse, dir ; dir = 1; /* PWM脉冲宽度值的增减方向 */ pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */ rt_kprintf("thread1 running"); while (1) { /* 线程1采用低优先级运行,一直打印计数值 */ // rt_kprintf("thread1 count: %d\n", count ++); rt_thread_mdelay(5); if (dir) { pulse += 5000; /* 从0值开始每次增加5000ns */ } else { pulse -= 5000; /* 从最大值开始每次减少5000ns */ } if (pulse >= period) { dir = 0; } if (0 == pulse) { dir = 1; } /* 设置PWM周期和脉冲宽度 */ if(blue_flag) { rt_pwm_set(RED, R_PWM_DEV_CHANNEL, period, period); rt_pwm_set(GREEN,G_PWM_DEV_CHANNEL, period, period); rt_pwm_set(BLUE, B_PWM_DEV_CHANNEL, period, pulse); } if(red_flag) { rt_pwm_set(RED, R_PWM_DEV_CHANNEL, period, pulse); rt_pwm_set(GREEN,G_PWM_DEV_CHANNEL, period, period); rt_pwm_set(BLUE, B_PWM_DEV_CHANNEL, period, period); } if(green_flag) { rt_pwm_set(RED, R_PWM_DEV_CHANNEL, period, period); rt_pwm_set(GREEN,G_PWM_DEV_CHANNEL, period, pulse); rt_pwm_set(BLUE, B_PWM_DEV_CHANNEL, period, period); } if(stop_flag) { rt_pwm_set(RED, R_PWM_DEV_CHANNEL, period, period); rt_pwm_set(GREEN,G_PWM_DEV_CHANNEL, period, period); rt_pwm_set(BLUE, B_PWM_DEV_CHANNEL, period, period); } } } ``` 选择实现呼吸灯的颜色,以及停止的代码如下所示 ``` static int pwm_red_blink(int argc, char *argv[]) { red_flag=1; green_flag=blue_flag=0; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_red_blink, pwm red sample); static int pwm_green_blink(int argc, char *argv[]) { green_flag=1; red_flag=blue_flag=0; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_green_blink, pwm green sample); static int pwm_blue_blink(int argc, char *argv[]) { blue_flag=1; red_flag=green_flag=0; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_blue_blink, pwm blue sample); static int pwm_stop(int argc, char *argv[]) { blue_flag=0; red_flag=green_flag=0; stop_flag=1; } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(pwm_stop, pwm stop sample); ``` 5.编译与烧录 点击编译按钮对程序编译 编译成功后控制台输出如下  使用烧录软件选择相应的串口与dcf格式的文件烧录 烧录成功后控制台输出如下所示  调试的结果可以看视频,视频链接如下 https://b23.tv/pVqRkf 源码已上传到Gitee上面 链接如下 https://gitee.com/wangxinyv/ab32-vg1-pwm/tree/master/ 可以看到通过rtthread的 pwm设备驱动框架可以完成对 AB32VG1 主控PWM 外设的调用 至此可以对AB32VG1的 PWM测试已经完成。 三.心得体会 AB32VG1是一款功能强大的开发板,包含了我们嵌入式开发常用的外设。 虽然 RT-Thread对AB32VG1的外设支持还没有全面覆盖,但是基于RT-Thread对AB32VG1做一些简单的GPIO,UART,IIC,PWM,ADC,Timer开发已经足够。 使用RT-Thread的设备驱动框架进行PWM的开发整个过程非常顺畅,使用RT-Thread Settings来配置外设节省了研读芯片手册,研读芯片库函数, 编写驱动程序的时间。 对于PWM外设的开发我们只需关注应用程序的开发,只要熟悉RT-Thread的API, 调用这些函数来再应用程序中实现具体的逻辑,这大大提升了开发的效率。 AB5301A这款芯片从主频到ROM,RAM资源 都比同等价位的 STM32单片机都要高,在一些项目上可以考虑用它做stm32的替代品。 如果AB5301A的软件生态能够完善一些,相关的一些文档能够像stm32一样详细一些,对于蓝牙,USB等外设的支持更透明更成熟一些,这款基于RISCV架构的单片机将会有更光明的未来。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
BERH_5579
这家伙很懒,什么也没写!
文章
1
回答
6
被采纳
1
关注TA
发私信
相关文章
1
玩iot camera笔记之3测试试用3路pwm
2
[已解决]PWM输出异常分析
3
给RT-Thread添加PWM驱动框架
4
关于rt-thread-3.1.0 pwm
5
关于rt-thread的PWM框架在stm32f103vf应用的疑问
6
rt-thread stm32 bsp adc pwm 外设适配好了吗
7
stm32f103ze 添加pwm 设备失败
8
【正点原子】潘多拉IoT-STM32L475开发板 用menuconfig 看不到PWM....
9
关于rtthread 4.0.0版本中pwm的初始化定时器寄存器读写问题
10
RT-Thread正点原子战舰V3使用PWM设备驱动没有输出
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1520
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
550
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部