123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #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 并开始转换
- }
|