(2/3/4)-D Sqr/Rects/Cubes/Boxes?

本文介绍了一个高效算法,用于计算不同尺寸的二维、三维及更高维度几何形状的数量,如正方形、矩形、立方体等。该算法适用于各种规模的网格,并通过示例输入输出展示了其应用效果。


Problem J

(2/3/4)-D Sqr/Rects/Cubes/Boxes?

Input: standard input

Output: standard output

Time Limit: 2 seconds

 

You can see a (4x4) grid below. Can you tell me how many squares and rectangles are hidden there? You can assume that squares are not rectangles. Perhaps one can count it by hand but can you count it for a (100x100) grid or a (10000x10000) grid. Can you do it for higher dimensions? That is can you count how many cubes or boxes of different size are there in a (10x10x10) sized cube or how many hyper-cubes or hyper-boxes of different size are there in a four-dimensional (5x5x5x5) sized hypercube. Remember that your program needs to be very efficient. You can assume that squares are not rectangles, cubes are not boxes and hyper-cubes are not hyper-boxes. 

 

Fig: A 4x4 Grid

Fig: A 4x4x4 Cube

 

 

Input

The input contains one integer N (0<=N<=100) in each line, which is the length of one side of the grid or cube or hypercube. As for the example above the value of N is 4. There may be as many as 100 lines of input.

 

Output

For each line of input, output six integers S2, R2, S3, R3, S4, R4 in a single line where S2 means no of squares of different size in ( NxN)two-dimensional grid, R2 means no of rectangles of different size in (NxN) two-dimensional grid. S3, R3, S4, R4 means similar cases in higher dimensions as described before.  

 

Sample Input:

1
2
3

Sample Output:

1 0 1 0 1 0
5 4 9 18 17 64
14 22 36 180 98 1198


表示一开始WA了一次 因为没用longlong 然后看了一下别人的代码才 发现了问题


#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
using namespace std;
const int maxn= 10001;
int main()
{
    long long n,m,i ,s2, r2, s3, r3, s4, r4;
    while(scanf("%lld", &n) != EOF)
    {
        s2 = r2 = s3 = r3 = s4 = r4 = 0;
        for(i = 1; i <= n; i++)
        {
            s2 += i * i;
            s3 += i * i * i;
            s4 += i * i * i * i;
        }
        m = n * (n + 1) /2;
        r2 = m * m - s2;
        r3 = m * m *m - s3;
        r4 = m * m * m * m -s4;
        printf("%lld %lld %lld %lld %lld %lld\n", s2, r2, s3, r3, s4, r4);
    }

    return 0;
}



6_v1r3_server/verify_area_key//lib/libjansson.a -Wl,--no-whole-archive -lpthread -lm /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-armv8-mont.o): in function `bn_mul_mont&#39;: (.text+0x0): multiple definition of `bn_mul_mont&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-armv8-mont.o):(.text+0x0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_mul_add_words&#39;: bn_asm.c:(.text+0x0): multiple definition of `bn_mul_add_words&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_mul_words&#39;: bn_asm.c:(.text+0x140): multiple definition of `bn_mul_words&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x140): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_sqr_words&#39;: bn_asm.c:(.text+0x234): multiple definition of `bn_sqr_words&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x234): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_div_words&#39;: bn_asm.c:(.text+0x2e4): multiple definition of `bn_div_words&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x2e4): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_add_words&#39;: bn_asm.c:(.text+0x410): multiple definition of `bn_add_words&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x410): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_sub_words&#39;: bn_asm.c:(.text+0x520): multiple definition of `bn_sub_words&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x520): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_mul_comba8&#39;: bn_asm.c:(.text+0x680): multiple definition of `bn_mul_comba8&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x680): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_mul_comba4&#39;: bn_asm.c:(.text+0xe10): multiple definition of `bn_mul_comba4&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0xe10): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_sqr_comba8&#39;: bn_asm.c:(.text+0x1000): multiple definition of `bn_sqr_comba8&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x1000): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-bn_asm.o): in function `bn_sqr_comba4&#39;: bn_asm.c:(.text+0x1620): multiple definition of `bn_sqr_comba4&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-bn_asm.o):bn_asm.c:(.text+0x1620): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o): in function `DES_encrypt1&#39;: des_enc.c:(.text+0x0): multiple definition of `DES_encrypt1&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):des_enc.c:(.text+0x0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o): in function `DES_encrypt2&#39;: des_enc.c:(.text+0x12b0): multiple definition of `DES_encrypt2&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):des_enc.c:(.text+0x12b0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o): in function `DES_encrypt3&#39;: des_enc.c:(.text+0x24c0): multiple definition of `DES_encrypt3&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):des_enc.c:(.text+0x24c0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o): in function `DES_decrypt3&#39;: des_enc.c:(.text+0x25c0): multiple definition of `DES_decrypt3&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):des_enc.c:(.text+0x25c0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o): in function `DES_ncbc_encrypt&#39;: des_enc.c:(.text+0x26c0): multiple definition of `DES_ncbc_encrypt&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):des_enc.c:(.text+0x26c0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o): in function `DES_ede3_cbc_encrypt&#39;: des_enc.c:(.text+0x2b20): multiple definition of `DES_ede3_cbc_encrypt&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):des_enc.c:(.text+0x2b20): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-des_enc.o):(.rodata+0x0): multiple definition of `DES_SPtrans&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-des_enc.o):(.rodata+0x0): first defined here /opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/../lib/gcc/aarch64-none-linux-gnu/10.3.1/../../../../aarch64-none-linux-gnu/bin/ld: /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(liblegacy-lib-fcrypt_b.o): in function `fcrypt_body&#39;: fcrypt_b.c:(.text+0x0): multiple definition of `fcrypt_body&#39;; /home/thn/at606_v1r3_server/verify_area_key//lib/libcrypto.a(libcrypto-lib-fcrypt_b.o):fcrypt_b.c:(.text+0x0): first defined here collect2: error: ld returned 1 exit status make: *** [Makefile:44: app] Error 1&#39;
11-19
void ADCzds_CH16_Init(void) { RCC->AHB1ENR |= (1<<2);//GPIO使能 RCC->AHB1ENR |= (1<<0); //时钟使能 RCC->APB2ENR |= (1<<8); //时钟使能ADC1 GPIOC->MODER &= ~(3<<0);//PC0模拟模式 GPIOC->MODER |= (3<<0); GPIOA->MODER &= ~(3<<8);//PA4配置模拟模式 GPIOA->MODER |= (3<<8); /*ADC配置*/ ADC1->CR1 &= ~(3<<24);//分辨率 ADC1->CR1 |= (1<<8);//扫描模式 ADC1->CR1 |= (1<<5);//中断使能 ADC1->CR2 &= ~(1<<11);//数据对齐 ADC1->CR2 |= (1<<10);//结束转换选择(多通道) ADC1->CR2 &= ~(1<<1);//单次转换模式 ADC1->SMPR2 |= (7<<12);//4采样时间 ADC1->SMPR1 |= (7<<0);//10 ADC1->SMPR1 |= (7<<18);//16 ADC1->SQR1 &= ~(0xf<<20); ADC1->SQR1 |= (2<<20);//3次转换 ADC1->SQR3 &= ~(0x1f<<0);//规则序列1 ch4 ADC1->SQR3 |= (1<<2); ADC1->SQR3 &= ~(0x1f<<5);//规则序列2 ch10 ADC1->SQR3 |= (10<<5); ADC1->SQR3 &= ~(0x1f<<10);//规则序列3 ch16 ADC1->SQR3 |= (16<<10); ADC->CCR &= ~(3<<16);//4分频 ADC->CCR |= (1<<16); NVIC_SetPriority(ADC_IRQn, NVIC_EncodePriority (7-2,2,0));//NVIC优先级 ADC->CCR |= (1<<23);//温度传感器使能 NVIC_EnableIRQ(ADC_IRQn);//使能中断通道 ADC1->CR2 |= (1<<0);//使能ADC } void ADC_IRQHandler(void) { static u8 flag = 0; float cnt = 0; u16 data1 = 0; u16 data2 = 0; u16 data3 = 0; u8 prencent1 = 0,prencent2 = 0; float temp = 0; if(ADC1->SR & (1<<1)) { flag++; if(flag == 1) { data1 = ADC1->DR;//光敏 //printf("data1:%d\r\n",data1); } else if(flag == 2) { data2 = ADC1->DR;//烟雾 //printf("data2:%d\r\n",data2); } else if(flag == 3) { data3 = ADC1->DR;//温度 printf("data3:%d\r\n",data3); prencent1 = (float)(4095-data1)/4095.0f*100; cnt = (data1/4095.0f)*3.3f; tychange (cnt); printf("光敏: %d%%\r\n",prencent1); prencent2 = (float)data2/4095.f*100; printf("烟雾: %d%%\r\n",prencent2); temp = (((((float)data3/4095.0f)*3.3f)-0.76)/0.0025+25); printf("温度: %.2f℃\r\n",temp); flag = 0; } }
08-16
/** * main.c * STM32F103 波形发生器 * 输出: PA6 (TIM3_CH1) → PWM → RC滤波 → 模拟信号 * 按键: PA15(切换), PB4/PB5(±100Hz), PB6/PB7(±256) */ #include "stm32f10x.h" #include <math.h> // ------------------------------- // GPIO 引脚宏定义(若未定义) // ------------------------------- #ifndef GPIO_PIN_0 #define GPIO_PIN_0 ((uint16_t)0x0001) #define GPIO_PIN_1 ((uint16_t)0x0002) #define GPIO_PIN_2 ((uint16_t)0x0004) #define GPIO_PIN_3 ((uint16_t)0x0008) #define GPIO_PIN_4 ((uint16_t)0x0010) #define GPIO_PIN_5 ((uint16_t)0x0020) #define GPIO_PIN_6 ((uint16_t)0x0040) #define GPIO_PIN_7 ((uint16_t)0x0080) #define GPIO_PIN_8 ((uint16_t)0x0100) #define GPIO_PIN_9 ((uint16_t)0x0200) #define GPIO_PIN_10 ((uint16_t)0x0400) #define GPIO_PIN_11 ((uint16_t)0x0800) #define GPIO_PIN_12 ((uint16_t)0x1000) #define GPIO_PIN_13 ((uint16_t)0x2000) #define GPIO_PIN_14 ((uint16_t)0x4000) #define GPIO_PIN_15 ((uint16_t)0x8000) #endif // ------------------------------- // AFIO MAPR 掩码(标准库可能缺失) // ------------------------------- #ifndef AFIO_MAPR_SWJ_CFG_MASK #define AFIO_MAPR_SWJ_CFG_MASK ((uint32_t)0x07 << 24) #endif #ifndef AFIO_MAPR_TIM3_REMAP_MASK #define AFIO_MAPR_TIM3_REMAP_MASK ((uint32_t)0x03 << 28) #endif // ------------------------------- // 波形类型 // ------------------------------- #define WAVE_SINE 0 #define WAVE_SQUARE 1 #define WAVE_TRIANGLE 2 // ------------------------------- // 全局变量 // ------------------------------- __IO uint8_t current_wave = WAVE_SINE; __IO uint16_t current_frequency = 1000; // Hz __IO uint16_t current_amplitude = 2048; // 0~4095 __IO float phase_accumulator = 0.0f; // 相位 [0, 360) __IO float phase_step = 360.0f; // 每毫秒增量 uint16_t sine_table[360]; // 正弦查找表 // ------------------------------- // 延时函数(基于 72MHz CPU) // ------------------------------- void Delay_ms(uint32_t ms) { while (ms--) { for (uint32_t i = 0; i < 7200; i++) { __NOP(); } } } // ------------------------------- // 按键扫描(带消抖和释放检测,含超时保护) // ------------------------------- uint8_t Key_Scan(GPIO_TypeDef* GPIOx, uint16_t pin) { if (!(GPIOx->IDR & pin)) { Delay_ms(5); if (!(GPIOx->IDR & pin)) { // 等待释放,最多等待 500ms uint32_t timeout = 0; while (!(GPIOx->IDR & pin) && ++timeout < 500) { Delay_ms(1); } return 1; } } return 0; } // ------------------------------- // GPIO 初始化 // ------------------------------- void GPIO_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN; // 配置 AFIO: 禁用 JTAG-DP,启用 TIM3 部分重映射 (PA6/PA7) AFIO->MAPR = (AFIO->MAPR & ~(AFIO_MAPR_SWJ_CFG_MASK | AFIO_MAPR_TIM3_REMAP_MASK)) | (0x02 << 24) // SW-DP only | AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; // PA15: 浮空输入 + 上拉(波形切换) GPIOA->CRH &= ~(GPIO_CRH_CNF15 | GPIO_CRH_MODE15); GPIOA->CRH |= GPIO_CRH_CNF15_0; GPIOA->ODR |= GPIO_PIN_15; // PB4~PB7: 浮空输入 + 上拉(控制键) GPIOB->CRL &= ~((GPIO_CRL_CNF4 | GPIO_CRL_MODE4) | (GPIO_CRL_CNF5 | GPIO_CRL_MODE5) | (GPIO_CRL_CNF6 | GPIO_CRL_MODE6) | (GPIO_CRL_CNF7 | GPIO_CRL_MODE7)); GPIOB->CRL |= GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0; GPIOB->ODR |= GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; // PA6: 复用推挽输出 (TIM3_CH1) GPIOA->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_MODE6); GPIOA->CRL |= GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6_1; // 50MHz } // ------------------------------- // TIM3 PWM 初始化 (PA6 输出) // ------------------------------- void TIM3_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3->PSC = 71; // 1MHz 计数频率 TIM3->ARR = 3999; // PWM 频率 = 250kHz TIM3->CCR1 = 2000; // 初始占空比 50% TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; TIM3->CCER |= TIM_CCER_CC1E; TIM3->CR1 |= TIM_CR1_CEN; } // ------------------------------- // 构建正弦查找表 // ------------------------------- void BuildSineTable(void) { for (int i = 0; i < 360; i++) { float angle_rad = i * 3.14159265f / 180.0f; sine_table[i] = (uint16_t)(current_amplitude * (1.0f + sinf(angle_rad)) / 2.0f); } } // ------------------------------- // 更新 PWM 输出值 // ------------------------------- void UpdateWaveform(void) { uint16_t compare_val = 0; uint16_t deg = (uint16_t)phase_accumulator % 360; switch (current_wave) { case WAVE_SINE: compare_val = sine_table[deg]; break; case WAVE_SQUARE: compare_val = (deg < 180) ? current_amplitude : 0; break; case WAVE_TRIANGLE: compare_val = (deg < 180) ? (current_amplitude * deg) / 180 : (current_amplitude * (360 - deg)) / 180; break; } if (compare_val > 4095) compare_val = 4095; TIM3->CCR1 = compare_val; } // ------------------------------- // TIM2 初始化:1ms 定时中断 // ------------------------------- void TIM2_Init(void) { RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC = 71; // 1MHz TIM2->ARR = 999; // 1ms 中断 TIM2->DIER |= TIM_DIER_UIE; TIM2->CR1 |= TIM_CR1_CEN; NVIC_EnableIRQ(TIM2_IRQn); } // ------------------------------- // TIM2 中断服务程序 // ------------------------------- void TIM2_IRQHandler(void) { if (TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~TIM_SR_UIF; phase_accumulator += phase_step; if (phase_accumulator >= 360.0f) { phase_accumulator -= 360.0f; } UpdateWaveform(); } } // ------------------------------- // 检查按键状态 // ------------------------------- void CheckButtons(void) { uint8_t updated = 0; if (Key_Scan(GPIOA, GPIO_PIN_15)) { current_wave = (current_wave + 1) % 3; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_4)) { current_frequency += 100; if (current_frequency > 10000) current_frequency = 10000; phase_step = 360.0f * current_frequency / 1000.0f; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_5)) { current_frequency -= 100; if (current_frequency < 100) current_frequency = 100; phase_step = 360.0f * current_frequency / 1000.0f; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_6)) { current_amplitude += 256; if (current_amplitude > 4095) current_amplitude = 4095; updated = 1; } if (Key_Scan(GPIOB, GPIO_PIN_7)) { current_amplitude -= 256; if (current_amplitude < 100) current_amplitude = 100; updated = 1; } if (updated) { BuildSineTable(); // 重建正弦表 } } // ------------------------------- // 系统时钟初始化:HSE+PLL → 72MHz // ------------------------------- void SystemClock_Init(void) { RCC->CR |= RCC_CR_HSEON; while (!(RCC->CR & RCC_CR_HSERDY)); RCC->CFGR &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL); RCC->CFGR |= RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR_PLLMULL9; RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR & RCC_CR_PLLRDY)); RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL); } // ------------------------------- // 主函数 // ------------------------------- int main(void) { SystemClock_Init(); GPIO_Init(); TIM3_Init(); TIM2_Init(); phase_step = 360.0f * current_frequency / 1000.0f; BuildSineTable(); while (1) { CheckButtons(); Delay_ms(10); } } 如何显示波形
最新发布
12-19
你已经用 STM32F103 实现了一个 **波形发生器**,通过 PWM 输出模拟正弦、方波、三角波。现在你想“**如何显示波形**”,这个问题非常关键。 --- ## ✅ 你的目标:可视化输出的波形 目前你的代码已经生成了信号: - PA6 输出 PWM → 经 RC 滤波后变成类模拟电压 - 改变频率和幅度可通过按键调节 但你无法“看到”它的真实形状 —— 所以你需要 **将这个电信号可视化为图形化的波形图**。 --- ## 🔍 解决方案分类 | 方法 | 是否可行 | 工具/成本 | 说明 | |------|----------|-----------|------| | 1. 使用示波器观察 | ✅ 最推荐 | 示波器(哪怕二手) | 直接测量 PA6 或滤波后的信号 | | 2. 使用逻辑分析仪 + 上位机 | ⚠️ 仅看 PWM | Saleae、开源分析仪 | 只能抓数字信号,不能直接看模拟 | | 3. 使用串口发送采样数据 → PC 绘图 | ✅ 软件仿真式显示 | USART + Python matplotlib | 需 ADC 采样反馈 | | 4. 接 OLED 屏幕本地显示波形 | ✅ 嵌入式绘图 | SSD1306 OLED 屏 | 在设备端实时画图 | | 5. 使用音频软件监听(扬声器) | ⚠️ 辅助判断 | 耳机或喇叭 | 听音辨频 | 我们来逐个讲解,并给出可运行的代码方案。 --- ## ✅ 方案一:使用示波器观察(最简单有效) ### 📌 步骤: 1. 将 `PA6` 引脚连接到示波器探头 2. 如果加了 RC 低通滤波器,也可以测其输出端(模拟电压) 3. 设置示波器为 **直流耦合、自动触发** 4. 按键切换波形类型,你应该能看到: - 正弦波:平滑曲线 - 方波:高低跳变 - 三角波:线性上升下降 > 💡 提示:若没有真实示波器,可以使用国产便携式数字示波器(如 TinyScope、DigiView),百元级即可支持 1MHz 带宽。 --- ## ✅ 方案二:串口上传 ADC 采样数据 → PC 实时绘图(推荐 DIY) 你可以让 STM32 把自己输出的模拟信号读回来(通过 ADC),然后通过 UART 发送给电脑,在 Python 中实时绘制波形。 ### 🔧 硬件修改建议: - 将你滤波后的模拟信号接入一个 ADC 输入引脚(比如 `PA0`) - 使用 ADC1_CH0 采集该电压 - 通过 USART1 发送到 PC(USB转TTL) --- ### ✅ 示例代码:ADC + USART 上传采样数据 ```c // 添加到 main.c 开头 #include <stdio.h> // 函数声明 void ADC1_Init(void); void USART1_Init(void); uint16_t ADC_Read(void); // ------------------------------- // ADC1 初始化 (PA0) // ------------------------------- void ADC1_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_ADC1EN; // PA0 配置为模拟输入 GPIOA->CRL &= ~GPIO_CRL_MODE0; GPIOA->CRL &= ~GPIO_CRL_CNF0; ADC1->SQR1 = 0; ADC1->SQR3 = 0; // 通道 0 ADC1->CR2 |= ADC_CR2_ADON; // 开启 ADC } // ------------------------------- // USART1 初始化 (TX: PA9) // ------------------------------- void USART1_Init(void) { RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN; // PA9 复用推挽输出 GPIOA->CRH &= ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9); GPIOA->CRH |= GPIO_CRH_MODE9_1 | GPIO_CRH_CNF9_1; USART1->BRR = 72000000 / 115200; // 波特率 115200 USART1->CR1 = USART_CR1_TE | USART_CR1_UE; } // ------------------------------- // 发送字节 // ------------------------------- void USART_SendByte(uint8_t byte) { while (!(USART1->SR & USART_SR_TXE)); USART1->DR = byte; } // ------------------------------- // ADC 读取一次值 // ------------------------------- uint16_t ADC_Read(void) { ADC1->CR2 |= ADC_CR2_SWSTART; while (!(ADC1->SR & ADC_SR_EOC)); return (uint16_t)ADC1->DR; } ``` ### 🖥 Python 上位机绘图脚本(使用 `pyserial` + `matplotlib`) ```python # plot_wave.py import serial import matplotlib.pyplot as plt import numpy as np ser = serial.Serial(&#39;COM5&#39;, 115200) # 修改为你自己的串口号 data = [] plt.ion() fig, ax = plt.subplots() line, = ax.plot([], [], &#39;b-&#39;) ax.set_ylim(0, 4095) ax.set_xlim(0, 100) print("开始接收波形数据...") try: while True: if ser.in_waiting: line_str = ser.readline().decode().strip() try: val = int(line_str) data.append(val) if len(data) > 100: data.pop(0) line.set_data(range(len(data)), data) ax.relim() ax.autoscale_view() fig.canvas.draw() fig.canvas.flush_events() except: pass except KeyboardInterrupt: ser.close() print("结束") ``` > 安装依赖: ```bash pip install pyserial matplotlib ``` ### 🔁 在主循环中添加发送: ```c // 在 main() 的 while(1) 中加入 static uint32_t adc_timer = 0; if (++adc_timer >= 10) { // 每 100ms 发一次包 uint16_t adc_val = ADC_Read(); char str[10]; sprintf(str, "%d\n", adc_val); for (int i = 0; str[i]; i++) USART_SendByte(str[i]); adc_timer = 0; } ``` 这样就能在电脑上看到实时波形! --- ## ✅ 方案三:OLED 显示屏本地显示波形(嵌入式 GUI) 使用 I2C OLED(SSD1306)在设备本地画出当前波形的一个周期。 ### 🔧 所需硬件: - 0.96" I2C OLED 屏(128x64- 接线:PB6(SCL), PB7(SDA) 或其他 I2C 引脚 ### 示例片段(基于简单绘图函数): ```c // 伪代码:清屏后画正弦波点阵 void DrawWaveform() { SSD1306_Clear(); for (int x = 0; x < 128; x++) { float angle = x * 360.0f / 128; float rad = angle * 3.14159f / 180.0f; int y; switch (current_wave) { case WAVE_SINE: y = 32 - 30 * sinf(rad); break; case WAVE_SQUARE: y = (angle < 180) ? 2 : 62; break; case WAVE_TRIANGLE: y = (angle < 180) ? (32 - 30 * angle / 180) : (32 - 30 * (360 - angle) / 180); break; } SSD1306_DrawPixel(x, (uint8_t)y); } SSD1306_UpdateScreen(); } ``` > 你需要引入 SSD1306 驱动库(GitHub 上有很多开源版本) --- ## ✅ 方案四:用耳机听声音(辅助调试音频范围波形) 如果你设置的频率在 20Hz ~ 20kHz 范围内: - 把滤波后的信号接一个电容(如 10μF)串联到耳机 - 注意电压不要超过 1.5V!可加分压电阻保护耳朵 - 你会听到不同音调的声音: - 正弦波:纯净音 - 方波:较刺耳 - 三角波:柔和一些 > ⚠️ 安全第一!切勿直接驱动耳机! --- ## ✅ 总结:四种“显示波形”的方式对比 | 方法 | 成本 | 难度 | 效果 | 推荐指数 | |------|------|------|------|---------| | 🔹 示波器观察 | 中 | 极低 | ★★★★★ | ⭐⭐⭐⭐⭐ | | 🔹 串口+Python绘图 | 低 | 中 | ★★★★☆ | ⭐⭐⭐⭐☆ | | 🔹 OLED 本地显示 | 低 | 中高 | ★★★☆☆ | ⭐⭐⭐⭐ | | 🔹 耳机试听 | 极低 | 低 | ★★☆☆☆(主观) | ⭐⭐⭐ | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值