痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 101|回復: 1

測試代碼

[複製鏈接]
發表於 2025-1-6 20:55:05 | 顯示全部樓層 |閱讀模式
  1. #include "stm8s.h"
  2. #include "led.h"
  3. #define LED_delay (1)     // one digit emitting time
  4. #define ADC_delay (50)    // delay for reading voltage
  5. #define Display_delay (400) // delay for displaying value
  6. uint32_t Global_time = 0L;    // global time in ms
  7. uint32_t ADC_time = 0L;
  8. uint32_t Display_time = 0L;
  9. uint8_t waitforADC = 0;
  10. uint8_t ADC_started = 0;
  11. uint16_t ADC_values[3] = { 0, 0, 0 };
  12. uint8_t index = 0;
  13. uint8_t current_channel = 1; // 0: AIN3, 1: AIN4
  14. void simpleDelay(uint8_t how_much);
  15. uint16_t adc_read(void){ uint16_t temph = 0;
  16. uint8_t templ = 0;
  17. ADC1->CR1 |= ADC1_CR1_ADON; // wake it up
  18. ADC1->CR1 |= ADC1_CR1_ADON; // start the conversion, wait few ms
  19. simpleDelay(1);
  20. while (!(ADC1->CSR & ADC1_CSR_EOC)); // wait for conversion to finish
  21. /* Read LSB first */
  22. templ = ADC1->DRL;
  23. /* Then read MSB */
  24. temph = ADC1->DRH;
  25. temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8));
  26. ADC1->CR1 &= (uint8_t)(~ADC1_CR1_ADON);
  27. // power it off return (uint16_t)temph;}
  28. // store ADC value in a rolling array void store(uint16_t value){ ADC_values[index++] = value; // store value in array  if (index == 3) index = 0; // check index overflow}
  29. // get median value uint16_t median(uint16_t value1, uint16_t value2, uint16_t value3)   if ((value1 <= value2) && (value1 <= value3))   {      return (value2 <= value3) ? value2 : value3;    }   else     {         if ((value2 <= value1) && (value2 <= value3))         {             return (value1 <= value3) ? value1 : value3;         }         else         {             return (value1 <= value2) ? value1 : value2;         }     } }
  30. // calculate average value uint16_t average(uint16_t value1, uint16_t value2, uint16_t value3) {     uint16_t value = 0;     uint8_t count = 0;
  31.      if (value1 > 0)     {         value += value1;         count++;     }     if (value2 > 0)     {         value += value2;         count++;     }         if (value3 > 0)     {         value += value3;         count++;     }         if (count > 0) value /= count;
  32.      return value; }
  33. // ADC initialization void ADC_init() {     // Initialize ADC     // Setup ADC on AIN6/PD6, AIN4/PD3, AIN3/PD2     GPIOD->DDR &= (uint8_t)(0b10110011); // Set PD2/3/6 as floating input     GPIOD->CR1 &= (uint8_t)(0b10110011);
  34.      ADC1->CR1 &= (uint8_t)(~ADC1_CR1_CONT); // Set single conversion mode     ADC1->CR1 &= (uint8_t)(~ADC1_CR1_SPSEL); // Clear the SPSEL bits (prescaler)     ADC1->CR1 |= 0x40; // Select the prescaler division factor
  35.      ADC1->CR2 |= ADC1_CR2_ALIGN; // Configure right data alignment     ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTTRIG); // Disable external trigger     ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTSEL); // Clear external trigger selection bits     ADC1->CR2 &= (uint8_t)(~ADC1_CR2_SCAN); // Disable scan mode
  36.      ADC1->CSR = 0x06; // Select AIN6 as initial channel }
  37. void main() {     uint32_t T_LED = 0L; // time of last digit update     uint16_t ADC_value = 0;     uint16_t value = 0, vref = 0, value1 = 0, value2 = 0, value3 = 0;     uint8_t i, count = 0;
  38.      ADC_init();
  39.      // Setup Timer1     TIM1-> PSCRH = 0;     TIM1-> PSCRL = 15; // LSB should be written last     TIM1->ARRH = 0x03; // auto-reload each 1ms     TIM1->ARRL = 0xE8;     TIM1->IER = TIM1_IER_UIE;     TIM1->CR1 = TIM1_CR1_ARPE | TIM1_CR1_URS | TIM1_CR1_CEN;  
  40.      // Configure clocking     CLK->CKDIVR = 0; // F_HSI = 16MHz
  41.      // Configure pins     CFG->GCR |= 1; // disable SWIM
  42.      LED_init();     set_display_buf("000");
  43.      Button_init();     enableInterrupts();
  44.      while (1)      {         if (((uint16_t)(Global_time - ADC_time) > ADC_delay) || (ADC_time > Global_time))         {             ADC_time = Global_time;
  45.              // read three values and get median             value1 = adc_read();             value2 = adc_read();             value3 = adc_read();             vref = median(value1, value2, value3);
  46.              if (current_channel)             {                 ADC1->CSR = (ADC1->CSR & 0xF0) | 0x04; // select AIN4                 GPIOA->ODR &= (uint8_t)(0b11111011); // light blue LED             }              else              {                 ADC1->CSR = (ADC1->CSR & 0xF0) | 0x03; // select AIN3                 GPIOA->ODR |= (uint8_t)(0x04); // light red LED             }
  47.              value1 = adc_read();             value2 = adc_read();             value3 = adc_read();             value = median(value1, value2, value3);             store(value * (long)3120 / vref); // avoid uint16_t overflow             ADC1->CSR = 0x06; // restore AIN6 as sampling channel         }
  48.          if ((uint16_t)(Global_time - Display_time) > Display_delay)         {             Display_time = Global_time;             value = average(ADC_values[0], ADC_values[1], ADC_values[2]);             display_int(value, 1); // allow auto decimal point         }
  49.          if (Display_time > Global_time) Display_time = Global_time; // reset Display_time when Global_time overflows
  50.          if ((uint8_t)(Global_time - T_LED) > LED_delay)         {             T_LED = Global_time;             show_next_digit();         }
  51.          // used for non-blocking read         if (ADC_started)          {             wait_ADC();         }         if (waitforADC)         {             ADC_value = adc_read_end();                     store(value * (long)100 * 3.3 / 1024); // store current voltage value             waitforADC = 0;         }     } }
  52. // keep the processor busy for some time void simpleDelay(uint8_t how_much) {     unsigned int i, j;     for (i = 0; i < how_much; i++)     {         for (j = 0; j < 40; j++)         {         }     } }
  53. // Timer1 Update/Overflow/Trigger/Break Interrupt INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11) {     if (TIM1->SR1 & TIM1_SR1_UIF) // update interrupt     {         Global_time++; // increase timer     }     TIM1->SR1 = 0; // clear all interrupt flags }
  54. INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3) {     if ((GPIOA->IDR & 0x08) == 0)     {         // delay 2ms for debounce         unsigned int i, j;         for (i = 0; i < 50; i++)         {             for (j = 0; j < 40; j++) {}         }
  55.          // release detection         while ((GPIOA->IDR & 0x08) == 0) {}
  56.          // toggle ADC channel         current_channel = !current_channel;     } }
複製代碼


  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_SPI1_Init();
  17.   MX_SPI2_Init();
  18.   MX_USART1_UART_Init();
  19.   MX_USB_DEVICE_Init();
  20.   MX_TIM2_Init();
  21.   MX_I2C1_Init();
  22.   /* USER CODE BEGIN 2 */
  23.   ST7735_Init();
  24.   Encoder_Init();

  25.   ReadRecord();         //Read the last settings from eeprom
  26.   Display_Initial_UI();  
  27.   AD9833_Init((WaveDef)waveform_select, freq, 0, AMP_Value);
  28.   /* USER CODE END 2 */

  29.   /* Infinite loop */
  30.   /* USER CODE BEGIN WHILE */
  31.   while (1) {
  32.           button_status = Button_Get_Status();

  33.     switch (Menu_Selector) {
  34.                   case Main_Menu:
  35.         Process_Main_Menu();
  36.                           break;
  37.                   case Change_Frequency:
  38.         Process_Change_Frequency();
  39.                           break;
  40.                   case Change_Wave_Form:
  41.         Process_Change_Waveform();
  42.                           break;
  43.                   case Amper_Level:
  44.         Process_Amper_Level();
  45.                           break;
  46.                   case Sweep_Mode:
  47. //        Process_Sweep_Mode();
  48.                           break;
  49.                   default:
  50.                           break;
  51.           }
  52.     /* USER CODE END WHILE */

  53.     /* USER CODE BEGIN 3 */
  54.   }
  55.   /* USER CODE END 3 */
  56. }
複製代碼
 樓主| 發表於 2025-1-6 20:56:06 | 顯示全部樓層
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();
  MX_USB_DEVICE_Init();
  MX_TIM2_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
  ST7735_Init();
  Encoder_Init();

  ReadRecord();         //Read the last settings from eeprom
  Display_Initial_UI();  
  AD9833_Init((WaveDef)waveform_select, freq, 0, AMP_Value);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1) {
          button_status = Button_Get_Status();

    switch (Menu_Selector) {
                  case Main_Menu:
        Process_Main_Menu();
                          break;
                  case Change_Frequency:
        Process_Change_Frequency();
                          break;
                  case Change_Wave_Form:
        Process_Change_Waveform();
                          break;
                  case Amper_Level:
        Process_Amper_Level();
                          break;
                  case Sweep_Mode:
//        Process_Sweep_Mode();
                          break;
                  default:
                          break;
          }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2025-1-18 09:47 AM , Processed in 0.048162 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.