0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【御芯微UCM108E开发板试用体验】UCM108E二次开发-外部中断&&定时器&&PWM使用

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-11-24 17:03 次阅读

本文来源电子发烧友社区,作者:许鹏虎, 帖子地址:https://bbs.elecfans.com/jishu_2287620_1_1.html

UCM108E二次开发-外部中断&&定时器&&PWM使用

这节内容主要是介绍UCM108E的片内外设使用情况,同样也是用官方提供的二次开发demo来做进一步的开发。

GPIO外部中断

UC8188的GPIO使用起来比较简单,官方也提供了比较全面的函数库。GPIO控制器可以驱动或者获取信号/数据。通过相应的寄存器,可以定义I/O的功能、方向、状态以及中断。

GPIO的主要特点

  - 受控I/O个数微29
  - I/O输入/输出可配
  - 输入/输出状态:上拉、浮空
  - 所有I/O均可作为中断源,触发方式可配:低电平、高电平、上升沿、下降沿
  - I/O功能多重复用

同时也需要指出,GPIO的功能并没有类似于STM32类型的MCU多,比如IO都不支持下拉功能,所以在进行硬件设计的时候,需要详细参考GPIO特性,在硬件设计上面不足或者规避这些不足。

编写示例函数

操作GPIO为外部中断触发模式,主要是由以下几个步骤:

  1. 将IO设置为输入模式-->设置中断触发类型-->使能中断-->使能全局中断
static void trigger_gpio_init(void)
{
    gpio_set_pin_direction(UC_GPIO, TRIGGER_GPS_PPS_GPIO, GPIO_DIR_IN);
    gpio_set_irq_type(UC_GPIO, TRIGGER_GPS_PPS_GPIO, GPIO_IT_RISE_EDGE);
    gpio_set_irq_en(UC_GPIO, TRIGGER_GPS_PPS_GPIO, 1);
    gpio_int_enable();//enable gpio interrupt
    printf("trigger gpio pin init done.rn");
}
  1. 编写中断服务函数-->获取中断状态-->清除中断标记位
/*
 * [url=home.php?mod=space&uid=2666770]@Brief[/url]   GPIO interrupt service function
 * [url=home.php?mod=space&uid=3142012]@param[/url] 	None
 * @retval  None
 */
void gpio_handler(void)
{
    uint32_t pin, status;

    status = gpio_get_irq_status(UC_GPIO);  // get gpip irq status
    gpio_int_clear_pending();               // clear gpio interrupt pending

    for (pin = GPIO_PIN_0; pin <= GPIO_PIN_29; pin++) {
        if (status & (1 << pin)) {
            printf("GPIO %d INTERRPUTrn", pin);
        }
    }
}

注意:

  1. 中断标记位一定要在中断服务函数里面清除,不然下次无法继续触发中断
  2. 中断服务函数的入口是gpio_handler,在UC8188的单独示例中,中断服务函数是ISR_GPIO
  3. 在本示例工程的libraries/HAL_Drivers/drv_gpio.c中也有gpio_handler需要将此先屏蔽,然后自己实现这个中断服务函数

烧录运行

将上述代码编译完成后,烧录到开发板运行,然后手动触发GPIO25,可以看到中断打印

Time: 2022/6/18 19:53:38.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
Time: 2022/6/18 19:53:39.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
Time: 2022/6/18 19:53:40.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
Time: 2022/6/18 19:53:41.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
Time: 2022/6/18 19:53:42.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
Time: 2022/6/18 19:53:43.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT
Time: 2022/6/18 19:53:44.00
POS: ST 10, tLon 1.899968, tLat 0.596802, fAlt: 38.554977
GPIO 25 INTERRPUT

定时器

UC8188有两个独立的定时器,设计的也比较简单。

主要特点

  • 32位加计数器
  • 3位可编程(可以实时修改)预分频器,定时器时钟=系统时钟/(预分频系数+1)
  • 两种中断或事件类型可选择,即计数器溢出和比较结果相等触发

编写示例函数

我主要是用定时器来做一个精确计时,所以只用了定时中断功能。在确定定时时间之前,需要确定系统主频,分频系数等关键指标。通过研读代码我们可知在启动函数那里,配置了系统主频

addi   x11, x0, 70  //131.072Mhz-->0xc80000, 115200 for sim
  jal  uart_set_cfg
  1. 配置分频系数和计数值-->工作在计数模式-->使能计数溢出中断-->使能总中断
cfg.pre = 7;
	cfg.cnt = 0xffffffffU - ((SYSTEM_CLK>>8)/(cfg.pre+1))*1;// 1/256 S
	cfg.cmp = 0;//It must be 0 in this mode.
	timer_init(UC_TIMER1, &cfg);
	timer_enable(UC_TIMER1);
	timer_int_enable(UC_TIMER1, TIMER_IT_OVF);
	int_enable();
  1. 编写中断服务函数-->清除中断-->重新装入计数值-->做自己的业务
static int cnt = 0;

	timer_int_clear_pending(UC_TIMER1, TIMER_IT_OVF);
	// 这里和上面的初始化是一样的,简化了一下算法
	timer_set_count(UC_TIMER1, 0xffffffffU - (SYSTEM_CLK>>11));//1S]
    cnt++;
    if(cnt%0xff == 0){
        printf("timer1 overflow interrupt!!!rn");
    }

烧录运行

编译上述代码,在串口工具中应该会每隔1s打印一下

timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!
timer1 overflow interrupt!!!

PWM

PWM外设相对来说也是比较简单。

特点

  • 四路独立输出PWM
  • 可配置周期和占空比

编写示例函数

我的需求是,可以调节一个灯的亮度,并且可以周期的控制灯的闪烁逻辑。

  1. 确定PWM外接的GPIO管脚,使能对应的PWM--> 设置周期-->设置占空比
pwm_enable(UC_PWM3);
    pwm_set_period(UC_PWM3, 1000);
    pwm_set_duty(UC_PWM3, 300);
  1. 周期闪烁
while(1)
    {
        printf("cnt : %drn", cnt++);
        pwm_set_duty(UC_PWM3, 30);  // led on light:3%
        delay_ms(500);
        pwm_set_duty(UC_PWM3, 0);  // led off
        delay_ms(500);
    }

注意:这里我尝试使用pwm_enablepwm_disable来控制灯的亮灭,但是发现pwm_disable后GPIO默认是高电平,不符合我的设计需求,故用占空比为0表示灯灭,由于PWM外设过于简单,在做硬件设计的时候需要注意这里。

烧录运行

将上述代码烧录到开发板,可以看到1s一次打印cnt值,同时LED灯也在闪烁,改变duty可以改变led亮度

pwm test
cnt : 0
cnt : 1
cnt : 2
cnt : 3
cnt : 4
cnt : 5

总结

UC8188的外设使用起来很简单,也很实用。但是在做相关硬件设计时,需要注意。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 御芯微
    +关注

    关注

    4

    文章

    50

    浏览量

    3233
  • 开发板试用
    +关注

    关注

    3

    文章

    299

    浏览量

    1906
  • UCM108E
    +关注

    关注

    0

    文章

    13

    浏览量

    134
收藏 人收藏

    评论

    相关推荐

    在TSMaster中加载基于DotNet平台的Seed&amp;amp;amp;Key

    在UDS诊断过程中,会涉及到安全访问的问题,也就是所谓的Seed&amp;Key。TSMaster诊断模块支持通过.dll文件载入Seed&amp;Key算法用于安全访问解锁。在最近发布
    的头像 发表于 04-02 08:20 76次阅读
    在TSMaster中加载基于DotNet平台的Seed&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;Key

    安富利带你揭秘IP&amp;amp;E元器件的赋能之路

    IP&amp;E,是Interconnect(互连)、Passive(无源)和Electromechanical(机电)的缩写,代表着电子元器件中最为基础和重要的分支之一。
    的头像 发表于 03-26 18:18 560次阅读

    Open RAN的未来及其对AT&amp;amp;T的意义

    3月14日消息,在“Connected America 2024”会议上,AT&amp;T高级副总裁兼网络首席技术官Yigal Elbaz讨论了Open RAN 的未来及其对AT&amp;T的意义。
    的头像 发表于 03-14 14:40 190次阅读

    【电磁兼容技术文档分享】频谱仪应用案例&amp;amp;amp;简易探头的制作

    【电磁兼容技术文档分享】频谱仪应用案例&amp;简易探头的制作
    的头像 发表于 02-19 13:20 180次阅读
    【电磁兼容技术文档分享】频谱仪应用案例&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;简易探头的制作

    RK3568--基于AMP的多通道AD采集开发案(二)

    RK3568--基于AMP的多通道AD采集开发案(二)
    的头像 发表于 01-19 10:34 335次阅读
    RK3568--基于<b class='flag-5'>AMP</b>的多通道AD采集<b class='flag-5'>开发</b>案(二)

    RK3568--基于AMP的多通道AD采集开发

    RK3568--基于AMP的多通道AD采集开发
    的头像 发表于 01-19 10:03 279次阅读
    RK3568--基于<b class='flag-5'>AMP</b>的多通道AD采集<b class='flag-5'>开发</b>案

    R&amp;amp;S和Applus在EMC测试环境中完成eCall测试

    罗德与施瓦茨(以下简称R&amp;S)和Applus Laboratories完成电磁兼容性 (EMC) 测试环境中 eCall 测试。
    的头像 发表于 01-12 09:12 936次阅读
    R&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;S和Applus在EMC测试环境中完成eCall测试

    森木磊石CPEEC&amp;amp;amp;CPSSC 2023 展会圆满收官!

    2023中国电力电子与能量转换大会暨中国电源学会第二十六届学术年会及展览会(CPEEC&amp;CPSSC2023)是中国电源学会成立40周年纪念活动的重要环节。会议旨在促进电源、电力电子与能量转换
    的头像 发表于 11-16 08:22 251次阅读
    森木磊石CPEEC&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;CPSSC 2023 展会圆满收官!

    炫酷好玩的像素时钟&amp;amp;amp;音乐频谱,合宙ESP32-C3开发板创意DIY分享

    分享@亚里士不可得大佬的开源佳作——使用合宙ESP32-C3开发板自制像素时钟&amp;音乐频谱。在变幻的时间和跳跃的频谱中,开启属于你的秋日浪漫……像素时钟&amp;音乐频谱开源分
    的头像 发表于 10-21 08:04 491次阅读
    炫酷好玩的像素时钟&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;音乐频谱,合宙ESP32-C3<b class='flag-5'>开发板</b>创意DIY分享

    Zynq的AMP多核处理

    写的是Zynq 7000系列的,arm有两个核。主要有AMP和SMP两种方式,SMP是两个核运行一个操作系统,跑LINUX的话,使能SMP,资源会自动分配给两个核运行。AMP是两个核独立运行,每个核可以运行操作系统也可以裸机运行。
    的头像 发表于 10-17 16:59 277次阅读
    Zynq的<b class='flag-5'>AMP</b>多核处理

    合宙Air530Z+STM32,自制GNSS定位器&amp;amp;amp;授时器

    ——基于合宙Air530Z的定位器&amp;授时器,感兴趣的朋友请戳文末“阅读原文”下载最新资料。1项目主要准备工作基于合宙Air530Z的定位器&amp;授时器,使用STM32G030F6P6
    的头像 发表于 09-23 08:05 1497次阅读
    合宙Air530Z+STM32,自制GNSS定位器&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;授时器

    干簧技术-斯丹麦德液位传感器&amp;amp;浮子手册(新)

    电子发烧友网站提供《干簧技术-斯丹麦德液位传感器&amp;浮子手册(新).pdf》资料免费下载
    发表于 09-12 11:49 0次下载

    以太网&amp;amp;MVB从站转CAN网关功能简介

    NETMVBCANCOM系列是广州众志诚信息科技有限公司生产的以太网&amp;MVB转CAN&amp;串行接口系列协议转换模块。可以将以太网M12接口或者MVB的EMD接口或者ESD+接口转换为CAN或者RS232、RS485(ModBus协议)。
    发表于 08-01 14:43 1372次阅读
    以太网&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;MVB从站转CAN网关功能简介

    你使用shell脚本中的2&amp;gt;&amp;amp;1了吗?

    run_cmax > ./starrc_cmax.logs 2>&amp;1中的 2>&amp;1是啥意思?
    的头像 发表于 07-30 14:44 1059次阅读

    if(a==1 &amp;amp;&amp;amp; a==2 &amp;amp;&amp;amp; a==3),为true,你敢信?

    接下来咱们来尝试解决这个问题。假设 if(a==1&amp;&amp;a==12)是等于 true的,那么a肯定不可能是一个“普通的变量”。它势必要有能力在执行的时候能够动态改动值。
    的头像 发表于 05-08 11:01 750次阅读
    if(a==1 &<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>; a==2 &<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>; a==3),为true,你敢信?