1914|0

565

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

【GD32L233C-START评测】2、非阻塞方式点灯,blink,blink,blink…… [复制链接]

本帖最后由 freeelectron 于 2022-1-20 19:15 编辑

1、前言:

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

2、硬件连接

3、思路

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

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

4、软件实现

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

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);		
}


void TIMER1_IRQHandler(void)
{
    if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_UP))
	{
		timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP);
			
		SystemTick++;
    }
}


uint32_t SystemGetTick(void)
{
	return SystemTick;
}

(2)LED翻转

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);	
}

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)主函数轮询

int main(void)
{
	Timer1Config();
	LedInit();

    while(1) 
	{
		SystemRun();
    }
}

5、现象

 

 

此帖出自GD32 MCU论坛
点赞 关注
个人签名stm32/LoRa物联网:304350312
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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