帮我转换成HAL库 void TIM2_PWM_Output(float Duty , uint32_t Frequency) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO ,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = (1000000/Frequency)-1; //ARR = (TIM3 counter clock /Frequency)-1 TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel3 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = ((1000000/Frequency)-1)*Duty; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM2, ENABLE); /* TIM3 enable counter */ TIM_Cmd(TIM2, ENABLE); }

时间: 2023-09-04 15:09:03 浏览: 413
对应的HAL库代码如下: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim2; void TIM2_PWM_Output(float Duty , uint32_t Frequency) { GPIO_InitTypeDef GPIO_InitStruct = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); htim2.Instance = TIM2; htim2.Init.Prescaler = 71; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = (1000000/Frequency)-1; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = ((1000000/Frequency)-1)*Duty; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); } ``` 注意,此处假设你使用的是STM32F1系列的芯片,需要包含"stm32f1xx_hal.h"头文件。请根据实际情况进行调整。
阅读全文

相关推荐

#include "stm32f10x.h" #include "buzzer.h" void Delay_ms(uint32_t ms) { volatile uint32_t i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 1000; j++); } } int main(void) { // ????? SystemInit(); Buzzer_Init(); while (1) { // ?????? for (uint16_t freq = 200; freq <= 2000; freq += 100) { Change_Tone(freq); Delay_ms(300000); } for (uint16_t freq = 2000; freq >= 200; freq -= 100) { Change_Tone(freq); Delay_ms(300000); } // ???? Play_Song(birthday_notes, birthday_durations, 25); Delay_ms(300000); // ???? } return 0; } #ifndef __BUZZER_H #define __BUZZER_H #include "stm32f10x.h" // ?????(Hz) extern const uint16_t tone_freq[]; // ???? extern const uint8_t birthday_notes[]; extern const uint8_t birthday_durations[]; // ???? void Buzzer_Init(void); void Change_Tone(uint16_t freq); void Play_Song(const uint8_t* notes, const uint8_t* durations, uint8_t len); #endif /* __BUZZER_H */ #include "buzzer.h" // C??????? const uint16_t tone_freq[] = { 0, 262, 294, 330, 349, 392, 440, 494, 523 }; // ??????? const uint8_t birthday_notes[] = { 1,1,2,1,5,4, 1,1,2,1,6,5, 1,1,8,6,4,3,2, 7,7,6,4,5,4 }; const uint8_t birthday_durations[] = { 2,2,2,2,4,4, 2,2,2,2,4,4, 2,2,4,4,4,4,2, 2,2,4,4,4,4 }; // ????(??SysTick????????) static void Delay_ms(uint32_t ms) { uint32_t i; for (i = 0; i < ms; i++) { __asm("nop"); __asm("nop"); __asm("nop"); } } void Buzzer_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // ?????? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // ??PB10??????? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // ??????????200Hz-2000Hz???? uint16_t prescaler = 72 - 1; // 72MHz / 72 = 1MHz???? uint16_t max_arr = 1000000 / 200 - 1; // 200Hz???ARR?(4999) // ?????? TIM_TimeBaseStructure.TIM_Period = max_arr; TIM_TimeBaseStructure.TIM_Prescaler = prescaler; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // ??PWM?? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = max_arr / 2; // 50%?????? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); } // ?????? #define MIN_FREQ 100 // ??????(Hz) #define MAX_FREQ 10000 // ??????(Hz) void Change_Tone(uint16_t freq) { // ?????? if (freq == 0) { TIM_SetCompare3(TIM2, 0); // ??PWM?? return; } // ?????? if (freq < MIN_FREQ) { freq = MIN_FREQ; // ?????? // ????????? } else if (freq > MAX_FREQ) { freq = MAX_FREQ; // ?????? // ????????? } // ???????????? uint32_t arr_calc = 1000000 / freq; // 1MHz / ?? // ?????? if (arr_calc > 65535) { arr_calc = 65535; // ????? // ????????? } uint16_t arr = (uint16_t)arr_calc; uint16_t compare = arr / 2; // 50%??? // ??????? TIM_SetAutoreload(TIM2, arr); TIM_SetCompare3(TIM2, compare); } // ???? void Play_Song(const uint8_t* notes, const uint8_t* durations, uint8_t len) { for (uint8_t i = 0; i < len; i++) { uint16_t freq = tone_freq[notes[i]]; Change_Tone(freq); Delay_ms(durations[i] * 500); // ?????? Change_Tone(0); // ???? Delay_ms(1000); } } 为什么蜂鸣器不发出声响,可以正常烧录,也没有报错

void Encoder_Init_TIM2(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //ʹŜ֨ʱǷ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE); //ʹԃA Bࠚ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PB3 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_TIM2); //شԃΪTIM2 ҠëǷޓࠚ GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2); //شԃΪTIM2 ҠëǷޓࠚ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling //һؖƵ TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //ʨ݆֨˽Ƿؔ֯טװֵ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ѡձʱדؖƵúһؖƵ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMвʏ݆˽ TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //Եʼۯ֨ʱǷ TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//ʹԃҠëǷģʽ3 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update);//ȥԽTIMքټтҪ־λ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_SetCounter(TIM2,0); TIM_Cmd(TIM2, ENABLE); } /************************************************************************** Function: Initialize TIM3 as the encoder interface mode Input : none Output : none گ˽٦ŜúёTIM3ԵʼۯΪҠëǷޓࠚģʽ ɫࠚӎ˽úϞ ׵ܘ ֵúϞ **************************************************************************/ void Encoder_Init_TIM3(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ʹŜ֨ʱǷ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //ʹԃAࠚ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; //PB4 PB5 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_TIM3); //شԃΪTIM2 ҠëǷޓࠚ GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_TIM3); //شԃΪTIM2 ҠëǷޓࠚ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling //һؖƵ TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //ʨ݆֨˽Ƿؔ֯טװֵ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ѡձʱדؖƵúһؖƵ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMвʏ݆˽ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //Եʼۯ֨ʱǷ TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//ʹԃҠëǷģʽ3 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ClearFlag(TIM3, TIM_FLAG_Update);//ȥԽTIMքټтҪ־λ TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_SetCounter(TIM3,0); TIM_Cmd(TIM3, ENABLE); } /************************************************************************** Function: Initialize TIM4 as the encoder interface mode Input : none Output : none گ˽٦ŜúёTIM4ԵʼۯΪҠëǷޓࠚģʽ ɫࠚӎ˽úϞ ׵ ܘ ֵúϞ **************************************************************************/ void Encoder_Init_TIM4(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//ʹŜ֨ʱǷ4քʱד RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//ʹŜPB׋ࠚʱד GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//׋ࠚƤ׃ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStructure); //ٹߝʨ֨ӎ˽ԵʼۯGPIOB GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4); //شԃΪTIM4 ҠëǷޓࠚ GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4); //شԃΪTIM4 ҠëǷޓࠚ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //ʨ݆֨˽Ƿؔ֯טװֵ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//ѡձʱדؖƵúһؖƵ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMвʏ݆˽ TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//ʹԃҠëǷģʽ3 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM4, &TIM_ICInitStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); TIM_SetCounter(TIM4,0); TIM_Cmd(TIM4, ENABLE); } /************************************************************************** Function: Initialize TIM5 as the encoder interface mode Input : none Output : none گ˽٦ŜúёTIM5ԵʼۯΪҠëǷޓࠚģʽ ɫࠚӎ˽úϞ ׵ܘ ֵúϞ **************************************************************************/ void Encoder_Init_TIM5(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);//ʹŜ֨ʱǷ4քʱד RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹŜPB׋ࠚʱד GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //شԃΪTIM4 ҠëǷޓࠚ GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //شԃΪTIM4 ҠëǷޓࠚ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//׋ࠚƤ׃ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); //ٹߝʨ֨ӎ˽ԵʼۯGPIOB TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //ʨ݆֨˽Ƿؔ֯טװֵ TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//ѡձʱדؖƵúһؖƵ TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMвʏ݆˽ TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//ʹԃҠëǷģʽ3 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM5, &TIM_ICInitStructure); TIM_ClearFlag(TIM5, TIM_FLAG_Update); TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE); TIM_SetCounter(TIM5,0); TIM_Cmd(TIM5, ENABLE); } /************************************************************************** Function: Read the encoder count Input : The timer Output : Encoder value (representing speed) گ˽٦ŜúׁȡҠëǷ݆˽ ɫࠚӎ˽ú֨ʱǷ ׵ܘ ֵúҠëǷ˽ֵ(պҭ̙׈) **************************************************************************/ int Read_Encoder(u8 TIMX) { int Encoder_TIM; switch(TIMX) { case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0; break; case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0; break; case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0; break; case 5: Encoder_TIM= (short)TIM5 -> CNT; TIM5 -> CNT=0; break; default: Encoder_TIM=0; } return Encoder_TIM; } 怎么测速

#include "stm32f10x.h" #include "stdio.h" #include "string.h" // 定义全局变量 uint32_t freq = 0; // 用于存储测量得到的频率值 TIM_HandleTypeDef htim2; // 定时器2的句柄 // 定时器2初始化函数 void MX_TIM2_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_IC_InitTypeDef sConfigIC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 72 - 1; // 预分频,72MHz系统时钟下得到1MHz计数频率 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 0xFFFF; // 自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim2)!= HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig)!= HAL_OK) { Error_Handler(); } if (HAL_TIM_IC_Init(&htim2)!= HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig)!= HAL_OK) { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1)!= HAL_OK) { Error_Handler(); } } // GPIO初始化函数 void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); // 这里可以添加其他GPIO初始化代码,比如LED、按键等相关GPIO初始化 } // USART1初始化函数 void MX_USART1_UART_Init(void) { UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTR

const u16 SINWAVE[4096]={ 2047,2050,2053,2056,2060,2063,2066,2069,2072,2075,2078,2082,2085,2088,2091,2094, 2097,2100,2104,2107,2110,2113,2116,2119,2122,2126,2129,2132,2135,2138,2141,2144, 2147,2151,2154,2157,2160,2163,2166,2169,2173,2176,2179,2182,2185,2188,2191,2195, 2198,2201,2204,2207,2210,2213,2216,2220,2223,2226,2229,2232,2235,2238,2241,2245, 2248,2251,2254,2257,2260,2263,2266,2270,2273,2276,2279,2282,2285,2288,2291,2295, 2298,2301,2304,2307,2310,2313,2316,2320,2323,2326,2329,2332,2335,2338,2341,2344, 2348,2351,2354,2357,2360,2363,2366,2369,2372,2375,2379,2382,2385,2388,2391,2394, 2397,2400,2403,2406,2410,2413,2416,2419,2422,2425,2428,2431,2434,2437,2440,2443, 2447,2450,2453,2456,2459,2462,2465,2468,2471,2474,2477,2480,2483,2487,2490,2493, 2496,2499,2502,2505,2508,2511,2514,2517,2520,2523,2526,2529,2532,2535,2539,2542, 2545,2548,2551,2554,2557,2560,2563,2566,2569,2572,2575,2578,2581,2584,2587,2590, 2593,2596,2599,2602,2605,2608,2611,2614,2617,2620,2623,2626,2629,2632,2635,2638, 2641,2645,2648,2651,2654,2657,2660,2663,2666,2668,2671,2674,2677,2680,2683,2686, 2689,2692,2695,2698,2701,2704,2707,2710,2713,2716,2719,2722,2725,2728,2731,2734, 2737,2740,2743,2746,2749,2752,2755,2758,2761,2763,2766,2769,2772,2775,2778,2781, 2784,2787,2790,2793,2796,2799,2802,2805,2807,2810,2813,2816,2819,2822,2825,2828, 2831,2834,2837,2839,2842,2845,2848,2851,2854,2857,2860,2863,2865,2868,2871,2874, 2877,2880,2883,2886,2888,2891,2894,2897,2900,2903,2906,2908,2911,2914,2917,2920, 2923,2925,2928,2931,2934,2937,2940,2942,2945,2948,2951,2954,2957,2959,2962,2965, 2968,2971,2973,2976,2979,2982,2985,2987,2990,2993,2996,2999,3001,3004,3007,3010, 3012,3015,3018,3021,3023,3026,3029,3032,3034,3037,3040,3043,3045,3048,3051,3054, 3056,3059,3062,3065,3067,3070,3073,3076,3078,3081,3084,3086,3089,3092,3094,3097, 3100,3103,3105,3108,3111,3113,3116,3119,3121,3124,3127,3129,3132,3135,3137,3140, 3143,3145,3148,3151,3153,3156,3159,3161,3164,3166,3169,3172,3174,3177,3180,3182, 3185,3187,3190,3193,3195,3198,3200,3203,3206,3208,3211,3213,3216,3219,3221,3224, 3226,3229,3231,3234,3236,3239,3242,3244,3247,3249,3252,3254,3257,3259,3262,3264, 3267,3269,3272,3275,3277,3280,3282,3285,3287,3290,3292,3295,3297,3300,3302,3304, 3307,3309,3312,3314,3317,3319,3322,3324,3327,3329,3332,3334,3336,3339,3341,3344, 3346,3349,3351,3353,3356,3358,3361,3363,3366,3368,3370,3373,3375,3377,3380,3382, 3385,3387,3389,3392,3394,3396,3399,3401,3404,3406,3408,3411,3413,3415,3418,3420, 3422,3425,3427,3429,3432,3434,3436,3439,3441,3443,3445,3448,3450,3452,3455,3457, 3459,3461,3464,3466,3468,3470,3473,3475,3477,3479,3482,3484,3486,3488,3491,3493, 3495,3497,3500,3502,3504,3506,3508,3511,3513,3515,3517,3519,3521,3524,3526,3528, 3530,3532,3534,3537,3539,3541,3543,3545,3547,3550,3552,3554,3556,3558,3560,3562, 3564,3566,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3594,3596, 3598,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628, 3630,3632,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3659, 3661,3663,3665,3667,3669,3671,3673,3675,3677,3679,3681,3682,3684,3686,3688,3690, 3692,3694,3696,3697,3699,3701,3703,3705,3707,3709,3710,3712,3714,3716,3718,3719, 3721,3723,3725,3727,3728,3730,3732,3734,3736,3737,3739,3741,3743,3744,3746,3748, 3750,3751,3753,3755,3757,3758,3760,3762,3764,3765,3767,3769,3770,3772,3774,3775, 3777,3779,3780,3782,3784,3785,3787,3789,3790,3792,3794,3795,3797,3799,3800,3802, 3803,3805,3807,3808,3810,3811,3813,3815,3816,3818,3819,3821,3823,3824,3826,3827, 3829,3830,3832,3833,3835,3836,3838,3839,3841,3843,3844,3846,3847,3849,3850,3852, 3853,3854,3856,3857,3859,3860,3862,3863,3865,3866,3868,3869,3870,3872,3873,3875, 3876,3878,3879,3880,3882,3883,3885,3886,3887,3889,3890,3891,3893,3894,3895,3897, 3898,3899,3901,3902,3903,3905,3906,3907,3909,3910,3911,3913,3914,3915,3917,3918, 3919,3920,3922,3923,3924,3925,3927,3928,3929,3930,3932,3933,3934,3935,3936,3938, 3939,3940,3941,3942,3944,3945,3946,3947,3948,3950,3951,3952,3953,3954,3955,3956, 3958,3959,3960,3961,3962,3963,3964,3965,3966,3968,3969,3970,3971,3972,3973,3974, 3975,3976,3977,3978,3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990, 3991,3992,3993,3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006, 4007,4007,4008,4009,4010,4011,4012,4013,4014,4015,4015,4016,4017,4018,4019,4020, 4021,4021,4022,4023,4024,4025,4025,4026,4027,4028,4029,4029,4030,4031,4032,4033, 4033,4034,4035,4036,4036,4037,4038,4039,4039,4040,4041,4041,4042,4043,4044,4044, 4045,4046,4046,4047,4048,4048,4049,4050,4050,4051,4052,4052,4053,4053,4054,4055, 4055,4056,4057,4057,4058,4058,4059,4059,4060,4061,4061,4062,4062,4063,4063,4064, 4064,4065,4066,4066,4067,4067,4068,4068,4069,4069,4070,4070,4071,4071,4072,4072, 4072,4073,4073,4074,4074,4075,4075,4076,4076,4076,4077,4077,4078,4078,4078,4079, 4079,4080,4080,4080,4081,4081,4081,4082,4082,4082,4083,4083,4083,4084,4084,4084, 4085,4085,4085,4086,4086,4086,4086,4087,4087,4087,4088,4088,4088,4088,4089,4089, 4089,4089,4089,4090,4090,4090,4090,4090,4091,4091,4091,4091,4091,4092,4092,4092, 4092,4092,4092,4093,4093,4093,4093,4093,4093,4093,4093,4093,4094,4094,4094,4094, 4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094, 4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094,4094, 4094,4094,4094,4094,4094,4093,4093,4093,4093,4093,4093,4093,4093,4092,4092,4092, 4092,4092,4092,4092,4091,4091,4091,4091,4091,4090,4090,4090,4090,4090,4089,4089, 4089,4089,4088,4088,4088,4088,4087,4087,4087,4087,4086,4086,4086,4085,4085,4085, 4085,4084,4084,4084,4083,4083,4083,4082,4082,4082,4081,4081,4081,4080,4080,4079, 4079,4079,4078,4078,4077,4077,4077,4076,4076,4075,4075,4074,4074,4074,4073,4073, 4072,4072,4071,4071,4070,4070,4069,4069,4068,4068,4067,4067,4066,4066,4065,4065, 4064,4064,4063,4063,4062,4061,4061,4060,4060,4059,4059,4058,4057,4057,4056,4056, 4055,4054,4054,4053,4052,4052,4051,4051,4050,4049,4049,4048,4047,4047,4046,4045, 4045,4044,4043,4042,4042,4041,4040,4040,4039,4038,4037,4037,4036,4035,4034,4034, 4033,4032,4031,4031,4030,4029,4028,4027,4027,4026,4025,4024,4023,4023,4022,4021, 4020,4019,4018,4018,4017,4016,4015,4014,4013,4012,4011,4011,4010,4009,4008,4007, 4006,4005,4004,4003,4002,4001,4001,4000,3999,3998,3997,3996,3995,3994,3993,3992, 3991,3990,3989,3988,3987,3986,3985,3984,3983,3982,3981,3980,3979,3978,3977,3976, 3974,3973,3972,3971,3970,3969,3968,3967,3966,3965,3964,3963,3961,3960,3959,3958, 3957,3956,3955,3954,3952,3951,3950,3949,3948,3947,3945,3944,3943,3942,3941,3939, 3938,3937,3936,3935,3933,3932,3931,3930,3928,3927,3926,3925,3924,3922,3921,3920, 3918,3917,3916,3915,3913,3912,3911,3909,3908,3907,3905,3904,3903,3902,3900,3899, 3897,3896,3895,3893,3892,3891,3889,3888,3887,3885,3884,3882,3881,3880,3878,3877, 3875,3874,3873,3871,3870,3868,3867,3865,3864,3863,3861,3860,3858,3857,3855,3854, 3852,3851,3849,3848,3846,3845,3843,3842,3840,3839,3837,3836,3834,3833,3831,3830, 3828,3826,3825,3823,3822,3820,3819,3817,3815,3814,3812,3811,3809,3807,3806,3804, 3803,3801,3799,3798,3796,3795,3793,3791,3790,3788,3786,3785,3783,3781,3780,3778, 3776,3775,3773,3771,3770,3768,3766,3764,3763,3761,3759,3758,3756,3754,3752,3751, 3749,3747,3745,3744,3742,3740,3738,3737,3735,3733,3731,3729,3728,3726,3724,3722, 3720,3719,3717,3715,3713,3711,3709,3708,3706,3704,3702,3700,3698,3697,3695,3693, 3691,3689,3687,3685,3683,3681,3680,3678,3676,3674,3672,3670,3668,3666,3664,3662, 3660,3659,3657,3655,3653,3651,3649,3647,3645,3643,3641,3639,3637,3635,3633,3631, 3629,3627,3625,3623,3621,3619,3617,3615,3613,3611,3609,3607,3605,3603,3601,3599, 3597,3595,3593,3590,3588,3586,3584,3582,3580,3578,3576,3574,3572,3570,3568,3565, 3563,3561,3559,3557,3555,3553,3551,3548,3546,3544,3542,3540,3538,3536,3533,3531, 3529,3527,3525,3523,3520,3518,3516,3514,3512,3509,3507,3505,3503,3501,3498,3496, 3494,3492,3490,3487,3485,3483,3481,3478,3476,3474,3472,3469,3467,3465,3463,3460, 3458,3456,3453,3451,3449,3447,3444,3442,3440,3437,3435,3433,3430,3428,3426,3423, 3421,3419,3416,3414,3412,3409,3407,3405,3402,3400,3398,3395,3393,3391,3388,3386, 3383,3381,3379,3376,3374,3372,3369,3367,3364,3362,3359,3357,3355,3352,3350,3347, 3345,3343,3340,3338,3335,3333,3330,3328,3325,3323,3321,3318,3316,3313,3311,3308, 3306,3303,3301,3298,3296,3293,3291,3288,3286,3283,3281,3278,3276,3273,3271,3268, 3266,3263,3261,3258,3256,3253,3250,3248,3245,3243,3240,3238,3235,3233,3230,3228, 3225,3222,3220,3217,3215,3212,3209,3207,3204,3202,3199,3197,3194,3191,3189,3186, 3183,3181,3178,3176,3173,3170,3168,3165,3162,3160,3157,3155,3152,3149,3147,3144, 3141,3139,3136,3133,3131,3128,3125,3123,3120,3117,3115,3112,3109,3107,3104,3101, 3099,3096,3093,3090,3088,3085,3082,3080,3077,3074,3071,3069,3066,3063,3061,3058, 3055,3052,3050,3047,3044,3041,3039,3036,3033,3030,3028,3025,3022,3019,3017,3014, 3011,3008,3005,3003,3000,2997,2994,2992,2989,2986,2983,2980,2978,2975,2972,2969, 2966,2964,2961,2958,2955,2952,2950,2947,2944,2941,2938,2935,2933,2930,2927,2924, 2921,2918,2916,2913,2910,2907,2904,2901,2898,2896,2893,2890,2887,2884,2881,2878, 2875,2873,2870,2867,2864,2861,2858,2855,2852,2850,2847,2844,2841,2838,2835,2832, 2829,2826,2823,2821,2818,2815,2812,2809,2806,2803,2800,2797,2794,2791,2788,2786, 2783,2780,2777,2774,2771,2768,2765,2762,2759,2756,2753,2750,2747,2744,2741,2738, 2735,2733,2730,2727,2724,2721,2718,2715,2712,2709,2706,2703,2700,2697,2694,2691, 2688,2685,2682,2679,2676,2673,2670,2667,2664,2661,2658,2655,2652,2649,2646,2643, 2640,2637,2634,2631,2628,2625,2622,2619,2616,2613,2610,2607,2604,2601,2598,2595, 2592,2589,2586,2583,2580,2577,2574,2570,2567,2564,2561,2558,2555,2552,2549,2546, 2543,2540,2537,2534,2531,2528,2525,2522,2519,2516,2513,2510,2506,2503,2500,2497, 2494,2491,2488,2485,2482,2479,2476,2473,2470,2467,2463,2460,2457,2454,2451,2448, 2445,2442,2439,2436,2433,2430,2426,2423,2420,2417,2414,2411,2408,2405,2402,2399, 2396,2392,2389,2386,2383,2380,2377,2374,2371,2368,2365,2361,2358,2355,2352,2349, 2346,2343,2340,2337,2334,2330,2327,2324,2321,2318,2315,2312,2309,2305,2302,2299, 2296,2293,2290,2287,2284,2281,2277,2274,2271,2268,2265,2262,2259,2256,2252,2249, 2246,2243,2240,2237,2234,2231,2227,2224,2221,2218,2215,2212,2209,2205,2202,2199, 2196,2193,2190,2187,2184,2180,2177,2174,2171,2168,2165,2162,2158,2155,2152,2149, 2146,2143,2140,2137,2133,2130,2127,2124,2121,2118,2115,2111,2108,2105,2102,2099, 2096,2093,2089,2086,2083,2080,2077,2074,2071,2067,2064,2061,2058,2055,2052,2049, 2045,2042,2039,2036,2033,2030,2027,2023,2020,2017,2014,2011,2008,2005,2001,1998, 1995,1992,1989,1986,1983,1979,1976,1973,1970,1967,1964,1961,1957,1954,1951,1948, 1945,1942,1939,1936,1932,1929,1926,1923,1920,1917,1914,1910,1907,1904,1901,1898, 1895,1892,1889,1885,1882,1879,1876,1873,1870,1867,1863,1860,1857,1854,1851,1848, 1845,1842,1838,1835,1832,1829,1826,1823,1820,1817,1813,1810,1807,1804,1801,1798, 1795,1792,1789,1785,1782,1779,1776,1773,1770,1767,1764,1760,1757,1754,1751,1748, 1745,1742,1739,1736,1733,1729,1726,1723,1720,1717,1714,1711,1708,1705,1702,1698, 1695,1692,1689,1686,1683,1680,1677,1674,1671,1668,1664,1661,1658,1655,1652,1649, 1646,1643,1640,1637,1634,1631,1627,1624,1621,1618,1615,1612,1609,1606,1603,1600, 1597,1594,1591,1588,1584,1581,1578,1575,1572,1569,1566,1563,1560,1557,1554,1551, 1548,1545,1542,1539,1536,1533,1530,1527,1524,1520,1517,1514,1511,1508,1505,1502, 1499,1496,1493,1490,1487,1484,1481,1478,1475,1472,1469,1466,1463,1460,1457,1454, 1451,1448,1445,1442,1439,1436,1433,1430,1427,1424,1421,1418,1415,1412,1409,1406, 1403,1400,1397,1394,1391,1388,1385,1382,1379,1376,1373,1370,1367,1364,1361,1359, 1356,1353,1350,1347,1344,1341,1338,1335,1332,1329,1326,1323,1320,1317,1314,1311, 1308,1306,1303,1300,1297,1294,1291,1288,1285,1282,1279,1276,1273,1271,1268,1265, 1262,1259,1256,1253,1250,1247,1244,1242,1239,1236,1233,1230,1227,1224,1221,1219, 1216,1213,1210,1207,1204,1201,1198,1196,1193,1190,1187,1184,1181,1178,1176,1173, 1170,1167,1164,1161,1159,1156,1153,1150,1147,1144,1142,1139,1136,1133,1130,1128, 1125,1122,1119,1116,1114,1111,1108,1105,1102,1100,1097,1094,1091,1089,1086,1083, 1080,1077,1075,1072,1069,1066,1064,1061,1058,1055,1053,1050,1047,1044,1042,1039, 1036,1033,1031,1028,1025,1023,1020,1017,1014,1012,1009,1006,1004,1001,998,995, 993,990,987,985,982,979,977,974,971,969,966,963,961,958,955,953,950,947,945,942, 939,937,934,932,929,926,924,921,918,916,913,911,908,905,903,900,897,895,892,890, 887,885,882,879,877,874,872,869,866,864,861,859,856,854,851,849,846,844,841,838, 836,833,831,828,826,823,821,818,816,813,811,808,806,803,801,798,796,793,791,788, 786,783,781,778,776,773,771,769,766,764,761,759,756,754,751,749,747,744,742,739, 737,735,732,730,727,725,722,720,718,715,713,711,708,706,703,701,699,696,694,692, 689,687,685,682,680,678,675,673,671,668,666,664,661,659,657,654,652,650,647,645, 643,641,638,636,634,631,629,627,625,622,620,618,616,613,611,609,607,604,602,600, 598,596,593,591,589,587,585,582,580,578,576,574,571,569,567,565,563,561,558,556, 554,552,550,548,546,543,541,539,537,535,533,531,529,526,524,522,520,518,516,514, 512,510,508,506,504,501,499,497,495,493,491,489,487,485,483,481,479,477,475,473, 471,469,467,465,463,461,459,457,455,453,451,449,447,445,443,441,439,437,435,434, 432,430,428,426,424,422,420,418,416,414,413,411,409,407,405,403,401,399,397,396, 394,392,390,388,386,385,383,381,379,377,375,374,372,370,368,366,365,363,361,359, 357,356,354,352,350,349,347,345,343,342,340,338,336,335,333,331,330,328,326,324, 323,321,319,318,316,314,313,311,309,308,306,304,303,301,299,298,296,295,293,291, 290,288,287,285,283,282,280,279,277,275,274,272,271,269,268,266,264,263,261,260, 258,257,255,254,252,251,249,248,246,245,243,242,240,239,237,236,234,233,231,230, 229,227,226,224,223,221,220,219,217,216,214,213,212,210,209,207,206,205,203,202, 201,199,198,197,195,194,192,191,190,189,187,186,185,183,182,181,179,178,177,176, 174,173,172,170,169,168,167,166,164,163,162,161,159,158,157,156,155,153,152,151, 150,149,147,146,145,144,143,142,140,139,138,137,136,135,134,133,131,130,129,128, 127,126,125,124,123,122,121,120,118,117,116,115,114,113,112,111,110,109,108,107, 106,105,104,103,102,101,100,99,98,97,96,95,94,93,93,92,91,90,89,88,87,86,85,84,83, 83,82,81,80,79,78,77,76,76,75,74,73,72,71,71,70,69,68,67,67,66,65,64,63,63,62,61, 60,60,59,58,57,57,56,55,54,54,53,52,52,51,50,49,49,48,47,47,46,45,45,44,43,43,42, 42,41,40,40,39,38,38,37,37,36,35,35,34,34,33,33,32,31,31,30,30,29,29,28,28,27, 27,26,26,25,25,24,24,23,23,22,22,21,21,20,20,20,19,19,18,18,17,17,17,16,16,15,15, 15,14,14,13,13,13,12,12,12,11,11,11,10,10,10,9,9,9,9,8,8,8,7,7,7,7,6,6,6,6,5,5, 5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2, 2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,7,8,8,8,8,9,9,9,10,10,10,11,11, 11,12,12,12,13,13,13,14,14,14,15,15,16,16,16,17,17,18,18,18,19,19,20,20,21,21,22, 22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,30,30,31,31,32,32,33,33,34,35,35,36, 36,37,37,38,39,39,40,41,41,42,42,43,44,44,45,46,46,47,48,48,49,50,50,51,52,53, 53,54,55,55,56,57,58,58,59,60,61,61,62,63,64,65,65,66,67,68,69,69,70,71,72,73,73, 74,75,76,77,78,79,79,80,81,82,83,84,85,86,87,87,88,89,90,91,92,93,94,95,96,97,98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, 119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,138,139,140, 141,142,143,144,146,147,148,149,150,152,153,154,155,156,158,159,160,161,162,164, 165,166,167,169,170,171,172,174,175,176,177,179,180,181,183,184,185,187,188,189, 191,192,193,195,196,197,199,200,201,203,204,205,207,208,209,211,212,214,215,216, 218,219,221,222,224,225,226,228,229,231,232,234,235,237,238,240,241,242,244,245, 247,248,250,251,253,255,256,258,259,261,262,264,265,267,268,270,271,273,275,276, 278,279,281,283,284,286,287,289,291,292,294,295,297,299,300,302,304,305,307,309, 310,312,314,315,317,319,320,322,324,325,327,329,330,332,334,336,337,339,341,343, 344,346,348,350,351,353,355,357,358,360,362,364,366,367,369,371,373,375,376,378, 380,382,384,385,387,389,391,393,395,397,398,400,402,404,406,408,410,412,413,415, 417,419,421,423,425,427,429,431,433,435,436,438,440,442,444,446,448,450,452,454, 456,458,460,462,464,466,468,470,472,474,476,478,480,482,484,486,488,490,492,494, 496,498,500,503,505,507,509,511,513,515,517,519,521,523,525,528,530,532,534,536, 538,540,542,544,547,549,551,553,555,557,560,562,564,566,568,570,573,575,577,579, 581,583,586,588,590,592,594,597,599,601,603,606,608,610,612,615,617,619,621,624, 626,628,630,633,635,637,639,642,644,646,649,651,653,655,658,660,662,665,667,669, 672,674,676,679,681,683,686,688,690,693,695,698,700,702,705,707,709,712,714,717, 719,721,724,726,728,731,733,736,738,741,743,745,748,750,753,755,758,760,762,765, 767,770,772,775,777,780,782,785,787,790,792,794,797,799,802,804,807,809,812,814, 817,819,822,825,827,830,832,835,837,840,842,845,847,850,852,855,858,860,863,865, 868,870,873,875,878,881,883,886,888,891,894,896,899,901,904,907,909,912,914,917, 920,922,925,928,930,933,935,938,941,943,946,949,951,954,957,959,962,965,967,970, 973,975,978,981,983,986,989,991,994,997,1000,1002,1005,1008,1010,1013,1016,1018, 1021,1024,1027,1029,1032,1035,1038,1040,1043,1046,1049,1051,1054,1057,1060,1062, 1065,1068,1071,1073,1076,1079,1082,1084,1087,1090,1093,1095,1098,1101,1104,1107, 1109,1112,1115,1118,1121,1123,1126,1129,1132,1135,1137,1140,1143,1146,1149,1152, 1154,1157,1160,1163,1166,1169,1171,1174,1177,1180,1183,1186,1188,1191,1194,1197, 1200,1203,1206,1208,1211,1214,1217,1220,1223,1226,1229,1231,1234,1237,1240,1243, 1246,1249,1252,1255,1257,1260,1263,1266,1269,1272,1275,1278,1281,1284,1287,1289, 1292,1295,1298,1301,1304,1307,1310,1313,1316,1319,1322,1325,1328,1331,1333,1336, 1339,1342,1345,1348,1351,1354,1357,1360,1363,1366,1369,1372,1375,1378,1381,1384, 1387,1390,1393,1396,1399,1402,1405,1408,1411,1414,1417,1420,1423,1426,1428,1431, 1434,1437,1440,1443,1446,1449,1453,1456,1459,1462,1465,1468,1471,1474,1477,1480, 1483,1486,1489,1492,1495,1498,1501,1504,1507,1510,1513,1516,1519,1522,1525,1528, 1531,1534,1537,1540,1543,1546,1549,1552,1555,1559,1562,1565,1568,1571,1574,1577, 1580,1583,1586,1589,1592,1595,1598,1601,1604,1607,1611,1614,1617,1620,1623,1626, 1629,1632,1635,1638,1641,1644,1647,1651,1654,1657,1660,1663,1666,1669,1672,1675, 1678,1681,1684,1688,1691,1694,1697,1700,1703,1706,1709,1712,1715,1719,1722,1725, 1728,1731,1734,1737,1740,1743,1746,1750,1753,1756,1759,1762,1765,1768,1771,1774, 1778,1781,1784,1787,1790,1793,1796,1799,1803,1806,1809,1812,1815,1818,1821,1824, 1828,1831,1834,1837,1840,1843,1846,1849,1853,1856,1859,1862,1865,1868,1871,1874, 1878,1881,1884,1887,1890,1893,1896,1899,1903,1906,1909,1912,1915,1918,1921,1925, 1928,1931,1934,1937,1940,1943,1947,1950,1953,1956,1959,1962,1965,1968,1972,1975, 1978,1981,1984,1987,1990,1994,1997,2000,2003,2006,2009,2012,2016,2019,2022,2025, 2028,2031,2034,2038,2041,2044,2047 }; #define NPT 1024 // FFT?? #define PI 3.1415926 // p? #define PI2 2*PI // 2p? #define SAMPLING_FREQ 10240 // ????(Hz) #define FFT_SIZE 1024 // FFT?? #define FMIN 42950 // DDS?????? #define DDS_CLOCK 1000000 // DDS????(Hz) = 1MHz #define FREQ_SCALE (4294967296.0f / DDS_CLOCK) // ???????? (2^32 / DDS??) // ????????????? // ???????? volatile float target_freq1 = 100.0f; // ????1(Hz) volatile float target_freq2 = 200.00f/0.34; // ????2(Hz) volatile uint32_t freq1_step = 0; // ????1 volatile uint32_t freq2_step = 0; // ????2 u16 real[1024]; // ???? u8 sampling = 0; // ??????? u16 freq_indices[2]; // ?????? float freq_values[2]; // ??????? u8 lcd_show_buf[128]; // ???? void DDS_Value_Init(void); void DAC_Config(void); void ADC_Config(void); void NVIC2_Config(void); void NVIC3_Config(void); void TIM2_Config(void); void TIM3_Config(void); void PowerMag(u16 nfill); void PowerPhase(u16 nfill); void Find_Freq(u16 *freq_indices, float *freq_values); void update_freq_steps(void); s32 lBUFIN[NPT]; /* Complex input vector */ s32 lBUFOUT[NPT]; /* Complex output vector */ s32 lBUFMAG[NPT]; /* Magnitude vector */ s32 lBUFPHASE[NPT]; /* Phase vector */ // ?????? void update_freq_steps(void) { freq1_step = (uint32_t)(target_freq1 * FREQ_SCALE); freq2_step = (uint32_t)(target_freq2 * FREQ_SCALE); } int main (void) { u16 i = 0; uint8_t key_value = 0; /*??????,??????????????*/ SystemInit(); TIM2_Config(); DDS_Value_Init(); DAC_Config(); // ???????? update_freq_steps(); TIM_Cmd(TIM2, ENABLE); ADC_Config(); TIM3_Config(); TIM_Cmd(TIM3, ENABLE); while (1) { // ??????(??:??PA0?PA1?????) // ???????? if (sampling == 1) { TIM_Cmd(TIM3, DISABLE); for (i = 0; i < NPT; i++) lBUFIN[i] = real[i] << 16; cr4_fft_1024_stm32(lBUFOUT, lBUFIN, NPT); PowerMag(NPT); Find_Freq(freq_indices, freq_values); sampling = 0; TIM_Cmd(TIM3, ENABLE); } } } u16 wave1[4096], wave2[4096]; void DDS_Value_Init(void) { u16 i = 0; for (i = 0; i < 4096; i++) { wave1[i] = SINWAVE[i] * 1.5 / 2.5; wave2[i] = SINWAVE[i] * 1.5 / 2.5; } } void DAC_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitStructure; /* AFIO and GPIOA Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); /* DAC Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); /* Configure DAC channe1 and DAC channel2 outputs pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); /* DAC channel1 Configuration */ DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, &DAC_InitStructure); /* DAC channel2 Configuration */ DAC_Init(DAC_Channel_2, &DAC_InitStructure); /* Enable DAC Channel1 */ DAC_Cmd(DAC_Channel_1, ENABLE); /* Enable DAC Channel2 */ DAC_Cmd(DAC_Channel_2, ENABLE); } void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div4); //PCLK2 4??=18MHz /* ADC1 Configuration */ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel10 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1); //??ADC??????? /* Check the end of ADC1 reset calibration register */ while (ADC_GetResetCalibrationStatus(ADC1)); //??ADC?????????? /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1); //????????? /* Check the end of ADC1 calibration */ while (ADC_GetCalibrationStatus(ADC1)); //??ADC???????? /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); //????????? } void NVIC2_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*?????*/ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; /*??IRQ??*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /*?????*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; /*????*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void NVIC3_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*?????*/ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /*??IRQ??*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; /*?????*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /*????*/ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } // ??TIM2?1MHz void TIM2_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Period = 71; // 72MHz / (71+1) = 1MHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); NVIC2_Config(); } void TIM3_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Period = 6391; /*??????*/ TIM_TimeBaseStructure.TIM_Prescaler = 10; /*??????*/ //????fc=10.24Khz TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*??????*/ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); NVIC3_Config(); } void TIM2_IRQHandler(void) { static u32 a1, b1, dac_value1, dac_value2; if (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == SET) { TIM_ClearFlag(TIM2, TIM_FLAG_Update); /*???????*/ // ???????????? a1 += freq1_step; b1 += freq2_step; dac_value1 = wave1[(a1 >> 20) % 4096]; dac_value2 = wave2[(b1 >> 20) % 4096]; DAC_SetDualChannelData(DAC_Align_12b_R, dac_value1, dac_value2); } } void TIM3_IRQHandler(void) { static u16 j = 0; if (TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) == SET) { TIM_ClearFlag(TIM3, TIM_FLAG_Update); /*???????*/ if (j < 1024) { real[j] = ADC_GetConversionValue(ADC1); j++; } else { TIM_Cmd(TIM3, DISABLE); sampling = 1; j = 0; } } } void PowerMag(u16 nfill) { s16 lX, lY; u16 i = 0; float X,Y,Mag; for (i = 0; i < nfill; i++) { lX = (lBUFOUT[i] << 16) >> 16; /* sine_cosine --> cos */ lY = (lBUFOUT[i] >> 16); /* sine_cosine --> sin */ X = nfill * ((float)lX) / 32768; Y = nfill * ((float)lY) / 32768; Mag = sqrt(X * X + Y * Y) / nfill; if (i == 0) lBUFMAG[i] = (uint32_t)(Mag * 32768); else lBUFMAG[i] = (uint32_t)(Mag * 65536); } } void PowerPhase(u16 nfill) { int32_t lX, lY; u16 i = 0; float X,Y,phase; for (i = 0; i < nfill / 2; i++) { lX = (lBUFOUT[i] << 16) >> 16; /* ??16bit,sine_cosine --> cos */ lY = (lBUFOUT[i] >> 16); /* ??16bit,sine_cosine --> sin */ X = NPT * ((float)lX) / 32768; Y = NPT * ((float)lY) / 32768; phase = atan(Y / X); if (Y >= 0) { if (X >= 0) ; else phase += PI; } else { if (X >= 0) phase += PI2; else phase += PI; } lBUFPHASE[i] = phase * 180.0 / PI; } } // ?????????(???????????) void Find_Freq(u16 *freq_indices, float *freq_values) { u16 max1 = 0, max2 = 0, i = 0; u16 idx1 = 0, idx2 = 0; // ???????? for (i = 1; i <= FFT_SIZE/2; i++) { if (lBUFMAG[i] > 100) { if (lBUFMAG[i] > max1) { max2 = max1; idx2 = idx1; max1 = lBUFMAG[i]; idx1 = i; } else if (lBUFMAG[i] > max2) { max2 = lBUFMAG[i]; idx2 = i; } } } // ???? freq_indices[0] = idx1; freq_indices[1] = idx2; // ??????????? for (i = 0; i < 2; i++) { u16 idx = freq_indices[i]; if (idx > 0 && idx < FFT_SIZE/2 - 1) { float y0 = (float)lBUFMAG[idx-1]; float y1 = (float)lBUFMAG[idx]; float y2 = (float)lBUFMAG[idx+1]; // ???????:delta = (y2 - y0) / (2 * (2*y1 - y0 - y2)) float delta = 0.5f * (y2 - y0) / (2.0f * y1 - y0 - y2); // ??????? freq_values[i] = (idx + delta) * SAMPLING_FREQ / FFT_SIZE; } else { // ??????????? freq_values[i] = idx * SAMPLING_FREQ / FFT_SIZE; } } }解释一下代码

#include "servo.h" unsigned int Servo_Angle = 0;//舵机角度 /****************************************************************** * 函 数 名 称:SG90_Init * 函 数 说 明:PWM配置 * 函 数 形 参: pre定时器时钟预分频值 per周期 * 函 数 返 回:无 * 作 者:LC * 备 注:PWM频率=84 000 000 /( (pre+1) * (per+1) ) 配置占空比 范围 0 ~ (per-1) // t = 0.5ms——————-舵机会转动 0 ° // t = 1.0ms——————-舵机会转动 45° // t = 1.5ms——————-舵机会转动 90° // t = 2.0ms——————-舵机会转动 135° // t = 2.5ms——————-舵机会转动180° // 1.我该如何计算括号里的数,从而实现我想要的功能? // 此处以90度为例。 // 答:PWM周期为20ms,所以占空比就应该为1.5ms/20ms = 7.5%, // 所以 TIMx 捕获比较 1 寄存器值就为period-period*7.5% = 84-84*7.5%=77.7 ******************************************************************/ void SG90_Init(void) { /* 配置定时器参数 */ // 频率f =系统时钟 / ( (prescaler+1) * (period+1) ) // 频率f = 84,000,000/ (8400 * 200) = 50hz // 周期T = 1/f = 1/50 = 0.02S = 20ms GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设 //设置该引脚为复用输出功能,输出TIM3 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO // GPIO_PinAFConfig(PORT_SIG, GPIO_SIG_SOURCE, AF_SIG); //复用 //初始化TIM3 //配置占空比 范围 0 ~ (per-1) // t = 0.5ms——————-舵机会转动 0 ° // t = 1.0ms——————-舵机会转动 45° // t = 1.5ms——————-舵机会转动 90° // t = 2.0ms——————-舵机会转动 135° // t = 2.5ms——————-舵机会转动180° // 1.我该如何计算括号里的数,从而实现我想要的功能? // 此处以90度为例。 // 答:PWM周期为20ms,所以占空比就应该为1.5ms/20ms = 7.5%, // 所以 TIMx 捕获比较 1 寄存器值就为period-period*7.5% = 84-84*7.5%=77.7 TIM_TimeBaseStructure.TIM_Period = 2000-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =72-1; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel1 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置占空比大小,在主函数compare中又设置一遍 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性 TIM_OC1Init(TIM3 ,&TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 } /****************************************************************** * 函 数 名 称:Set_Servo_Angle * 函 数 说 明:设置角度 * 函 数 形 参:angle=要设置的角度,范围0-180 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ void Set_Servo_Angle(unsigned int angle) { if(angle > 180) { angle = 180; // 限制角度在0到180度之间 } // 计算PWM占空比 // 注意:这里的200是基于TIM_Period设置为199的(200-1) // 0.5ms对应的计数 = (0.5 / 20) * 200 // 2.5ms对应的计数 = (2.5 / 20) * 200 // 因此,角度从0到180度时,占空比应该从0.5ms到2.5ms线性变化 unsigned int ServoAngle = (unsigned int)((0.5 + (angle / 180.0) * 2.0) / 20.0 * 200); TIM_SetCompare1(TIM3, ServoAngle); } /****************************************************************** * 函 数 名 称:读取当前角度 * 函 数 说 明:Get_Servo_Angle * 函 数 形 参:无 * 函 数 返 回:当前角度 * 作 者:LC * 备 注:使用前必须确保之前使用过 void Set_Servo_Angle(unsigned int angle) 函数设置过角度 ******************************************************************/ unsigned int Get_Servo_Angle(void) { return Servo_Angle; } STMF103C8T6控制舵机 改错 库函数

完成一个仓储环境监测的模拟系统。具体要求如下: 1. DHT11模块完成温湿度测量,5s更新,数值显示于数码管,同时打印到串口。温度超过阈值触发蜂鸣器短鸣,同时启动风扇小马达; 2. LDR模块完成环境照度测量,4s更新,数值显示于数码管,同时打印到串口。照度超过阈值启动PWM调光(高、中、低三级调光)。 3. 按键循环切换显示模式,按第1下固定显示温度,按第二下固定显示照度,按第三下恢复默认的自动显示模式。按键用外部中断实现 int main(void) { systick_init(72); led_init(); usart1_init(115200); display_init(); tim4_init(1000,72); // 1ms的定时间隔 TIM3_CH2_PWM_Init(500-1,72-1); dht11_init(); ldr_init(); //key_init(); while(1) { // 轮询DHT11的状态 if(dht11.state == WORK) { if(dht11.getData(&dht11.temp, &dht11.humi) == SUCCESS) // DHT11温湿度数据更新 { printf("temperature:%d℃ humidity(RH):%d \r\n", dht11.temp, dht11.humi); dsp.interface = TEMP; dht11.onTempChange(dht11.temp_threshold); // 温度超过阈值的处理 } dht11.state = STANDBY; } // 轮询LDR的状态 if(ldr.state == WORK) { ldr.light = ldr.getData(); printf("light intensity:%d \r\n", ldr.light); dsp.interface = LIGHT; ldr.onLightChange(ldr.high_threshold,ldr.low_threshold); // 照度超过阈值的处理 ldr.state = STANDBY; } // 轮询数码管界面状态 switch(dsp.interface) { case LIGHT: setLightValue(&dsp,1); break; case TEMP: setTempValue(&dsp,1); break; case HUMI: setHumiValue(&dsp,1); break; default: break; } } }#include "systick.h" static u8 fac_us=0; //us延时倍乘数 static u16 fac_ms=0; //ms延时倍乘数 //初始化延迟函数 //SYSTICK的时钟固定为AHB时钟的1/8 //SYSCLK:系统时钟频率 void systick_init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us = SYSCLK/8; fac_ms = (u16)fac_us * 1000; } //延时nus //nus为要延时的us数. void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } //延时nms //注意nms的范围 //SysTick->LOAD为24位寄存器,所以,最大延时为: //nms<=0xffffff*8*1000/SYSCLK //SYSCLK单位为Hz,nms单位为ms //对72M条件下,nms<=1864 void delay_ms(u16 nms) { u32 temp; SysTick->LOAD = (u32)nms*fac_ms; //时间加载(SysTick->LOAD为24bit) SysTick->VAL = 0x00; //清空计数器 SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; } while((temp&0x01) && !(temp&(1<<16))); //等待时间到达 SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick->VAL = 0x00; //清空计数器 } #include "display.h" DisplayStruct dsp; void segDisplay(void); // 共阴极数码管,阴极位选(0有效),阳极段选(1有效) const u16 segCode[11] = { /* 0 1 2 3 4 5 6 7 */ 0x003F, 0x0006, 0x005B, 0x004F, 0x0066, 0x006D, 0x007D, 0x0007, /* 8 9 off */ 0x007F, 0x006F, 0x0000 }; /******************************************************************************* * @brief 初始化数码管用到的GPIO端口和dsp结构体 * @param None * @retval None *******************************************************************************/ void display_init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); // PA0~PA7: 段选(分别连接引脚A~G); // PB12~PB15:位选(分别连接引脚D1~D4) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); dsp.currDigit = 1; // dsp结构体的初始化 dsp.SegDisplay = segDisplay; } /*********************************************************************************** * @brief 设置数码管要显示的4位数值。 * @param dsp:数码管结构体指针;value[4]:4位数值;dotBit:小数点位置(没有小数点则置0) * @retval None ***********************************************************************************/ void setValue(DisplayStruct *dsp, u8 value[4], u8 dotBit) { dsp->digit[0] = value[0]; dsp->digit[1] = value[1]; dsp->digit[2] = value[2]; dsp->digit[3] = value[3]; dsp->dotDigit = dotBit; } void setLightValue(DisplayStruct *dsp, u8 dotBit) { dsp->digit[0] = 1; // 参数编号 dsp->digit[1] = 10; // 第二位空缺 dsp->digit[2] = ldr.light/10; dsp->digit[3] = ldr.light%10; // dsp->dotDigit = dotBit; // 小数点位置 } void setTempValue(DisplayStruct *dsp, u8 dotBit) { dsp->digit[0] = 2; dsp->digit[1] = 10; dsp->digit[2] = dht11.temp/10; dsp->digit[3] = dht11.temp%10; dsp->dotDigit = dotBit; } void setHumiValue(DisplayStruct *dsp, u8 dotBit) { dsp->digit[0] = 3; dsp->digit[1] = 10; dsp->digit[2] = dht11.humi/10; dsp->digit[3] = dht11.humi%10; dsp->dotDigit = dotBit; } /******************************************************************************* * @简 介 段选,让某一位数码管显示指定的数字 * @输入参数 value:段码数组的序号(0~9),代表要显示的数字 * @retval * 备注:只操作PA的低8位,不要影响高8位。 ********************************************************************************/ void seg(uint8_t value) { if(value < sizeof(segCode)) // 避免数组溢出 { GPIOA->ODR &= 0xFF00; GPIOA->ODR |= segCode[value]; } } /******************************************************************************** * 简 介 位选,一次只能选一位。 * 输入参数 com:位数(取值1~4,从左到右) * 返回值 无 * 备注:只操作PB的高4位(置0),不要影响其他位。 ********************************************************************************/ void com(uint8_t currDigit) { // 数码管位选(0有效) GPIOB->ODR |= 0xF000; GPIOB->ODR &= ~(0x1000<<(currDigit-1)); } /******************************************************************************** * 简介 在数码管上逐位显示其段码(由Timer中断服务函数调用) * 参数 无 * 返回值 无 ********************************************************************************/ void segDisplay(void) { seg(10); // 消隐之前的显示内容 com(dsp.currDigit); // 位选,从COM1到COM4逐次移位,实现动态显示 if(dsp.currDigit != dsp.dotDigit) // 当前位不显示小数点 seg(dsp.digit[dsp.currDigit-1]); else // 当前位要显示小数点 { GPIO_Write(GPIOA, segCode[dsp.digit[dsp.currDigit-1]]| 0x0080); //GPIOA->ODR &= 0xFF00; //GPIOA->ODR |= (segCode[dsp.currDigit-1]|0x0080); } if(++dsp.currDigit > DSP_DIGIT) // 从当前位右移到下一位 dsp.currDigit = 1; } #include "usart.h" int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch; } //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART1_RX_BUF[USART1_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART1_RX_STA=0; //接收状态标记 /******************************************************************************* * 函 数 名 : USART1_Init * 函数功能 : USART1初始化函数 * 输 入 : bound:波特率 * 输 出 : 无 *******************************************************************************/ void usart1_init(u32 baud) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //串口输出TX:PA9 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //串口输入RX:PA10 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模拟输入 GPIO_Init(GPIOA,&GPIO_InitStructure); //USART1 初始化设置 USART_InitStructure.USART_BaudRate = baud; //波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_Cmd(USART1, ENABLE); //使能串口1 USART_ClearFlag(USART1, USART_FLAG_TC); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 } /******************************************************************************* * 函 数 名 : USART1_IRQHandler * 函数功能 : USART1中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void USART1_IRQHandler(void) //串口1中断服务程序 { u8 r; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断 { r =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 if((USART1_RX_STA&0x8000)==0)//接收未完成 { if(USART1_RX_STA&0x4000)//接收到了0x0d { if(r!=0x0a)USART1_RX_STA=0;//接收错误,重新开始 else USART1_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(r==0x0d)USART1_RX_STA|=0x4000; else { USART1_RX_BUF[USART1_RX_STA&0X3FFF]=r; USART1_RX_STA++; if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收 } } } } } #include "timer.h" #include "beep.h" volatile uint16_t beep_time; /******************************************************************************* * 函 数 名 : tim4_init * 函数功能 : TIM4初始化函数 * 输 入 : per:重装载值 psc:分频系数 * 输 出 : 无 *******************************************************************************/ void tim4_init(u16 per,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); // 使能TIM4的时钟 // 配置TIM的时基参数 TIM_TimeBaseInitStructure.TIM_Period = per; // 自动装载值 TIM_TimeBaseInitStructure.TIM_Prescaler = psc; // 分频系数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置向上计数模式 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); // 设置参数生效 // 配置中断参数 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); // 开启定时器的更新中断 TIM_ClearITPendingBit(TIM4,TIM_IT_Update); // 中断标志位清零 // 配置NVIC NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组(组2) NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; // 定时器4的中断通道(30号通道) NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; // 响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 中断通道使能 NVIC_Init(&NVIC_InitStructure); // NVIC设置参数生效 TIM_Cmd(TIM4,ENABLE); // 使能Timer4 } /******************************************************************************* * 函 数 名 : TIM4_IRQHandler * 函数功能 : TIM4中断函数 * 输 入 : 无 * 输 出 : 无 * 备 注 : 定时间隔1ms ** *****************************************************************************/ void TIM4_IRQHandler(void) { static u16 cnt_dht11; static u16 cnt_ldr; // 蜂鸣器时间处理 if(beep_time > 0) { beep_time--; if(beep_time == 0) { BEEP_OFF(); } } if(TIM_GetITStatus(TIM4,TIM_IT_Update)) // 检查更新中断是否产生 { // 处理定时任务 if(++cnt_dht11 == dht11.period) { if(dht11.state == STANDBY) { dht11.state = WORK; // DHT11状态从STANDBY切换到WORK } cnt_dht11 = 0; } if(++cnt_ldr == ldr.period) { if (ldr.state == STANDBY) { ldr.state = WORK; // LDR状态从STANDBY切换到WORK } cnt_ldr = 0; } // 刷新数码管显示 dsp.SegDisplay(); } TIM_ClearITPendingBit(TIM4,TIM_IT_Update); // 手动清除中断标志位 } #include "dht11.h" #include "relay.h" #include "beep.h" Dht11Struct dht11 = {0}; void SET_DHT11_IO_OUT(void); void SET_DHT11_IO_IN(void); void DHT11_RequestData(void); u8 DHT11_RespondRequest(void); u8 DHT11_Read_Data(u8 *temp, u8 *humi); void DHT11_OnTempChange(u8 temp_threshold); // DHT11_PIN初始化 // 返回值: 无 extern void dht11_init() { GPIO_InitTypeDef GPIO_InitStructure; // 数据引脚初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 数据引脚 GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(DHT11_PORT, &GPIO_InitStructure); GPIO_SetBits(DHT11_PORT, DHT11_PIN); // 初始输出状态:高电平 // 结构体初始化 dht11.period = DHT11_PERIOD; dht11.temp_threshold = TEMP_THRESHOLD; dht11.getData = DHT11_Read_Data; // 获取温湿度数据的函数 dht11.onTempChange = DHT11_OnTempChange; // 温度超过阈值的处理函数 // 做一次数据请求测试,检查设备状态 DHT11_RequestData(); if (DHT11_RespondRequest() == SUCCESS) { dht11.state = STANDBY; printf("DHT11 Init OK!\r\n"); } else { dht11.state = FAIL; printf("DHT11 Check Error!\r\n"); } } // 复位DHT11,单片机向DHT11发起数据采集请求 // 时序图的黑线部分 static void DHT11_RequestData() { SET_DHT11_IO_OUT(); // 数据引脚配置为输出模式 DHT11_DQ_OUT = 0; delay_ms(20); // 低电平持续至少18ms DHT11_DQ_OUT = 1; delay_us(30); // 高电平持续20~40us } // DHT11响应单片机的数据请求 // 返回值:SUCCESS or FAILURE static u8 DHT11_RespondRequest() { u8 retry=0; SET_DHT11_IO_IN(); // 数据引脚设为输入模式,接收DHT11的响应 while (DHT11_DQ_IN && retry<100) // 等待输入由高变低 { retry++; if(retry >= 100) return FAILURE; // 等待时间过长,返回异常。 delay_us(1); } retry=0; while (!DHT11_DQ_IN && retry<100) // 低电平持续时间80us { retry++; if(retry >= 100) return FAILURE; // 低电平持续时间过长,返回异常。 delay_us(1); } return SUCCESS; } //DHT11输出模式配置 static void SET_DHT11_IO_OUT() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(DHT11_PORT,&GPIO_InitStructure); } //DHT11输入模式配置 static void SET_DHT11_IO_IN() { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DHT11_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入模式,最小系统板和DHT11之间并未接上拉电阻 GPIO_Init(DHT11_PORT,&GPIO_InitStructure); } //从DHT11读取一位 //返回值:bit 1或0 //注:此函数处并未做高低电平持续时间异常的处理,因DHT11自身有校验和,即便读错1位也不会造成最终数据的错误。 // 严格来讲,除了正常情况下返回“1”或“0”,还应增加异常情况的返回值(比如“2”)。 static u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN && retry<100) // 等待输入电平由高变低(低电平持续50us) { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN && retry<100) // 等待输入电平由低变高 { retry++; delay_us(1); } delay_us(40); // 等待40us(高电平持续26~28us表示0,持续70us表示1) if(DHT11_DQ_IN) return 1; // 40us后如果输入仍为高电平,则表示读入1;否则表示读入0。 else return 0; } //从DHT11读取一个字节 //返回值:读到的8位数据 static u8 DHT11_Read_Byte(void) { u8 i,byte; byte = 0; for (i=0;i<8;i++) { byte <<= 1; // 先前读取的数据(不足8位)全部左移一位 byte |= DHT11_Read_Bit(); // 最低位填入新读取的1位 } return byte; } //从DHT11读取一次完整的数据 //temp:温度值(整数,范围:0~50°) //humi:湿度值(整数,范围:20%~90%) //返回值:0,正常; 1,失败 static u8 DHT11_Read_Data(u8 *temp, u8 *humi) { u8 buf[5]; u8 i; DHT11_RequestData(); if(DHT11_RespondRequest() == SUCCESS) { for(i=0;i<5;i++) // 读取5组共40位数据 { buf[i] = DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3]) == buf[4]) // 数据校验 { *humi = buf[0]; // 湿度整数部分 *temp = buf[2]; // 温度整数部分 return SUCCESS; } } return FAILURE; } // 采集DHT11数据并打印至串口 void dht11DataCollect() { u8 temp; u8 humi; if (DHT11_Read_Data(&temp, &humi) == SUCCESS) printf("temperature:%d℃ humidity(RH):%d \r\n", temp, humi); // 输出到串口(重定向) else printf("DHT11 data error! \r\n"); } // 温度阈值处理 void DHT11_OnTempChange(u8 temp_threshold) { if (dht11.temp > temp_threshold) { // 启动风扇(继电器低电平触发) Relay_Low(); // 蜂鸣器短鸣(100ms) BEEP_ON(); beep_time = 100; // 100ms } else { // 关闭风扇 Relay_High(); } } #include "ldr.h" LdrStruct ldr; static u8 getLightIntensity(void); static void OnLightChange(u8 hiLight, u8 loLight); /******************************************************************************* * 函 数 名 : adc_init * 函数功能 : ADC外设的初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ static void adc_init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; // 1.打开相关外设的总线时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE); // 2.信号引脚的参数配置 GPIO_InitStructure.GPIO_Pin=LDR_PIN; // 信号引脚:PB0 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; // 设置模拟输入模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; // 设置传输速率 GPIO_Init(LDR_PORT,&GPIO_InitStructure); // 3. 输入时钟降频(<14MHz) RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 分频因子6,输入时钟为72M/6=12MHz // 4. 初始化ADC参数 ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; //独立模式 ADC_InitStructure.ADC_ScanConvMode=DISABLE; //单次扫描 ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //单次转换 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //软件触发 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //数据右对齐 ADC_InitStructure.ADC_NbrOfChannel=1; //只有1个通道 ADC_Init(ADC1,&ADC_InitStructure); // 5. 使能ADC ADC_Cmd(ADC1,ENABLE); // 6. ADC校准 ADC_ResetCalibration(ADC1); //复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); //开启并完成校准 while(ADC_GetCalibrationStatus(ADC1)); } // LDR的设备初始化 extern void ldr_init() { adc_init(); ldr.period = LDR_PERIOD; ldr.high_threshold = HI_THRESHOLD; ldr.low_threshold = LO_THRESHOLD; ldr.getData = getLightIntensity; ldr.onLightChange = OnLightChange; ldr.state = STANDBY; } /******************************************************************************* * 函 数 名 : GET_ADC_Value * 函数功能 : 获取通道ch的转换值,测量times次,取平均值 * 输 入 : ch:通道编号,Rank:规则序列中的第几个转换,取值1~16; times:测量次数 * 输 出 : 通道ch的times次转换结果的平均值 *******************************************************************************/ static u16 Get_ADC_Value(u8 ch, u8 times) //获取ADC1通道ch的转换值 { u8 i; u32 Temp_val=0; ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); for(i=0;i<times;i++) { ADC_SoftwareStartConvCmd(ADC1,ENABLE); // 开始转换 while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); // 等待至单次转换结束 Temp_val += ADC_GetConversionValue(ADC1); delay_ms(10); } return Temp_val/times; } /******************************************************************************* * 函 数 名 : getLightIntensity * 函数功能 : 将ADC转换值解读为光照强度 * 输 入 : 无 * 输 出 : 光照照度值(0~100, 0:照度最低;100:照度最高) *******************************************************************************/ static u8 getLightIntensity(void) //通过ADC1 通道0的值获取亮度值 { u16 value = 0; u8 lightvalue = 0; value = Get_ADC_Value(ADC_Channel_8,20); lightvalue = 100 - (u16)(value/40.95); return lightvalue; } // 添加PWM控制LED功能 static void set_led_brightness(u8 level) { switch(level) { case 0: // 低档 TIM_SetCompare2(TIM3, 125); // 25%占空比 break; case 1: // 中档 TIM_SetCompare2(TIM3, 250); // 50%占空比 break; case 2: // 高档 TIM_SetCompare2(TIM3, 375); // 75%占空比 break; } } /******************************************************************************* * 函 数 名 : OnLightChange * 函数功能 : 照度超过阈值(高阈值和低阈值)的处理措施 * 输 入 : hiLight-高阈值; loLight-低阈值 * 输 出 : 无 *******************************************************************************/ static void OnLightChange(u8 hiLight, u8 loLight) { if (ldr.light > hiLight) { set_led_brightness(0);// 照度过高,降低亮度 } else if (ldr.light < loLight) { set_led_brightness(2); // 照度过低,提升亮度 } else // 正常范围 { set_led_brightness(1); // 中等亮度 } } #include "key.h" #include "pwm.h" /******************************************************************************* * 函 数 名 : TIM3_CH2_PWM_Init * 函数功能 : TIM3通道2 PWM初始化函数 * 输 入 : per:重装载值 * psc:分频系数 * 输 出 : 无 *******************************************************************************/ void TIM3_CH2_PWM_Init(u16 per,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* 开启时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); // PB5引脚启用复用模式 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); // 选择TIM3部分重映射 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); /* PB5作为PWM的输出引脚 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOB,&GPIO_InitStructure); // 初始化TIM3 TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); // 设置TIM3_CH2的PWM模式,使能CH2输出,呈现出PPT展示的PWM波形 // PWM1即mode1,先输出有效电平,再输出无效电平;PWM2即mode2则正好相反。 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; // 设置有效电平为低电平(此案例中低电平点亮D2) TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OC2Init(TIM3,&TIM_OCInitStructure); //输出比较通道2初始化 TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能TIM3在 CCR2 上的预装载寄存器 TIM_Cmd(TIM3,ENABLE); //使能定时器 } #include "relay.h" void Relay_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); //默认输出低电平 } void Relay_High(void) { GPIO_SetBits(GPIOA, GPIO_Pin_11); } void Relay_Low(void) { GPIO_ResetBits(GPIOA, GPIO_Pin_11); } #ifndef _RELAY_H_ #define _RELAY_H_ #include "main.h" #define RELAY_HIGH 1 #define RELAY_LOW 0 void Relay_Init(void); void Relay_High(void); void Relay_Low(void); #endif #ifndef __PWM_H #define __PWM_H #include "main.h" void TIM3_CH2_PWM_Init(u16 per,u16 psc); #endif #ifndef __LDR_H #define __LDR_H #include "main.h" #define LDR_PIN GPIO_Pin_0 #define LDR_PORT GPIOB #define LDR_PERIOD 4000 // ADC转换周期:4000ms #define HI_THRESHOLD 70 // 照度高阈值 #define LO_THRESHOLD 30 // 照度低阈值 typedef struct{ u8 light; // 光照强度(相对强度:0~100) u16 period; // 重复测量周期(s) u8 high_threshold; // 高亮阈值 u8 low_threshold; // 低亮阈值 SensorState state; // 工作状态 u8 (*getData)(void); // 获取光照强度数据 void (*onLightChange)(u8 hiLight, u8 loLight); // 亮度变化的响应操作 } LdrStruct; void ldr_init(void); extern LdrStruct ldr; #endif #ifndef __DHT11_H #define __DHT11_H #include "main.h" #define DHT11_PIN GPIO_Pin_12 #define DHT11_PORT GPIOA #define DHT11_DQ_IN PCin(12) // 输入 #define DHT11_DQ_OUT PCout(12) // 输出 #define SUCCESS 0 #define FAILURE 1 #define DHT11_PERIOD 5000 // 数据采集周期:5000ms #define TEMP_THRESHOLD 28 // 温度阈值(℃) // 定义DHT11结构体 typedef struct{ u8 temp; // 温度值 u8 humi; // 湿度值 u16 period; // 重复测量周期(s) u8 temp_threshold; // 温度阈值 u8 humi_threshold; // 湿度阈值 SensorState state; // 设备状态 u8 (*getData)(u8 *temp, u8 *humi); // 获取温湿度数据 void (*onTempChange)(u8 temp_threshold); // 高温的响应操作 } Dht11Struct; void dht11_init(void); extern Dht11Struct dht11; #endif #ifndef _usart_H #define _usart_H #include "main.h" #define USART1_REC_LEN 200 //定义最大接收字节数 200 extern u8 USART1_RX_BUF[USART1_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符 extern u16 USART1_RX_STA; //接收状态标记 void usart1_init(u32 baud); #endif #ifndef __TIM_H #define __TIM_H #include "main.h" //#include "stm32f10x.h" void tim4_init(u16 per,u16 psc); #endif #ifndef __DISPLAY_H #define __DISPLAY_H #include "main.h" #define DSP_DIGIT 4 // 4位数码管 typedef enum{LIGHT, TEMP, HUMI} DSP_Interface; // 数码管界面 typedef struct { u16 digit[DSP_DIGIT]; // 数码管的4位数字 u8 currDigit; // 当前显示位(1~4) u8 dotDigit; // 小数点位置(0~4,0代表不显示小数点) DSP_Interface interface; // 界面显示哪个测量值 void(*SegDisplay)(void); }DisplayStruct; void display_init(void); void segDisplay(void); //void setValue(DisplayStruct *dsp, u8 value[4], u8 dotBit); void setLightValue(DisplayStruct *dsp, u8 dotBit); void setTempValue(DisplayStruct *dsp, u8 dotBit); void setHumiValue(DisplayStruct *dsp, u8 dotBit); extern DisplayStruct dsp; #endif 在已有代码上完善该任务,STM32F103C8t6,用标准库

大家在看

recommend-type

西安市行政区划(区县)

西安市行政区划的矢量文件,WGS 1984 坐标系,到乡镇区一级。 如果想要其他的地区的可以留言,可以上传。
recommend-type

ansys后处理的教程

很好的ansys后处理教程,同大伙分享一下
recommend-type

基于matlab的第三代SNN脉冲神经网络的仿真,含仿真操作录像

1.版本:matlab2021a,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:SNN脉冲神经网络 3.内容:基于matlab的第三代SNN脉冲神经网络的仿真。 epoch = T/ms; for i = 1:floor(epoch/4) for j = 1:4 loc = fix(4*(i-1)*ms + find(input(1,:) == 1) * ms); inputSpikes(1, loc) = 1; loc = fix(4*(i-1)*ms + find(input(2,:) == 1) * ms); inputSpikes(2, loc) = 1; loc = fix(4*(i-1)*ms + find(output(1,:) == 1) * ms); outputSpikes(1, loc) = 1; 4.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
recommend-type

新工创项目-基于树莓派5+ROS2的智能物流小车视觉系统(源码+使用教程+模型文件).zip

新工创项目-基于树莓派5+ROS2的智能物流小车视觉系统(源码+使用教程+模型文件) 【项目介绍】 基于 ROS2 的智能物流小车视觉系统。 主要功能 基于 Raspberry Pi 5 和 Ubuntu 24.04 的运行环境 使用 OpenCV 和 YOLO 进行物体检测和跟踪 集成了 usb_cam 和 yolo_ros 等重要依赖包 提供了一键启动和手动启动的方式 操作系统: Raspberry Pi 5, Ubuntu 24.04 编程语言: Python 3.12, C++ 框架/库: ROS2-jazzy, OpenCV, YOLO 【运行】 编译 colcon build 运行节点 一键启动 source install/setup.bash ros2 launch launch/start_all.launch.py
recommend-type

PyPDF2-1.26.0.tar.gz

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

最新推荐

recommend-type

中小学校网络视频监控解决方案.doc

中小学校网络视频监控解决方案.doc
recommend-type

分治算法实验报告.docx

分治算法实验报告.docx
recommend-type

cc65 Windows完整版发布:6502 C开发工具

cc65是一个针对6502处理器的完整C编程开发环境,特别适用于Windows操作系统。6502处理器是一种经典的8位微处理器,于1970年代被广泛应用于诸如Apple II、Atari 2600、NES(任天堂娱乐系统)等早期计算机和游戏机中。cc65工具集能够允许开发者使用C语言编写程序,这对于那些希望为这些老旧系统开发软件的程序员来说是一大福音,因为相较于汇编语言,C语言更加高级、易读,并且具备更好的可移植性。 cc65开发工具包主要包含以下几个重要组件: 1. C编译器:这是cc65的核心部分,它能够将C语言源代码编译成6502处理器的机器码。这使得开发者可以用高级语言编写程序,而不必处理低级的汇编指令。 2. 链接器:链接器负责将编译器生成的目标代码和库文件组合成一个单独的可执行程序。在6502的开发环境中,链接器还需要处理各种内存段的定位和映射问题。 3. 汇编器:虽然主要通过C语言进行开发,但某些底层操作仍然可能需要使用汇编语言来实现。cc65包含了一个汇编器,允许程序员编写汇编代码段。 4. 库和运行时:cc65提供了一套标准库,这些库函数为C语言提供了支持,并且对于操作系统级别的功能进行了封装,使得开发者能够更方便地进行编程。运行时支持包括启动代码、中断处理、内存管理等。 5. 开发工具和文档:除了基本的编译、链接和汇编工具外,cc65还提供了一系列辅助工具,如反汇编器、二进制文件编辑器、交叉引用器等。同时,cc65还包含丰富的文档资源,为开发者提供了详尽的使用指南、编程参考和示例代码。 cc65可以广泛用于学习和开发6502架构相关的软件,尤其适合那些对6502处理器、复古计算机或者早期游戏系统有兴趣的开发者。这些开发者可能想要创建或修改旧式游戏、系统软件、仿真器,或者进行技术研究和学习。 尽管cc65是一个功能强大的工具,但它也要求开发者对目标平台的硬件架构和操作系统有足够的了解。这是因为6502并非现代处理器,它对内存访问、I/O操作和中断管理等有着特殊的限制和要求。因此,使用cc65需要开发者具备一定的背景知识,包括但不限于6502指令集、内存映射、硬件寄存器操作等方面的内容。 此外,cc65针对Windows平台进行了优化和封装,使得它可以在Windows操作系统上无缝运行,这对于习惯于Windows环境的用户是一个好消息。不过,如果用户使用的是其他操作系统,可能需要通过相应的兼容层或虚拟机来运行Windows环境,以便使用cc65工具。 总的来说,cc65提供了一种相对简单的方式来开发运行在6502处理器上的软件。它极大地降低了开发难度,使得更多的人能够接触和参与到基于6502平台的软件开发中来,为这个历史悠久的平台注入了新的活力。
recommend-type

【CLIP模型实战】:从数据预处理到代码实现的图文相似度计算完全指南

# 1. CLIP模型概述 在人工智能领域中,CLIP(Contrastive Language-Image Pre-training)模型作为一款开创性的多模态学习技术,已经成为业界瞩目的焦点。CLIP模型是由OpenAI在2021年推出的,其创新之处在于通过大规模的图文对齐数据进行预训练,能够理解和匹配图像与自然语言描述之间的关联性。CLIP突破了传统方法在特定任务上需要大规模标注数据的限制
recommend-type

车载以太网doip协议格式

<think>首先,用户的问题是:“我想查找关于车载以太网DOIP协议的数据格式或规范”。用户引用了站内内容,其中提到DoIP是基于以太网的通讯协议,用于传输UDS协议的数据,规范于ISO13400标准。关键点:-DoIP协议:DiagnosticcommunicationoverInternetProtocol-规范:ISO13400标准-数据格式:我需要提供关于DoIP数据格式的详细信息根据系统级指令:-所有行内数学表达式使用$...$格式-独立公式使用$$...$$格式并单独成段-LaTeX语法正确-使用中文回答-生成相关问题-回答中引用的段落末尾自然地添加引用标识-回答结构清晰,帮助用
recommend-type

JavaScript中文帮助手册:初学者实用指南

### JavaScript中文帮助手册知识点概述 #### 1. JavaScript简介 JavaScript是一种轻量级的编程语言,广泛用于网页开发。它能够增强用户与网页的交互性,使得网页内容变得动态和富有生气。JavaScript能够操纵网页中的HTML元素,响应用户事件,以及与后端服务器进行通信等。 #### 2. JavaScript基本语法 JavaScript的语法受到了Java和C语言的影响,包括变量声明、数据类型、运算符、控制语句等基础组成部分。以下为JavaScript中常见的基础知识点: - 变量:使用关键字`var`、`let`或`const`来声明变量,其中`let`和`const`是ES6新增的关键字,提供了块级作用域和不可变变量的概念。 - 数据类型:包括基本数据类型(字符串、数值、布尔、null和undefined)和复合数据类型(对象、数组和函数)。 - 运算符:包括算术运算符、关系运算符、逻辑运算符、位运算符等。 - 控制语句:条件判断语句(if...else、switch)、循环语句(for、while、do...while)等。 - 函数:是JavaScript中的基础,可以被看作是一段代码的集合,用于封装重复使用的代码逻辑。 #### 3. DOM操作 文档对象模型(DOM)是HTML和XML文档的编程接口。JavaScript可以通过DOM操作来读取、修改、添加或删除网页中的元素和内容。以下为DOM操作的基础知识点: - 获取元素:使用`getElementById()`、`getElementsByTagName()`等方法获取页面中的元素。 - 创建和添加元素:使用`document.createElement()`创建新元素,使用`appendChild()`或`insertBefore()`方法将元素添加到文档中。 - 修改和删除元素:通过访问元素的属性和方法,例如`innerHTML`、`textContent`、`removeChild()`等来修改或删除元素。 - 事件处理:为元素添加事件监听器,响应用户的点击、鼠标移动、键盘输入等行为。 #### 4. BOM操作 浏览器对象模型(BOM)提供了独立于内容而与浏览器窗口进行交互的对象和方法。以下是BOM操作的基础知识点: - window对象:代表了浏览器窗口本身,提供了许多属性和方法,如窗口大小调整、滚动、弹窗等。 - location对象:提供了当前URL信息的接口,可以用来获取URL、重定向页面等。 - history对象:提供了浏览器会话历史的接口,可以进行导航历史操作。 - screen对象:提供了屏幕信息的接口,包括屏幕的宽度、高度等。 #### 5. JavaScript事件 JavaScript事件是用户或浏览器自身执行的某些行为,如点击、页面加载、键盘按键、鼠标移动等。通过事件,JavaScript可以对这些行为进行响应。以下为事件处理的基础知识点: - 事件类型:包括鼠标事件、键盘事件、表单事件、窗口事件等。 - 事件监听:通过`addEventListener()`方法为元素添加事件监听器,规定当事件发生时所要执行的函数。 - 事件冒泡:事件从最深的节点开始,然后逐级向上传播到根节点。 - 事件捕获:事件从根节点开始,然后逐级向下传播到最深的节点。 #### 6. JavaScript高级特性 随着ECMAScript标准的演进,JavaScript引入了许多高级特性,这些特性包括但不限于: - 对象字面量增强:属性简写、方法简写、计算属性名等。 - 解构赋值:可以从数组或对象中提取数据,赋值给变量。 - 模板字符串:允许嵌入表达式。 - 异步编程:Promise、async/await等用于处理异步操作。 - 模块化:使用`import`和`export`关键字导入和导出模块。 - 类和模块:引入了`class`关键字,允许使用面向对象编程风格定义类,以及模块的声明。 #### 7. 开发工具和调试技巧 为了提高JavaScript开发效率和调试问题,以下是一些常用的工具和调试技巧: - 浏览器的开发者工具:包括控制台(Console)、元素查看器(Elements)、网络监控(Network)、源码编辑器(Sources)等。 - 断点调试:在源码编辑器中设置断点,逐步执行代码,查看变量值和程序流程。 - console.log:在控制台输出日志,帮助理解程序执行流程和变量状态。 - 使用JavaScript验证工具:如JSHint、ESLint等,可以在开发过程中进行代码质量检查。 以上就是《JavaScript中文帮助手册》中可能包含的主要知识点。作为初学者,通过这些内容可以系统地学习和掌握JavaScript基础和进阶知识,实现从初学到实践的跨越。在实际应用中,还需结合具体实例和项目练习,不断加深理解和熟练操作。
recommend-type

深入理解MySQL存储引擎:InnoDB与MyISAM的终极对决

# 1. MySQL存储引擎概述 MySQL数据库的灵活性和高性能在很大程度上得益于其存储引擎架构。**存储引擎**是MySQL中用于存储、索引、查询数据的底层软件模块。不同的存储引擎拥有不同的功能和特性,允许数据库管理员针对特定的应用需求选择最佳的存储引擎。例如,**InnoDB**提供事务支持和行级锁定,适用于需要ACID(原子
recommend-type

window中系统中断,cpu占用100%

<think>首先,用户的问题是关于解决Windows系统中“系统中断”导致CPU占用100%的问题。我需要基于提供的引用和系统指令来构建一个结构清晰的回答。系统指令:-所有行内数学表达式必须使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾添加引用标识,例如[^1]。-回答结构清晰,帮助用户逐步解决问题。-参考站内引用:引用[1]是关于CPU使用率100%的应急措施,引用[2]是关于Java程序CPU占用过高的解决步骤,引用[3]是关于CPU软中断导致高利用率的分析与解决方案。用户的问题:Window
recommend-type

C++Builder6.0缺失帮助文件的解决方案

标题“BCB6.0帮助文件”和描述“很多用户的C++Builder6.0的版本没有帮助文件,help文件对学习和研究BCB6.0是很重要的。”表明了我们讨论的主题是关于C++Builder(通常简称BCB)6.0版本的官方帮助文件。C++Builder是一款由Borland公司(后被Embarcadero Technologies公司收购)开发的集成开发环境(IDE),专门用于C++语言的开发。该软件的第六版,即BCB6.0,于2002年发布,是该系列的一个重要版本。在这个版本中,提供了一个帮助文件,对于学习和研究BCB6.0至关重要。因为帮助文件中包含了大量关于IDE使用的指导、编程API的参考、示例代码等,是使用该IDE不可或缺的资料。 我们可以通过【压缩包子文件的文件名称列表】中的“BCB6.0_Help”推测,这可能是一个压缩文件,包含了帮助文件的副本,可能是一个ZIP或者其他格式的压缩文件。该文件的名称“BCB6.0_Help”暗示了文件中包含的是与C++Builder6.0相关的帮助文档。在实际获取和解压该文件后,用户能够访问到详尽的文档,以便更深入地了解和利用BCB6.0的功能。 BCB6.0帮助文件的知识点主要包括以下几个方面: 1. 环境搭建和配置指南:帮助文档会解释如何安装和配置BCB6.0环境,包括如何设置编译器、调试器和其他工具选项,确保用户能够顺利开始项目。 2. IDE使用教程:文档中应包含有关如何操作IDE界面的说明,例如窗口布局、菜单结构、快捷键使用等,帮助用户熟悉开发环境。 3. 语言参考:C++Builder6.0支持C++语言,因此帮助文件会包含C++语言核心特性的说明、标准库参考、模板和STL等。 4. VCL框架说明:BCB6.0是基于Visual Component Library(VCL)框架的,帮助文件会介绍如何使用VCL构建GUI应用程序,包括组件的使用方法、事件处理、窗体设计等。 5. 数据库编程:文档会提供关于如何利用C++Builder进行数据库开发的指导,涵盖了数据库连接、SQL语言、数据集操作等关键知识点。 6. 高级功能介绍:帮助文件还会介绍一些高级功能,如使用组件面板、定制组件、深入到编译器优化、代码分析工具的使用等。 7. 示例项目和代码:为了更好地演示如何使用IDE和语言特性,帮助文件通常包含了一个或多个示例项目以及一些实用的代码片段。 8. 第三方插件和工具:BCB6.0还可能支持第三方插件,帮助文件可能会对一些广泛使用的插件进行介绍和解释如何安装和使用它们。 9. 故障排除和调试:文档会提供一些常见问题的解决方案、调试技巧以及性能调优建议。 10. 版本更新记录:虽然版本更新记录通常不会在帮助文件内详细描述,但可能会提到重大的新增特性、改进和已知问题。 11. 联系方式和资源:帮助文件中可能会包含Embarcadero公司的技术支持联系方式,以及推荐的外部资源,比如论坛、在线文档链接和社区。 在学习和研究BCB6.0时,帮助文件是一个十分宝贵的资源,它能提供快速准确的信息和指导。对于任何一个使用BCB6.0进行开发的程序员来说,熟悉这些知识点是必不可少的。
recommend-type

【湖北专升本MySQL强化训练】:5大SQL语句编写技巧,迅速提升实战能力

# 1. SQL语言基础 ## 1.1 SQL语言简介 SQL,即结构化查询语言(Structured Query Language),是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。它广泛应用于数据的查询、插入、更新和删除操作,是数据库管理员和开发人员必须掌握的核心技能。 ## 1.2 SQL语言的组成 SQL语言主要由数据定义语言(DDL),数据操纵语言