首页 > 资讯 > > 正文

关注:RK3588开发板(armsom-w3)之PWM实操

来源:jf_30051736 2023-06-10 16:59:55

PWM介绍

专栏总目录PWM是脉宽调制(Pulse Width Modulation)的缩写。它是一种用于控制电子设备的技术,通过改变电信号的脉冲宽度来实现对设备的控制。

PWM基本概念

PWM信号由一个固定频率的周期性脉冲序列组成,每个脉冲的宽度(持续时间)可以根据需要进行调节。调节脉冲宽度的比例可以改变平均电压或电流的大小,从而实现对设备的控制。

当谈论PWM时,以下三个关键术语经常被提及:

频率(Frequency):PWM信号的频率是指每秒钟内脉冲的数量。


(相关资料图)

周期(Period):PWM信号的周期是指一个完整脉冲序列所花费的时间。它是频率的倒数,以秒为单位表示。周期可以通过将频率的倒数计算得到,例如,一个10kHz的PWM信号的周期为0.1毫秒(100微秒)。

占空比(Duty Cycle):占空比是指PWM信号中脉冲宽度与周期之间的比例关系。它表示了脉冲在一个周期中所占据的时间比例,通常以百分比表示。占空比为0%意味着脉冲不存在(完全低电平),而占空比为100%表示脉冲持续时间占据了整个周期(完全高电平)。在实际应用中,占空比可以在0%到100%之间任意调整,以实现所需的控制效果。

PWM驱动

pwm驱动是一个通用的驱动,SOC厂家都会在SDK里面默认打开

驱动文件

驱动文件所在位置:

drivers/pwm/pwm-rockchip.c

默认SDK已经加载好了PWM的驱动,下文我们主要注意PWM怎么使用

DTS 节点配置

DTS 配置参考文档

Documentation/devicetree/bindings/pwm/pwm.txt

以下为一个例子的示例

Node name { compatible = "Driver matching character"; pwms = < &pwmX 0 25000 0 >; }; &pwmX { status = "okay"; pinctrl-names = "active"; pinctrl-0 = < &pwmX_pin_pull_down >; };

pwms的几个参数说明如下:

参数 1,表示 index (per-chip index of the PWM to request),一般是 0,因为我们 Rockchip PWM 每个chip 只有一个。

参数 2,表示 PWM 输出波形的时间周期,单位是 ns;例如下面配置的 25000 就是表示想要得到的

PWM 输出周期是 40K 赫兹。

参数 3,表示极性,为可选参数;下面例子中的配置为负极性。

PWM使用

PWM 提供了用户层的接口,在 /sys/class/pwm/ 节点下面,PWM 驱动加载成功后,会在/sys/class/pwm/ 目录下产生 pwmchip0 目录;向 export 文件写入 0,就是打开 pwm 定时器0,会产生一个 pwm0 目录,相反的往 unexport 写入 0 就会关闭 pwm 定时器了,同时 pwm0 目录会

被删除,该目录下有以下几个文件:

enable:写入 1 使能 pwm,写入 0 关闭 pwm;

polarity:有 normal 或 inversed两个参数选择,表示输出引脚电平翻转;

duty_cycle:在 normal 模式下,表示一个周期内高电平持续的时间(单位:纳秒),在

reversed 模式下,表示一个周期中低电平持续的时间(单位:纳秒);

period:表示 pwm 波的周期(单位:纳秒);

以下是 pwmchip0 的例子,设置 pwm0 输出频率 100K,占空比 50%, 极性为正极性:

cd /sys/class/pwm/pwmchip0/echo 0 > exportcd pwm0echo 10000 > periodecho 5000 > duty_cycleecho normal > polarityecho 1 > enable

PWM应用实例

通常电子设备中应用pwm是比较常见的,比如风扇电机控制,电视背光控制, LED 照明调光、电动工具马达控制、汽车加热器等领域。

这里简单介绍一下pwm控制LED灯实现呼吸灯效果。

呼吸灯需要灯的驱动与PWM的驱动结合,两个驱动之间传递数据,我们可以在驱动中调用其他的驱动。

led是我需要的设备,这个设备用到了pwm,而pwm是用默认的驱动。

硬件上我们在开发板找到具有pwm功能的引脚

设备树的修改如下:

/{breathing_light {compatible = "lhd,breathing_light_test";backlight {pwms = < &pwm8 0 25000 0 >;pwm-names = "breathing_light"; };};};&pwm8 {status = "okay";};

写一个驱动。内部在使用PWM子系统。形成了包含驱动的驱动。

示例代码

驱动程序

#include < linux/init.h >#include < linux/module.h >#include < linux/fs.h >#include < linux/cdev.h >#include < linux/uaccess.h >#include < linux/types.h >#include < linux/kernel.h >#include < linux/delay.h >#include < linux/ide.h >#include < linux/errno.h >#include < linux/gpio.h >//#include < asm/mach/map.h >#include < linux/of.h >#include < linux/of_address.h >#include < linux/of_gpio.h >#include < asm/io.h >#include < linux/device.h >#include < linux/platform_device.h >#include < linux/pwm.h >#define RED_LED_DTS_COMPATIBLE       "lhd,breathing_light_test"       /* 设备树节点匹配属性 */#define LED_PWM_CMD_SET_DUTY         0x01#define LED_PWM_CMD_SET_PERIOD       0x02#define LED_PWM_CMD_SET_BOTH         0x03#define LED_PWM_CMD_ENABLE           0x04#define LED_PWM_CMD_DISABLE          0x05struct led_pwm_param{    int duty_ns;    int period_ns;};struct red_led_dev {    dev_t dev_no;                        struct cdev chrdev;                struct class *led_class;    struct device_node *dev_node;    struct pwm_device *red_led_pwm;};static struct led_pwm_param led_pwm;static struct red_led_dev led_dev;static int red_led_drv_open (struct inode *node, struct file *file){    int ret = 0;    //pwm_set_periodnnn(led_dev.red_led_pwm, PWM_POLARITY_INVERSED);//设置PWM信号的极性pwm_enable(led_dev.red_led_pwm);//启用指定PWM设备,使其开始输出PWM信号。    printk("red_led_pwm open");    return ret;}static ssize_t red_led_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset){    int err;    if (size != sizeof(led_pwm)) return -EINVAL;err = copy_from_user(&led_pwm, buf, size);    if (err > 0) return -EFAULT;pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns);//配置PWM设备的基本参数,如频率、占空比等。    printk("red_led_pwm write");return 1;}static long drv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){    int ret = 0;    void __user *my_user_space = (void __user *)arg;        switch (cmd)    {        case LED_PWM_CMD_SET_DUTY:            ret = copy_from_user(&led_pwm.duty_ns, my_user_space, sizeof(led_pwm.duty_ns));            if (ret > 0) return -EFAULT;            pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns);            break;        case LED_PWM_CMD_SET_PERIOD:            ret = copy_from_user(&led_pwm.period_ns, my_user_space, sizeof(led_pwm.period_ns));            if (ret > 0) return -EFAULT;            pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns);            break;        case LED_PWM_CMD_SET_BOTH:             ret = copy_from_user(&led_pwm, my_user_space, sizeof(led_pwm));            if (ret > 0) return -EFAULT;            pwm_config(led_dev.red_led_pwm, led_pwm.duty_ns, led_pwm.period_ns);            break;        case LED_PWM_CMD_ENABLE:            pwm_enable(led_dev.red_led_pwm);            break;        case LED_PWM_CMD_DISABLE:            pwm_disable(led_dev.red_led_pwm);            break;    }    return 0;}static int red_led_drv_release(struct inode *node, struct file *filp){    int ret = 0;    pwm_config(led_dev.red_led_pwm, 0, 5000);//配置PWM设备的基本参数,如频率、占空比等。    printk("led pwm dev close");//    pwm_disable(led_dev.red_led_pwm);    return ret;}static struct file_operations red_led_drv = {.owner = THIS_MODULE,.open    = red_led_drv_open,.write   = red_led_drv_write,    .unlocked_ioctl = drv_ioctl,    .release  = red_led_drv_release,};/*设备树的匹配列表 */static struct of_device_id dts_match_table[] = {    {.compatible = RED_LED_DTS_COMPATIBLE, },      {},                  };static int led_red_driver_probe(struct platform_device *pdev){    int err;    int ret;    struct device *tdev;    struct device_node *child;    tdev = &pdev- >dev;    child = of_get_next_child(tdev- >of_node, NULL);      /* 获取设备树子节点 */if (!child) {        return -EINVAL;    }    led_dev.red_led_pwm = devm_of_pwm_get(tdev, child, NULL);     /* 从子节点中获取PWM设备,设备树获取这个设备就可以了 */    if (IS_ERR(led_dev.red_led_pwm)) {        printk(KERN_ERR"can"t get breathing_light!!");        return -EFAULT;    }    ret = alloc_chrdev_region(&led_dev.dev_no, 0, 1, "breathing_light");//动态分配字符设备的主设备号if (ret < 0) {pr_err("Error: failed to register mbochs_dev, err: %d", ret);return ret;}cdev_init(&led_dev.chrdev, &red_led_drv);//初始化字符设备结构体cdevcdev_add(&led_dev.chrdev, led_dev.dev_no, 1);//将已经初始化的字符设备结构体cdev添加到系统中    led_dev.led_class = class_create(THIS_MODULE, "breathing_light");//创建一个设备类(device class)并注册到内核中err = PTR_ERR(led_dev.led_class);if (IS_ERR(led_dev.led_class)) {        goto failed1;}    tdev = device_create(led_dev.led_class , NULL, led_dev.dev_no, NULL, "breathing_light"); //创建一个设备实例并注册到设备类中    if (IS_ERR(tdev)) {        ret = -EINVAL;goto failed2;}   printk(KERN_INFO"%s %s line %d", __FILE__, __FUNCTION__, __LINE__);        return 0;failed2:    device_destroy(led_dev.led_class, led_dev.dev_no);    class_destroy(led_dev.led_class);failed1:    cdev_del(&led_dev.chrdev);unregister_chrdev_region(led_dev.dev_no, 1);    return ret;}int led_red_driver_remove(struct platform_device *dev){    // pwm_disable(led_dev.red_led_pwm);    // pwm_free(led_dev.red_led_pwm);    printk(KERN_INFO"driver remove %s %s line %d", __FILE__, __FUNCTION__, __LINE__);    device_destroy(led_dev.led_class, led_dev.dev_no);class_destroy(led_dev.led_class);unregister_chrdev_region(led_dev.dev_no, 1);    cdev_del(&led_dev.chrdev);         return 0;}static struct platform_driver red_led_platform_driver = {      .probe = led_red_driver_probe,      .remove = led_red_driver_remove,      .driver = {        .name = "lhd,breathing_light_test",        .owner = THIS_MODULE,        .of_match_table = dts_match_table,         //通过设备树匹配      },};module_platform_driver(red_led_platform_driver);MODULE_AUTHOR("LHD");MODULE_LICENSE("GPL");

将上述驱动编译为ko文件然后push进3588开发板里面

应用层程序

#include "stdio.h"#include < sys/types.h >#include < sys/stat.h >#include < fcntl.h >#include < unistd.h >#include < stdio.h >#include < string.h >#include < sys/ioctl.h >#include < poll.h >#include < stdint.h >#define DEV_NAME   "/dev/breathing_light"#define LED_PWM_CMD_SET_DUTY         0x01#define LED_PWM_CMD_SET_PERIOD       0x02#define LED_PWM_CMD_SET_BOTH         0x03#define LED_PWM_CMD_ENABLE           0x04#define LED_PWM_CMD_DISABLE          0x05struct led_pwm_param {    int duty_ns;    int period_ns;};void sleep_ms(unsigned int ms){    struct timeval delay;delay.tv_sec = 0;delay.tv_usec = ms * 1000; select(0, NULL, NULL, NULL, &delay);}int main(int argc, char **argv){    int fd;    int ret;  /* 2. 打开文件 */fd = open(DEV_NAME, O_RDWR | O_NONBLOCK);   // | O_NONBLOCKif (fd < 0){printf("can not open file %s, %d", DEV_NAME, fd);return -1;}         int buf = 3;struct led_pwm_param led_pwm;led_pwm.duty_ns = 500;led_pwm.period_ns = 5000;    write(fd, &led_pwm, sizeof(led_pwm));    sleep_ms(3000);while(1){if(led_pwm.duty_ns<=500){while(led_pwm.duty_ns< led_pwm.period_ns){ioctl(fd, LED_PWM_CMD_SET_DUTY, &led_pwm.duty_ns);sleep_ms(50);led_pwm.duty_ns += 300;}}else{while(led_pwm.duty_ns > 500){ioctl(fd, LED_PWM_CMD_SET_DUTY, &led_pwm.duty_ns);sleep_ms(50);led_pwm.duty_ns -= 300;}}}close(fd);        return 0;}

使用3588自带的编译器将用户程序编译进开发板

prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc apptest_breathing_light_.c -o testpwm

adb push path/testpwm /userdata

chmod 777 testpwm

./testpwm

最后可以看到灯明灭交替的效果

审核编辑:汤梓红

x
推荐阅读

关注:RK3588开发板(armsom-w3)之PWM实操

2023-06-10 16:59:55

滚动:秋冬想要曼妙的身材,让三木教你用一条腰带来提升气质,时髦高级

2023-06-10 16:37:11

陈根:脸部穿戴设备将嗅觉带入虚拟现实世界

2023-06-10 16:15:08

生态环境好,好经济来“落脚”|天天精选

2023-06-10 15:59:23

苏宁易购南区启动618省钱风暴 助推释放年中消费潜力 天天头条

2023-06-10 15:50:40

逮捕中社会危险性条件核心地位逻辑证成

2023-06-10 15:25:47

今日热文:秋葵炒蛋的做法王刚?

2023-06-10 14:55:02

【世界速看料】导管是什么组织(导管是什么意思?)

2023-06-10 15:09:06

2楼房子不好卖的原因

2023-06-10 14:29:05

环球热点!跨越山海的“寻亲路” 男子走散26年后与家人团聚

2023-06-10 14:20:12
相关新闻

关注:RK3588开发板(armsom-w3)之PWM实操

2023-06-10 16:59:55

滚动:秋冬想要曼妙的身材,让三木教你用一条腰带来提升气质,时髦高级

2023-06-10 16:37:11

陈根:脸部穿戴设备将嗅觉带入虚拟现实世界

2023-06-10 16:15:08

生态环境好,好经济来“落脚”|天天精选

2023-06-10 15:59:23

苏宁易购南区启动618省钱风暴 助推释放年中消费潜力 天天头条

2023-06-10 15:50:40

逮捕中社会危险性条件核心地位逻辑证成

2023-06-10 15:25:47

今日热文:秋葵炒蛋的做法王刚?

2023-06-10 14:55:02

【世界速看料】导管是什么组织(导管是什么意思?)

2023-06-10 15:09:06

2楼房子不好卖的原因

2023-06-10 14:29:05

环球热点!跨越山海的“寻亲路” 男子走散26年后与家人团聚

2023-06-10 14:20:12

俄外交部:废止《欧洲常规武装力量条约》法律正式生效|观察

2023-06-10 14:01:16

科普图解 | 筑牢生态屏障!一图看懂我国防沙治沙新成就|天天报道

2023-06-10 13:50:03

简讯:“十年一遇”!数万人被疏散,加拿大山林野火为何失控?

2023-06-10 13:53:23

保卫萝卜4周赛6.10攻略 6月10日西游周赛图文通关流程[多图]

2023-06-10 13:28:20

微速讯:不常见的生僻字有哪些 不常见的生字有哪些?

2023-06-10 12:57:20

首台套50万千瓦冲击式水电机组项目开工

2023-06-10 12:58:51

世界热文:《P3重制版》实体盘疑泄露:PS4/5和NS版也曝光!

2023-06-10 12:30:05

环球观察:清穿之带着空间穿越清朝 清穿之带着空间生包子

2023-06-10 12:06:29

丢失sldinnerdispatchproxyu.dll的修复方法

2023-06-10 12:14:39

中东部天气延续“夹心”模式,长江中下游高温加码,本周末天气速览

2023-06-10 12:09:14

中午吃什么?(中午吃什么饭简单方便?)

2023-06-10 11:45:34

环球动态:杭州高考生喊话马化腾,让这个很多人的“世外桃源”,意外登上了热搜!

2023-06-10 10:55:25

中证协发布两项自律规则及配套文件 引导券商规范开展证券经纪业务

2023-06-10 09:44:59

加拿大东部野火未灭 西部野火继续蔓延 持续影响美国多地

2023-06-10 09:12:50

环球资讯:中韩面板攻防战升级

2023-06-10 06:56:59

世界看热讯:时间煮雨原唱 郁可唯_时间煮雨原唱

2023-06-10 02:44:05

笛卡尔积运算

2023-06-10 00:02:04

世界最资讯丨助残无碍 服务有爱|铁东街道开展助残公益活动

2023-06-09 22:15:30

专访《动物派对》制作人:不接受自己做庸俗的游戏

2023-06-09 20:31:10

试车日志|静态体验大众朗逸新锐 10万元燃油车再添一员_快资讯

2023-06-09 19:53:29

今日热讯:字节正在内部测试对话类AI项目

2023-06-09 18:00:02

每日快报!基金会跌至0元吗

2023-06-09 17:10:15

当前快播:电脑看图片软件哪个好_电脑看图片用什么软件

2023-06-09 17:03:04

俞敏洪没告诉我们的秘密:从一堆碎砖块到金字塔要走多远? 快看点

2023-06-09 16:15:55

“掘”战夏季!中联重科挖掘机批量交付内蒙古

2023-06-09 15:47:47

神农集团(605296.SH):公司未来发展规划为2027年实现年出栏500万头目标,目前在云南、广西、广东地区均有猪场开工建设 世界快讯

2023-06-09 14:51:23

世界新动态:蹭Uzi热度?Amber单杀Uzi,反超EDG:Uzi,登上热搜第一

2023-06-09 14:33:32

常山北明:在智慧城市、企业数字化转型等多个领域和项目均有智能机器人应用-天天热头条

2023-06-09 12:27:05

天天速讯:计算机感染病毒后的症状有(计算机感染病毒后一般有哪些症状)

2023-06-09 12:39:21

美国电视剧收视率排行榜前十名_拍电视的如何靠收视率赚钱

2023-06-09 11:18:10

礼乐文化儒家_礼乐文化

2023-06-09 11:24:44

尘肺病的症状有哪些(尘肺病有哪些症状)

2023-06-09 10:46:30

热点评!​乘联会:5月新能源乘用车出口9.2万辆,同比增长135.7%

2023-06-09 10:53:52

刚宣布:退市!10万股民难眠!

2023-06-09 10:27:03

全球今热点:山东大学代码a开头代码(山东大学代码)

2023-06-09 09:54:04

中国重汽:本公司主营为重型卡车整车及底盘的生产及销售 全球时快讯

2023-06-09 09:10:54

益阳市住房公积金官网(益阳市住房公积金查询)

2023-06-09 09:01:19

天天通讯!卉眼识车|全新采青车色、1.5TD动力星瑞扶摇版预售价11.28万元

2023-06-09 08:06:08

一汽奔腾NAT续航达成率97.85%,青岛网约车司机都在夸|环球微速讯

2023-06-09 07:46:53

时空科技:公司未开展热点题材涉及的“空间计算”业务及技术研发_焦点精选

2023-06-09 07:40:19

建设银行副行长纪志宏:构建企业级科技金融服务体系 实现“不看砖头看专利”

2023-06-09 07:17:04

世界快资讯:无锡地铁集团:变更“20锡铁03”的募集资金用途

2023-06-09 06:31:35

【土豆快讯】定了,上海二批次土拍摇号!

2023-06-09 06:11:57

豪越7座suv质量怎么样(日产7座suv有哪几款?)

2023-06-09 06:05:46

楼阳生到南阳市部分县调研并主持召开推进副中心城市建设座谈会 天天热文

2023-06-09 06:00:55

世界观点:攀爬车自行车(攀爬车)

2023-06-09 05:47:47

巴菲特也要接盘?37万亿抛售潮风雨欲来

2023-06-09 04:55:03

互联网+废品回收 回收处理行业将迎来新的发展机遇 废品回收行业市场发展现状

2023-06-09 04:51:27

世界快资讯:诸葛亮的八个经典故事绘本(诸葛亮的八个经典故事)

2023-06-09 04:30:02

环球焦点!澳、加升息 美国加息预期强化

2023-06-09 04:13:16

【2023高考图集】2023高考落下帷幕 是“结束”也是“开始”

2023-06-09 03:42:54

施耐德电气尹正:强化“中国中心”战略 赋能中国产业双转型

2023-06-09 03:02:16

第五届“第三只眼看中国”国际短视频大赛在京启动

2023-06-09 02:47:25

医生有话说⑫|体检查出肺结节怎么办?医生建议这样做

2023-06-09 02:54:04

世界快消息!中密控股:近两年 公司增量业务基本维持在50%左右占比

2023-06-09 02:20:09

全球今亮点!他说风雨中这点痛算什么 擦干泪(他说风雨中这点痛算什么)

2023-06-09 02:12:23

【快播报】可以考虑直接发钱给大家了

2023-06-09 02:07:56

从电量和综合效益来看 水电是贡献最大的可再生能源 水力发电行业现状调研-全球观天下

2023-06-09 01:45:51

第四家外商独资公募施罗德基金正式揭牌

2023-06-09 01:27:32

将“青少年模式”纳入标准 网络表演直播短视频领域再出新“团标”

2023-06-09 01:25:26

23福建债14票面利率为2.7400%

2023-06-09 01:08:06

山西运城民俗文化有哪些(运城市芮城民俗文化) 天天报资讯

2023-06-09 01:00:29

小飞象动画片1941普通话_小飞象动画片

2023-06-08 23:54:54

当前观察:高考试卷这种绝密文件,大家一辈子也就摸这么一次了……

2023-06-08 23:13:27

漫评 中老铁路:持续火爆的客货“成绩单” 让共赢之路愈加宽广

2023-06-08 22:42:03

【新要闻】iOS 17升级方法来了 一分钟搞定!完全免费

2023-06-08 22:02:31

资讯:从电量和综合效益来看 水电是贡献最大的可再生能源 水力发电行业现状调研

2023-06-08 21:43:15

win7怎么打开摄像头和麦克风权限(win7怎么打开摄像头)|世界播资讯

2023-06-08 21:25:22

一飞智控:一飞冲天 让无人机更加智能 资讯

2023-06-08 21:20:47

杨紫母亲持股一影视公司注销

2023-06-08 20:55:21

tvb万千星辉贺台庆2022下载_tvb万千星辉贺台庆2014

2023-06-08 21:03:50

部分省份今天下午结束高考 高考成绩6月下旬陆续公布 今日视点

2023-06-08 20:22:05

董明珠谈用人思路:只要是能干的人 我都给平台-每日看点

2023-06-08 20:21:50

热议:移动物联网终端将达百亿量级 成数字化智能化社会重要基础设施

2023-06-08 19:04:53

全球RSV疫苗“三国杀”箭在弦上,百亿美元市场争夺战打响 全球快报

2023-06-08 19:14:46

电梯第三方检测机构需要检测那些内容_电梯第三方检测机构

2023-06-08 18:54:39

【天天快播报】我国核电总装机容量 中国的核电装备制造技术及研发

2023-06-08 16:58:35

【天天播资讯】止跌信号出现能否止跌?

2023-06-08 16:45:10

持久流畅不卡顿,OPPO K11x性能有两把刷子

2023-06-08 16:09:08

天天资讯:俄罗斯假酒毒死30人

2023-06-08 15:57:48

兰州奥体中心地铁哪一站下车

2023-06-08 15:03:41

工人坠海失去意识 海警成功救助_天天热讯

2023-06-08 14:35:21

最资讯丨色带芯怎么装入色带架(色带芯是干什么的)

2023-06-08 13:35:07

虞书欣辟谣!透露吴建豪方不愿回应绯闻,网友质疑他故意蹭流量

2023-06-08 12:37:08

“长者数字生活工作坊”助力徐汇老人开启智慧生活

2023-06-08 11:17:46

来苏州河边,怎能错过这条花园式滨河岸线|家门口的好去处|热闻

2023-06-08 10:45:22

秘密读后感怎么写_秘密读后感 每日速看

2023-06-08 09:04:05

粗心考生考前丢失身份证 考点执勤民警1分钟帮其出证入场 今日播报

2023-06-08 08:09:05

记叙文写作方法与技巧_记叙文_每日讯息

2023-06-08 08:01:51

平安守护 时刻行动

2023-06-08 07:45:34