接上文 【中科微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))
完成。
更多回帖