/// main.c
/*
\file main.c
\brief main function for test demo
\version V0.1, 2023-02-01, firmware for CSM32RV003
*/
#include "headfile.h"
#define SFT ((SFT_TypeDef *)SFT_BASE)
#define SFT_BASE 0x30000360UL
volatile uint32_t NRST_EN;
int main(void)
{
typedef struct
{
volatile uint32_t EN;
volatile uint32_t NRST_EN;
}SFT_TypeDef;
SFT->NRST_EN=0;
CLIC_Init();
SysClock_Test_Init();
// ///---------- RTC Init ----------///
// GPIO_MODE_Init(GPIOA, PIN3, GPIO_MODE_AF);
// GPIO_AF_Init(GPIOA, PIN3, GPIO_AF0);
// RTC_Init_case1();
// Interrupt_Enable(RTC_SECF_int_ID);
// Interrupt_Enable(RTC_ALRF_int_ID);
// Interrupt_Enable(RTC_OWF_int_ID);
// SYS_Interrupt_Enable();//CLIC开总中断
// ///---------- TSC Init ----------///
// TSC_Init();
// Interrupt_Enable(TSC_int_ID);
// SYS_Interrupt_Enable();//CLIC开总中断
// TSC_Start_Measure(2);
// uint32_t adc_result;
// uint32_t adc_pack[16];
// uint32_t adc_sum;
// uint32_t adc_count;
// uint32_t adc_avr;
// uint32_t voltage_avr;
//
// ADC_Init_case1();//内部基准,测PA4
// //Interrupt_Enable(ADC_int_ID);//CLIC使能单个中断
//Interrupt_Enable(EXIT2_int_ID);//CLIC使能EXIT中断
// //SYS_Interrupt_Enable();//CLIC开总中断
//
// GPIO_MODE_Init(GPIOA,PIN14,GPIO_MODE_ANALOG);
// _REG32(0x30000408,0) = 0x19;
//
// GPIO_MODE_Init(GPIOA, PIN15, GPIO_MODE_AF);
// GPIO_AF_Init(GPIOA, PIN15, GPIO_AF0);
//
UART_Init_case1(UART1);
GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_OUTPUT);
GPIO_MODE_Init(GPIOA,PIN9,GPIO_MODE_OUTPUT);
GPIO_MODE_Init(GPIOA,PIN12,GPIO_MODE_OUTPUT);
GPIO_Write(GPIOA,PIN9,GPIO_RESET);
GPIO_Write(GPIOA,PIN8,GPIO_RESET);
GPIO_Write(GPIOA,PIN12,GPIO_RESET);
Delay32M_ms(2000);
GPIO_Write(GPIOA,PIN8,GPIO_SET);
GPIO_Write(GPIOA,PIN9,1);
GPIO_Write(GPIOA,PIN12,1);
//输入口的设置
GPIO_InType_Init( GPIOA, PIN3,GPIO_MODE_INPUT); //GPIO的PA3输入模式,外接按键
//GPIO_PULL_Init(GPIOA, PIN3, GPIO_PULLUP); //PA3 上拉 未按下时是1
GPIO_PULL_Init(GPIOA, PIN3, GPIO_PULLDOWN); // PA3下拉 未按下时是0
//GPIO_PULL_Init(GPIOA, PIN3, 0GPIO_NOPULL ); // PA3浮空
// Delay16M_ms(5000);
// System_Powerdown();//掉电模式 powerdown1
///---- Chapter 16 LV Test Init --------------------------------------------------------------------------------------
//LV_Init_case1(12);//设置低压报警阈值
//LV_Interrupt_Enable();//使能低压报警中断
//Interrupt_Enable(LV_int_ID);//CLIC使能单个中断
//SYS_Interrupt_Enable();//CLIC开总中断
///---- 系统总中断控制 -------------------------------------------------------------------------------------------------
//SYS_Interrupt_Enable();//CLIC开总中断
//SYS_Interrupt_Disable();//CLIC关总中断
//ee_printf("\nHello CSM32RV20:");
//printf("Hello CSM32RV20:\r\n");
//NVR10_RW_Test();
while(1)
{
//Delay32M_ms(500);
//Delay16M_ms(500);
//GPIO_Toggle(GPIOA,PIN14);
//printf("main:\r\n");
//printf("%x \n",RTC->CNT);//RTC
//GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_OUTPUT); //GPIO 模式
// GPIO_Write(GPIOA,PIN8,GPIO_RESET); //GPIO 输出
// adc_result = ADC_Conversion();//适用于非中断模式
// printf("\r\nadc_val:%d\r\n",adc_result);
// adc_pack[(adc_count++)&0xf] = adc_result;
// adc_sum=0;
// for(uint8_t i=0;i<16;i++)
// {
// adc_sum += adc_pack[i];
// }
// adc_avr = adc_sum/16;
// printf("val:%d avr:%d %d.%dmV %d.%dmV\r\n",adc_result,adc_avr,(adc_result*4*12000/32768)/10,(adc_result*4*12000/32768)%10,(adc_avr*4*12000/32768)/10,(adc_avr*4*12000/32768)%10);
//
//ADC_Soft_Start();//软件触发ADC,适用于中断模式
if( GPIO_Read(GPIOA, PIN3) )
{
Delay32M_ms(20);
while(GPIO_Read(GPIOA, PIN3)) ;
while(!GPIO_Read(GPIOA, PIN3)) ;
for(uint8_t i=0;i<10;i++)
{
GPIO_Toggle(GPIOA,PIN12);
Delay32M_ms(200);
GPIO_Write(GPIOA,PIN12,GPIO_SET);
GPIO_Toggle(GPIOA,PIN9);
Delay32M_ms(200);
GPIO_Write(GPIOA,PIN9,GPIO_SET);
GPIO_Toggle(GPIOA,PIN8);
Delay32M_ms(200);
GPIO_Write(GPIOA,PIN8,1);
}
}
else
for(uint8_t i=0;i<4;i++)
{
GPIO_Toggle(GPIOA,PIN12);
Delay32M_ms(100);
}
}
return 0;
}
//////////////////////////////////////////////////
//gpio.h
#ifndef GPIO_H_
#define GPIO_H_
#define PIN0 ((uint8_t)0x00) //GPIO_MODE_Init(GPIOA,PIN0,GPIO_MODE_OUTPUT); //PIN0即PA0 为输出模式
#define PIN1 ((uint8_t)0x01)
#define PIN2 ((uint8_t)0x02)
#define PIN3 ((uint8_t)0x03)
#define PIN4 ((uint8_t)0x04)
#define PIN5 ((uint8_t)0x05)
#define PIN6 ((uint8_t)0x06)
#define PIN7 ((uint8_t)0x07)
#define PIN8 ((uint8_t)0x08)
#define PIN9 ((uint8_t)0x09)
#define PIN10 ((uint8_t)0x0a)
#define PIN11 ((uint8_t)0x0b)
#define PIN12 ((uint8_t)0x0c)
#define PIN13 ((uint8_t)0x0d)
#define PIN14 ((uint8_t)0x0e)
#define PIN15 ((uint8_t)0x0f)
#define PINALL ((uint8_t)0x10)
//输入 GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_INPUT); //GPIO 模式
#define GPIO_MODE_INPUT 0x00000000UL //输入 //GPIO_InType_Init( GPIOA, PIN1,GPIO_MODE_INPUT); //GPIO 输入模式 ??????
#define GPIO_MODE_OUTPUT 0x00000001UL //输出 GPIO_MODE_Init(GPIOA,PIN8,GPIO_MODE_OUTPUT); //GPIO 模式
#define GPIO_MODE_AF 0x00000002UL //RTC Init // GPIO_MODE_Init(GPIOA, PIN3, GPIO_MODE_AF);
#define GPIO_MODE_ANALOG 0x00000003UL //GPIO_MODE_Init(GPIOA,PIN14,GPIO_MODE_ANALOG); //ADC模式
#define GPIO_OTYPE_ODOS_OFF 0x00000000UL //关闭开漏、开源功能
#define GPIO_OTYPE_OD_ON 0x00000001UL //开漏输出
#define GPIO_OTYPE_OS_ON 0x00010000UL //开源输出
#define GPIO_OTYPE_ODOS_ON 0x00010001UL //推免输出 GPIO_OutType_Init(GPIOA,PIN12,GPIO_OTYPE_ODOS_ON ); //PA12推免输出
#define GPIO_ITYPE_SCHMIDT 0x00010000UL
#define GPIO_ITYPE_CMOSE 0x00000001UL
#define GPIO_NOPULL 0x00000000UL //输出口引脚多为此配置,用于输入脚则是输入浮空
#define GPIO_PULLUP 0x00000001UL //输入引脚配置为上拉,则默认是输入1, GPIO_PULL_Init(GPIOA, PIN15, GPIO_PULLUP); //GPIOA PA15上拉
#define GPIO_PULLDOWN 0x00000002UL //输入引脚配置为下拉,则默认是输入0 ,引脚配置为下拉
#define GPIO_SPEED_0 0x00000000UL //输出速度
#define GPIO_SPEED_1 0x00000001UL
#define GPIO_SPEED_2 0x00010000UL
#define GPIO_SPEED_3 0x00010001UL
#define GPIO_SET 0x00000001UL //GPIO_Write(GPIOA,PIN8,GPIO_SET); //PA8 输出1
#define GPIO_RESET 0x00010000UL //GPIO_Write(GPIOA,PIN8,GPIO_RESET); //PA8 输出0
#define GPIO_AF0 0x00000000UL //RTC Init // GPIO_AF_Init(GPIOA, PIN3, GPIO_AF0);
#define GPIO_AF1 0x00000001UL
#define GPIO_AF2 0x00000002UL
#define GPIO_AF3 0x00000003UL
#define GPIO_AF4 0x00000004UL
#define GPIO_AF5 0x00000005UL
#define GPIO_EXTI_HIGNLEVEL 0x00000000UL // 外部中断 检测高电平
#define GPIO_EXTI_FALLING 0x00000001UL //检测下降沿
#define GPIO_EXTI_RISING 0x00000002UL //检测上升沿
#define GPIO_EXTI_LOWLEVEL 0x00000003UL //检测低电平
void GPIO_MODE_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_MODEx); //GPIO 模式 GPIO_MODEx为GPIO_MODE_INPUT(输入)/GPIO_MODE_OUTPUT(输出)
void GPIO_OutType_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_OTYPEx); //GPIO 输出模式 手册P30图5-2
void GPIO_InType_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_ITYPEx); //GPIO 输入模式
void GPIO_PULL_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_PULLx); //GPIO 上拉
void GPIO_OutSpeed_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_SPEEDx); //GPIO 压摆率
void GPIO_AF_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_AFx); //GPIO 复用模式
void GPIO_EXTI_MODE_Init(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_EXTI_MODEx); //GPIO 中断模式
void GPIO_INTER_enable(GPIO_TypeDef *GPIOx,uint8_t PINx); //GPIO 中断使能
void GPIO_INTER_disable(GPIO_TypeDef *GPIOx,uint8_t PINx); //GPIO 中断关闭
void GPIO_Write(GPIO_TypeDef *GPIOx,uint8_t PINx,uint32_t GPIO_PinState); //GPIO 输出 写0或1 GPIO_Write(GPIOA,PIN8,1); //PA8写1
uint8_t GPIO_Read(GPIO_TypeDef *GPIOx,uint8_t PINx); //GPIO 读引脚输入 返回0(需设为上拉)或1(需设为下拉)//GPIO_Read(GPIOA, PIN3);//读PA3引脚
void GPIO_Toggle(GPIO_TypeDef *GPIOx,uint8_t PINx); //GPIO 翻转 GPIO_Toggle(GPIOA,PIN12); PA12引脚翻转
//中断的检测函数
void GPIO_EXTI_Init_case1(GPIO_TypeDef *GPIOx, uint8_t PINx); //检测高电平 //GPIO_EXIT_Init_case1(GPIOA, PIN2);//检测中断高电平
void GPIO_EXTI_Init_case2(GPIO_TypeDef *GPIOx, uint8_t PINx); //检测低电平
void GPIO_EXTI_Init_case3(GPIO_TypeDef *GPIOx, uint8_t PINx); //检测上升沿
void GPIO_EXTI_Init_case4(GPIO_TypeDef *GPIOx, uint8_t PINx); //检测下降沿
void EXTI0_Isr(void); //中断函数
void EXTI1_Isr(void);
void EXTI2_Isr(void);
void EXTI3_Isr(void);
void EXTI4_Isr(void);
void EXTI9_5_Isr(void);
void EXTI15_10_Isr(void);
void EXTI17_16_Isr(void);
#endif