#include "stm8s.h" void HW_Init(void) { disableInterrupts(); //时钟设置 CLK_DeInit(); CLK_HSICmd(ENABLE); //配置内部高速时钟 CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); //时钟1分频 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //内核1分频 CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE); CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE); //GPIO GPIO_DeInit(GPIOA); GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_PU_IT); //PC3 INT2 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY); GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_IT); //PC7 INT7 EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY); GPIO_DeInit(GPIOD); GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT); //PD4 KEY //TIM1 TIM1_DeInit(); TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 999, 0); TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE, 0, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET); //PWM1模式,输出使能,不互补,占空比800, 输出极性高,空闲低电平 TIM1_OC1PreloadConfig(ENABLE); TIM1_CCxCmd(TIM1_CHANNEL_1,ENABLE); TIM1_CtrlPWMOutputs(ENABLE); TIM1_Cmd(ENABLE); //TIM2 TIM2_DeInit(); TIM2_TimeBaseInit(TIM2_PRESCALER_16, 999); TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_LOW); TIM2_OC1PreloadConfig(ENABLE); TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_LOW); TIM2_OC2PreloadConfig(ENABLE); TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_LOW); TIM2_OC3PreloadConfig(ENABLE); TIM2_ARRPreloadConfig(ENABLE); TIM2_Cmd(ENABLE); //TIM4 TIM4_DeInit(); TIM4_TimeBaseInit(TIM4_PRESCALER_64, 249); //1ms TIM4_ARRPreloadConfig(ENABLE); TIM4_ClearFlag(TIM4_FLAG_UPDATE); TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); TIM4_Cmd(ENABLE); //ADC GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT); //Light_in,ch5 GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //Vin,ch6 GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT); //Chg_in,ch2 ADC1_DeInit(); //IWDG if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET) RST_ClearFlag(RST_FLAG_IWDGF); IWDG_Enable(); //0xCC IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55 IWDG_SetPrescaler(IWDG_Prescaler_256); IWDG_SetReload((uint8_t)(0xFF));//510ms IWDG_ReloadCounter(); //0xAA /* Enable general interrupts */ enableInterrupts(); } void ADC_CH_Init(uint8_t ch) { char l = 0; ADC1->CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换 ADC1->CSR = ch + 1; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3) ADC1->CR2 = 0x00; //默认左对齐 读数据时先读高在读低 ADC1->TDRL = ( 1 << ( ch + 1 ) ); //禁止相应通道 施密特触发功能 1左移ch+1位 ADC1->CR1 |= 0x01; //使能ADC并开始转换 ADC1->CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能 for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us ADC1->CR1 = ADC1->CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换 }