3551|2

79

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

[GD32F310评测]中断测试和GPIO使用 [复制链接]

在本节我们将就上一次实现的按键功能进行改进,并提供一个按键响应函数,目前只是实现一个呼吸灯点亮和熄灭的切换功能,在之后将会起到其他的作用。

本节最核心的目标在于分析GD32芯片的中断机制,GPIO的使用和寄存器分析,并将代码进行整理。

中断配置

中断的设置对应使用指南的3.10节。301这款芯片能够支持24个独立配置的中断。其中给出了中断配置的函数概要,编程测或过程中可以通过查阅此手册来确定函数的调用。

但是在具体应用中需要关注用户手册中6.3节中的中断向量表。在本项目中采用的中断配置和端口配置函数如下:

 void peripheral_init()
 {
     // RCU:
     rcu_periph_clock_enable(RCU_GPIOA);  // GPIO A
     rcu_periph_clock_enable(RCU_CFGCMP); // CFGCMP clock
     
     // System tick
     systick_config();
     
     // GPIO config
     gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0); // Input Key
     gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1);  // Output Key
     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_1);
     gpio_bit_reset(GPIOA, GPIO_PIN_1);
     
     // NVIC
     nvic_irq_enable(EXTI0_1_IRQn, 2U, 0U); // GPIO A0 -> EXTI 0
     syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0); // GPIO A0 Interrupt enable
     exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING); 
     exti_interrupt_flag_clear(EXTI_0);
     
 }

接下来我们要在主函数中实现一个非常简单粗暴的PWM灯光渐变,这个例程将会一直保持到后面的各个例程中,作为判定是否出现系统死机的直观判定。

主循环中的PWM呼吸灯

下面给出PWM灯的主要逻辑

         static uint8_t pwmset;
         static uint16_t time;
         static uint8_t timeflag;
         static uint8_t timecount;
         static uint32_t tick_old;
         if ((tick - tick_old >= 1)) // 减少不要的循环
         {
             tick_old = tick;
 ​
             if (timeflag == 0)
             {
                 time++;
                 if (time >= 1600) timeflag = 1;
             }
             else
             {
                 time--;
                 if (time == 0) timeflag = 0;
             }
 ​
             // duty
             pwmset = time / 80;
 ​
             // generate PWM which width is 20ms
             if (timecount > 20) timecount = 0;
             else timecount++;
 ​
             if (timecount >= pwmset) gpio_bit_set(GPIOA, GPIO_PIN_1);
             else gpio_bit_reset(GPIOA, GPIO_PIN_1);
         }

以上这段代码需要在主循环中调用。接下来定义系统滴答时钟,在文件gd32f3x0_it.c中定义

 uint32_t tick = 0;
 void SysTick_Handler(void)
 {
     delay_decrement();
         tick += 1;
 }

main.c中需要给出外部变量的声明

 extern uint32_t tick;
此帖出自GD32 MCU论坛

最新回复

呼吸灯,看起来舒服一点,谢谢分享。。  详情 回复 发表于 2022-5-17 12:02
点赞 关注
 

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 
呼吸灯,看起来舒服一点,谢谢分享。。
此帖出自GD32 MCU论坛

点评

单独灯亮灯灭真的程序跑飞了死机了自己都不知道  详情 回复 发表于 2022-5-22 08:42
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
lugl4313820 发表于 2022-5-17 12:02 呼吸灯,看起来舒服一点,谢谢分享。。

单独灯亮灯灭真的程序跑飞了死机了自己都不知道

此帖出自GD32 MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表