前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【GD32L233C-START】2、非阻塞方式点灯,blink,blink,blink……

【GD32L233C-START】2、非阻塞方式点灯,blink,blink,blink……

作者头像
ManInRoad
发布2022-02-09 09:06:08
3780
发布2022-02-09 09:06:08
举报
文章被收录于专栏:物联网思考物联网思考

1、前言

官方的demo用的阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯。

2、硬件连接

3、思路

利用定时器中断,每1ms中断一次,整个系统维护一个tick计数;

记录某一时刻的tick,用A表示,再获取当前的tick,用B表示,如果当前的B-A大于等于500(这里500ms闪烁一次),那么就执行一次led翻转,同时也更新A的值。

4、软件实现

(1)利用定时器中断,每1ms中断一次,整个系统维护一个tick计数

代码语言:javascript
复制
static uint32_t SystemTick=0;

void Timer1Config(void)
{
    nvic_irq_enable(TIMER1_IRQn, 0);
    timer_parameter_struct timer_initpara;
    /* enable the peripherals clock */
    rcu_periph_clock_enable(RCU_TIMER1);
    /* deinit a TIMER */
    timer_deinit(TIMER1);
    /* initialize TIMER init parameter struct */
    timer_struct_para_init(&timer_initpara);
    /* TIMER2 configuration */
    timer_initpara.prescaler         = 63;
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;
    timer_initpara.period            = 999;
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
    timer_init(TIMER1, &timer_initpara);
    /* clear channel 0 interrupt bit */
    timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
    /* enable the TIMER interrupt */
    timer_interrupt_enable(TIMER1, TIMER_INT_UP);
    /* enable a TIMER */
    timer_enable(TIMER1);    
}
代码语言:javascript
复制
void TIMER1_IRQHandler(void)
{
   if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_UP))
   {
       timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP);
       SystemTick++;
    }
}
代码语言:javascript
复制
uint32_t SystemGetTick(void)
{
    return SystemTick;
}

(2)LED翻转

代码语言:javascript
复制
void LedInit(void)
{
  /* enable the LED GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOC);
    /* configure LED GPIO pin */
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7 | GPIO_PIN_8);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8);
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
    /* reset LED GPIO pin */
    gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
    gpio_bit_reset(GPIOC, GPIO_PIN_6 | GPIO_PIN_7);  
}
代码语言:javascript
复制
void SystemRun(void)
{
  static uint32_t tick=0;

  if(SystemGetTick()-tick>500)
  {
    tick=SystemGetTick();
    gpio_bit_toggle(GPIOA, GPIO_PIN_7 | GPIO_PIN_8);
    gpio_bit_toggle(GPIOC, GPIO_PIN_6 | GPIO_PIN_7);
  }
}

(3)主函数轮询

代码语言:javascript
复制
int main(void)
{
  Timer1Config();
  LedInit();
  while(1) 
  {
    SystemRun();
  }
}

5、现象

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、前言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档