hw_init.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "stm8s.h"
  2. void HW_Init(void)
  3. {
  4. disableInterrupts();
  5. //时钟设置
  6. CLK_DeInit();
  7. CLK_HSICmd(ENABLE); //配置内部高速时钟
  8. CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); //时钟1分频
  9. CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //内核1分频
  10. CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  11. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE);
  12. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2, ENABLE);
  13. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE);
  14. CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE);
  15. //GPIO
  16. GPIO_DeInit(GPIOA);
  17. GPIO_DeInit(GPIOB);
  18. GPIO_DeInit(GPIOC);
  19. GPIO_Init(GPIOC, GPIO_PIN_3, GPIO_MODE_IN_PU_IT); //PC3 INT2
  20. EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
  21. GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_IT); //PC7 INT7
  22. EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);
  23. GPIO_DeInit(GPIOD);
  24. GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT); //PD4 KEY
  25. //TIM1
  26. TIM1_DeInit();
  27. TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 999, 0);
  28. TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE,
  29. 0, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET,
  30. TIM1_OCNIDLESTATE_SET); //PWM1模式,输出使能,不互补,占空比800, 输出极性高,空闲低电平
  31. TIM1_OC1PreloadConfig(ENABLE);
  32. TIM1_CCxCmd(TIM1_CHANNEL_1,ENABLE);
  33. TIM1_CtrlPWMOutputs(ENABLE);
  34. TIM1_Cmd(ENABLE);
  35. //TIM2
  36. TIM2_DeInit();
  37. TIM2_TimeBaseInit(TIM2_PRESCALER_16, 999);
  38. TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_LOW);
  39. TIM2_OC1PreloadConfig(ENABLE);
  40. TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_LOW);
  41. TIM2_OC2PreloadConfig(ENABLE);
  42. TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 0, TIM2_OCPOLARITY_LOW);
  43. TIM2_OC3PreloadConfig(ENABLE);
  44. TIM2_ARRPreloadConfig(ENABLE);
  45. TIM2_Cmd(ENABLE);
  46. //TIM4
  47. TIM4_DeInit();
  48. TIM4_TimeBaseInit(TIM4_PRESCALER_64, 249); //1ms
  49. TIM4_ARRPreloadConfig(ENABLE);
  50. TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  51. TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  52. TIM4_Cmd(ENABLE);
  53. //ADC
  54. GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT); //Light_in,ch5
  55. GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //Vin,ch6
  56. GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT); //Chg_in,ch2
  57. ADC1_DeInit();
  58. //IWDG
  59. if (RST_GetFlagStatus(RST_FLAG_IWDGF) != RESET)
  60. RST_ClearFlag(RST_FLAG_IWDGF);
  61. IWDG_Enable(); //0xCC
  62. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //0x55
  63. IWDG_SetPrescaler(IWDG_Prescaler_256);
  64. IWDG_SetReload((uint8_t)(0xFF));//510ms
  65. IWDG_ReloadCounter(); //0xAA
  66. /* Enable general interrupts */
  67. enableInterrupts();
  68. }
  69. void ADC_CH_Init(uint8_t ch)
  70. {
  71. char l = 0;
  72. ADC1->CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换
  73. ADC1->CSR = ch + 1; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)
  74. ADC1->CR2 = 0x00; //默认左对齐 读数据时先读高在读低
  75. ADC1->TDRL = ( 1 << ( ch + 1 ) ); //禁止相应通道 施密特触发功能 1左移ch+1位
  76. ADC1->CR1 |= 0x01; //使能ADC并开始转换
  77. ADC1->CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能
  78. for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us
  79. ADC1->CR1 = ADC1->CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
  80. }