在原工程AiPi-Eyes-DU的基础上添加定时中断代码,定时器 程序参考的零基础开发小安派-Eyes-S1【外设篇】——TIMER中的定时代码。稍微修改,并无关于定时时间变量MyTime_s的打印输出- #include "bflb_mtimer.h"
- #include "bflb_pwm_v2.h"
- #include "bflb_clock.h"
- #include "bflb_gpio.h"
- #include "bflb_timer.h"
- #include "board.h"
- struct bflb_device_s *pwm;
- struct bflb_device_s *gpio;
- struct bflb_device_s *timer0;
- volatile static uint16_t MyTime_s = 0; //定义一个全局变量,在中断中修改,这里注意要用volatile关键字防止变量被优化
- volatile static uint16_t MyTime_s_tmp = 0; //定义一个全局变量,在中断中修改,这里注意要用volatile关键字防止变量被优化
- void timer0_isr(int irq, void *arg)
- {
- bool status = bflb_timer_get_compint_status(timer0, TIMER_COMP_ID_0);
- if (status) {
- bflb_timer_compint_clear(timer0, TIMER_COMP_ID_0);
- if (MyTime_s==60)
- {
- MyTime_s = 0;
- }
- MyTime_s++;
- printf("time is %d\r\n",MyTime_s);
- }
- }
- //中断服务函数,每进入一次变量自增1,到达60也就是1分钟置为0
- int main(void)
- {
- int i;
- board_init();
- pwm = bflb_device_get_by_name("pwm_v2_0");
- gpio = bflb_device_get_by_name("gpio");
- /*初始化RGB灯,IO15、12、14,对应蓝灯、红灯、绿灯*/
- bflb_gpio_init(gpio, GPIO_PIN_15, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- bflb_gpio_init(gpio, GPIO_PIN_14, GPIO_FUNC_PWM0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- bflb_gpio_init(gpio, GPIO_PIN_27, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
- /* period = .XCLK / .clk_div / .period = 40MHz / 40 / 1000 = 1KHz */
- struct bflb_pwm_v2_config_s cfg = {
- .clk_source = BFLB_SYSTEM_XCLK,
- .clk_div = 40,
- .period = 1000,
- };
-
- /*初始化PWM输出*/
- bflb_pwm_v2_init(pwm, &cfg);
- bflb_pwm_v2_start(pwm);
- printf("\r\n=========== First Project ==============\r\n");
- printf("Timer basic test\n");
- /* timer clk = XCLK/(div + 1 )*/
- struct bflb_timer_config_s cfg0;
- cfg0.counter_mode = TIMER_COUNTER_MODE_PROLOAD; /* 选择重装载模式 */
- cfg0.clock_source = TIMER_CLKSRC_XTAL;//选择外部时钟晶振,40MHz
- cfg0.clock_div = 39; /* for bl616/bl808/bl606p is 39, for bl702 is 31 */
- cfg0.trigger_comp_id = TIMER_COMP_ID_0;//选择比较ID的个数,这里选择一个ID,也就是只会到达下面的ID1
- cfg0.comp0_val = 1000000; /* 比较值ID1,当计数达到1000000时,根据前面的分频一微秒一个计数,也就是总共1秒 */
- cfg0.comp1_val = 2500000; /* 比较值ID2,需要大于ID1,由于前面只设置了一个ID,所以这里不会触发 */
- cfg0.comp2_val = 3500000; /* 比较值ID2,需要大于ID2,由于前面只设置了一个ID,所以这里不会触发 */
- cfg0.preload_val = 0; /* 重装载值,开始的值,以及比较完所有ID个数后重启的值 */
- timer0 = bflb_device_get_by_name("timer0");
- /* Timer init with default configuration */
- bflb_timer_init(timer0, &cfg0);
- bflb_irq_attach(timer0->irq_num, timer0_isr, NULL);
- bflb_irq_enable(timer0->irq_num);
- /* Enable timer */
- bflb_timer_start(timer0);//开启定时器
- printf("case success.\r\n");
- /*功能实现,红、绿、蓝灯依次呼吸循环亮灭*/
- while (1) {
- //红灯呼吸亮灭
- bflb_pwm_v2_channel_positive_start(pwm, PWM_CH0);
- for(i=100;i>0;i--)
- {
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 100);
-
- bflb_mtimer_delay_ms(10);
- }
- if(MyTime_s_tmp!=MyTime_s){
- MyTime_s_tmp=MyTime_s;
- switch (MyTime_s)
- {
- case 10:
- printf("10 seconds have passed\r\n");
- break;
- case 20:
- printf("20 seconds have passed\r\n");
- break;
- case 30:
- printf("30 seconds have passed\r\n");
- break;
- case 40:
- printf("40 seconds have passed\r\n");
- break;
- case 50:
- printf("50 seconds have passed\r\n");
- break;
- case 60:
- printf("One minute has already passed\r\n");
- break;
- default:
- break;
- }
- }
- for(i=1;i<100;i++)
- {
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH0, i, 100);
- bflb_mtimer_delay_ms(10);
- }
- bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH0);
- //绿灯呼吸亮灭
- bflb_pwm_v2_channel_positive_start(pwm, PWM_CH2);
- for(i=100;i>0;i--)
- {
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH2, i, 100);
- bflb_mtimer_delay_ms(10);
- }
- for(i=1;i<100;i++)
- {
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH2, i, 100);
- bflb_mtimer_delay_ms(10);
- }
- bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH2);
- //蓝灯循环亮灭
- bflb_pwm_v2_channel_positive_start(pwm, PWM_CH3);
- for(i=100;i>0;i--)
- {
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, i, 100);
- bflb_mtimer_delay_ms(10);
- }
- for(i=1;i<100;i++)
- {
- bflb_pwm_v2_channel_set_threshold(pwm, PWM_CH3, i, 100);
- bflb_mtimer_delay_ms(10);
- }
- bflb_pwm_v2_channel_positive_stop(pwm, PWM_CH3);
- }
- }
复制代码 |