【中科微CSM32RV003绿色开发板免费体验】开发板使用3彩灯 - RISC-V MCU技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

卢松涛 关注 私信
[资料]

【中科微CSM32RV003绿色开发板免费体验】开发板使用3彩灯

接上文 【中科微CSM32RV003绿色开发板免费体验】开发板使用2
官方例程SYSTICK_Interrupt\SYSTICK_Interrupt\Systick为基础,

/*
    \file    main.c
    \brief   main function for test demo
    \version V0.1, 2023-02-01, firmware for CSM32RV003
*/

/*
    *Systick interrupt routine:

*/
#include "headfile.h"
#define TICK      2000  //Sstick时钟已经在初始化里10分频 25us=32+32+16=80
uint8_t rgb_over = 1;		
uint8_t is_qcding = 1;		
uint8_t rgb_colour = 0;		
uint8_t duty_num_b =100;	
uint8_t d_num_b = 4;	、

/************脚位说明*****************
GPIOA,PIN12	  红色灯控制脚位12
GPIOA,PIN9	  绿色灯控制脚位9
GPIOA,PIN8	  蓝色灯控制脚位8
*************************************/

void _close_all_led(){		//关闭所有灯光
	GPIO_Write(GPIOA,PIN12, GPIO_SET);
	GPIO_Write(GPIOA,PIN9, GPIO_SET);
	GPIO_Write(GPIOA,PIN8, GPIO_SET);
}

、
void _RGB_timer_shade(){		、
	if(rgb_over){	//暗->亮
		duty_num_b += 4;
		if(duty_num_b > 251){
			rgb_over = 0;
			duty_num_b = 255;
		}
	}else{			//亮->暗
		duty_num_b -= 4;
		if(duty_num_b < 10){
			rgb_over = 1;
			duty_num_b = 10;
			rgb_colour++;
			if(rgb_colour > 7){
				rgb_colour = 1;
			}
		}
	}
}


、
void RGB_e( ){		、
	static uint8_t count = 0;			、
	uint8_t dutynum = 255;				、

	dutynum = duty_num_b;		、
	if(is_qcding){
		if(rgb_colour < 8){						//rgb_colour灯色if(rgb_colour == 4){			//橙
				if(count <= dutynum){
					GPIO_Write(GPIOA,PIN12,GPIO_RESET);	、GPIO_RESET
				}else{
					GPIO_Write(GPIOA,PIN12,GPIO_SET);、
				}
				if(count <= (dutynum/2)){	、
					GPIO_Write(GPIOA,PIN9,GPIO_RESET);
				}else{
					GPIO_Write(GPIOA,PIN9,GPIO_SET);
				}
				GPIO_Write(GPIOA,PIN8,GPIO_SET);
			}else if(rgb_colour == 7){		、
				if(count <= (dutynum/2)){	、
					GPIO_Write(GPIOA,PIN12,GPIO_RESET);
				}else{
					GPIO_Write(GPIOA,PIN12,GPIO_SET);
				}
				if(count <= dutynum){
					GPIO_Write(GPIOA,PIN8,GPIO_RESET);
				}else{
					GPIO_Write(GPIOA,PIN8,GPIO_SET);
				}
				GPIO_Write(GPIOA,PIN9,GPIO_SET);
			}else{
				if(count <= dutynum){
					switch(rgb_colour) {
						case 0:{	、
							GPIO_Write(GPIOA,PIN12,GPIO_RESET);
							GPIO_Write(GPIOA,PIN9,GPIO_RESET);
							GPIO_Write(GPIOA,PIN8,GPIO_RESET);
							break;
						}
						case 1:{	、
							GPIO_Write(GPIOA,PIN12,GPIO_RESET);
							GPIO_Write(GPIOA,PIN9,GPIO_SET);
							GPIO_Write(GPIOA,PIN8,GPIO_SET);
							break;
						}
						case 2:{	、
							GPIO_Write(GPIOA,PIN9,GPIO_RESET);
							GPIO_Write(GPIOA,PIN12,GPIO_SET);
							GPIO_Write(GPIOA,PIN8,GPIO_SET);
							break;
						}
						case 3:{	、
							GPIO_Write(GPIOA,PIN8,GPIO_RESET);
							GPIO_Write(GPIOA,PIN12,GPIO_SET);
							GPIO_Write(GPIOA,PIN9,GPIO_SET);
							break;
						}
						case 5:{	、
							GPIO_Write(GPIOA,PIN12,GPIO_RESET);
							GPIO_Write(GPIOA,PIN9,GPIO_RESET);
							GPIO_Write(GPIOA,PIN8,GPIO_SET);
							break;
						}
						case 6:{	、
							GPIO_Write(GPIOA,PIN9,GPIO_RESET);
							GPIO_Write(GPIOA,PIN8,GPIO_RESET);
							GPIO_Write(GPIOA,PIN12,GPIO_SET);
							break;
						}
					}
				}else{
					_close_all_led();		、
				}
			}
			count++;
			if(count >= 255){	、
				count = 0;
			}
		}else{
			count = 0;
			rgb_colour = 0;
		}
	}else{
		_close_all_led();		、
	}
}
int main(void)
{
    RESET->NRST_EN =0;    //PA15初始化位外部复位引脚,低电平复位;
    Delay32M_ms(1000);
    ///---------- System Init ----------///
    CLIC_Init();//系统中断配置
  //  SysClock_RC_16M_Init();//系统时钟初始化:RC模式
    SysClock_Crystal_Mode_Init();//系统时钟初始化:晶振模式

    UART_eeprintf_Init(UART1,115200);  //如果切换非32M时钟,需要更改 SystemCoreClock宏定义值
    ee_printf("SystemClk:%d\r\n", SystemCoreClock);
    ee_printf("uart init:IC农民工\r\n");
    NVIC_EnableIRQ(SysTick_IRQn);
    SysTick_mtime->MTIME = 0;
    SysTick_mtimecmp->MTIMECMP = TICK-1;  //Sstick时钟已经在初始化里10分频 25us=32+32+16=80
    ///----Chapter 5 GPIO Test Init ---------------------------------------------------------------------------------
    GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_OUTPUT); //GPIO 模式
        GPIO_MODE_Init(GPIOA,PIN9,GPIO_MODE_OUTPUT); //GPIO 模式
            GPIO_MODE_Init(GPIOA,PIN12,GPIO_MODE_OUTPUT); //GPIO 模式
    for(uint8_t i=0;i<10;i++)
    {
        GPIO_Toggle(GPIOA,PIN8); //GPIO 翻转
//        void GPIO_Write(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_PinState); //GPIO 输出
        Delay16M_ms(1000);
    }
	while(1){
//        RGB_e();
//        Delay32M_us(25);
	}
}

void mTimer_IRQhandler(void) __attribute__((interrupt("SiFive-CLIC-preemptible")));

void mTimer_IRQhandler(void)//SysTick中断函数
{

    SysTick_mtimecmp->MTIMECMP += TICK-1;//    ee_printf("Systick\r\n");
     RGB_e();
     d_num_b--;
     if(d_num_b==0){
        d_num_b=3;
         _RGB_timer_shade();
     }
}

build:

Output file is default\Systick.elf with size 79.19 KB


Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 6 warning(s) (0 minute(s), 1 second(s))

完成。

bad9d9c2ddbbd89c10ca3caef67e45c0

更多回帖

×
发帖