001.HAL_LED,BEEP

while(1)中可用函数

//设置IO口状态
  HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOF, RED_Pin|YELLOW_Pin, GPIO_PIN_SET);
//GPIO状态转换
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9);//输出电平翻转函数

#include "stm32f1xx_hal.h" // ??LED?? - ???????? #define LED1_PIN GPIO_PIN_0 #define LED1_PORT GPIOA #define LED2_PIN GPIO_PIN_1 #define LED2_PORT GPIOA #define LED3_PIN GPIO_PIN_2 #define LED3_PORT GPIOA #define LED4_PIN GPIO_PIN_3 #define LED4_PORT GPIOA #define LED5_PIN GPIO_PIN_4 #define LED5_PORT GPIOA #define LED6_PIN GPIO_PIN_5 #define LED6_PORT GPIOA #define LED7_PIN GPIO_PIN_6 #define LED7_PORT GPIOA #define LED8_PIN GPIO_PIN_7 #define LED8_PORT GPIOA // ??????? #define BUZZER_PIN GPIO_PIN_8 #define BUZZER_PORT GPIOA // ?????? (Hz) #define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 #define NOTE_A4 440 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_REST 0 // ??? // ???????? #define WHOLE_NOTE 1600 #define HALF_NOTE WHOLE_NOTE/2 #define QUARTER_NOTE WHOLE_NOTE/4 #define EIGHTH_NOTE WHOLE_NOTE/8 #define SIXTEENTH_NOTE WHOLE_NOTE/16 void HAL_delay_US(uint32_t us) ; // «??»?????? (??) typedef struct { int note; int duration; int led; // ?????LED (1-8) } MelodyNote; MelodyNote qingtian[] = { {NOTE_E4, EIGHTH_NOTE, 1}, {NOTE_G4, EIGHTH_NOTE, 2}, {NOTE_C5, QUARTER_NOTE, 3}, {NOTE_B4, EIGHTH_NOTE, 4}, {NOTE_G4, EIGHTH_NOTE, 5}, {NOTE_A4, QUARTER_NOTE, 6}, {NOTE_G4, HALF_NOTE, 7}, {NOTE_E4, QUARTER_NOTE, 8}, {NOTE_REST, QUARTER_NOTE, 0}, // ???,??LED?? // ??????????... }; // ???GPIO void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // ??LED????? GPIO_InitStruct.Pin = LED1_PIN | LED2_PIN | LED3_PIN | LED4_PIN | LED5_PIN | LED6_PIN | LED7_PIN | LED8_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // ??????? GPIO_InitStruct.Pin = BUZZER_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(BUZZER_PORT, &GPIO_InitStruct); } // ????LED?????LED void SetLED(int ledNum) { // ?????LED HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED3_PORT, LED3_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED4_PORT, LED4_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED6_PORT, LED6_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED7_PORT, LED7_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(LED8_PORT, LED8_PIN, GPIO_PIN_RESET); // ?????LED switch(ledNum) { case 1: HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_SET); break; case 2: HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_SET); break; case 3: HAL_GPIO_WritePin(LED3_PORT, LED3_PIN, GPIO_PIN_SET); break; case 4: HAL_GPIO_WritePin(LED4_PORT, LED4_PIN, GPIO_PIN_SET); break; case 5: HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_SET); break; case 6: HAL_GPIO_WritePin(LED6_PORT, LED6_PIN, GPIO_PIN_SET); break; case 7: HAL_GPIO_WritePin(LED7_PORT, LED7_PIN, GPIO_PIN_SET); break; case 8: HAL_GPIO_WritePin(LED8_PORT, LED8_PIN, GPIO_PIN_SET); break; case 0: // ???,??LED?? default: break; } } // ?????????(??????) void Beep(int frequency, int duration) { if (frequency == NOTE_REST) { HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET); HAL_Delay(duration); return; } int period = 1000000 / frequency; // ??(??) int halfPeriod = period / 2; int cycles = duration * 1000 / period; for (int i = 0; i < cycles; i++) { HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_SET); HAL_delay_US(halfPeriod); HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET); HAL_delay_US(halfPeriod); } } // ???????LED void PlayMelody(MelodyNote *melody, int length) { for (int i = 0; i < length; i++) { SetLED(melody[i].led); // ????LED Beep(melody[i].note, melody[i].duration); // ???? } } int main(void) { HAL_Init(); MX_GPIO_Init(); // ?????? int melodyLength = sizeof(qingtian) / sizeof(qingtian[0]); while (1) { PlayMelody(qingtian, melodyLength); HAL_Delay(2000); // ????????2???? } } // ???????(????) void HAL_delay_US(uint32_t us) { uint32_t ticks=us*(SystemCoreClock /1000000); uint32_t start = SysTick ->VAL ; while ((SysTick->VAL - start + (SystemCoreClock / 1000000)) % (SystemCoreClock / 1000000) < ticks); }
最新发布
07-12
#include "stm32f4xx.h" #include <stdio.h> static GPIO_InitTypeDef GPIO_InitStructure; static NVIC_InitTypeDef NVIC_InitStructure; static USART_InitTypeDef USART_InitStructure; // 全局变量 volatile uint32_t sysTickCounter = 0; // 系统时钟配置 (168MHz) void SystemClock_Config(void) { // 复位RCC寄存器 RCC_DeInit(); // 使能外部高速晶振 RCC_HSEConfig(RCC_HSE_ON); // 等待HSE稳定 if (RCC_WaitForHSEStartUp() == SUCCESS) { // 配置PLL:HSE作为PLL源,8MHz输入,倍频到168MHz RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336, 2, 7); RCC_PLLCmd(ENABLE); // 等待PLL锁定 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 设置系统时钟源为PLL RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 等待系统时钟源切换完成 while (RCC_GetSYSCLKSource() != 0x08); } // 设置AHB时钟 (HCLK = SYSCLK) RCC_HCLKConfig(RCC_SYSCLK_Div1); // 设置APB1时钟 (PCLK1 = HCLK/4) RCC_PCLK1Config(RCC_HCLK_Div4); // 设置APB2时钟 (PCLK2 = HCLK/2) RCC_PCLK2Config(RCC_HCLK_Div2); // 更新SystemCoreClock变量 SystemCoreClockUpdate(); } // SysTick中断处理函数 void SysTick_Handler(void) { sysTickCounter++; } // 精确的毫秒级延迟 void delay_ms(uint32_t ms) { uint32_t start = sysTickCounter; // 处理计数器溢出情况 while ((sysTickCounter - start) < ms); } // 中断优先级配置 void NVIC_Configuration(void) { // 设置优先级分组(2位抢占优先级,2位响应优先级) NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 配置USART1中断优先级(较高优先级) NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 配置SysTick中断优先级(较低优先级) NVIC_SetPriority(SysTick_IRQn, 1); // 优先级1 } // GPIO初始化 void gpio_Init(void) { // 使能GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOE, ENABLE); // 配置LED引脚 (PF9) - 低电平点亮 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOF, &GPIO_InitStructure); // 配置按键引脚 (PA0) - 使用内部上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻 GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置按键引脚 (PE2) - 使用内部上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻 GPIO_Init(GPIOE, &GPIO_InitStructure); } // 蜂鸣器初始化 (高电平有效) void Beeper_Init(void) { // 使能GPIO时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); // 配置蜂鸣器引脚 (PF8) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOF, &GPIO_InitStructure); // 初始状态:关闭蜂鸣器 (低电平) GPIO_ResetBits(GPIOF, GPIO_Pin_8); } // 串口初始化 void USART1_Init(void) { // 1. 使能时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 2. 配置GPIO引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // PA9(TX), PA10(RX) GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉电阻 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 3. 引脚复用映射 GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // 4. 配置USART参数 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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); // 5. 配置中断(已在NVIC_Configuration中完成) // 6. 使能USART USART_Cmd(USART1, ENABLE); // 7. 清除标志位 USART_ClearFlag(USART1, USART_FLAG_TC); } // 中断服务函数 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { uint8_t data = USART_ReceiveData(USART1); // 简单回显(可选) USART_SendData(USART1, data); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_ClearITPendingBit(USART1, USART_IT_RXNE); } } // 发送字符串到串口 void USART_SendString(USART_TypeDef* USARTx, const char* str) { while(*str) { while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET); USART_SendData(USARTx, *str++); } // 等待传输完成 while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET); USART_ClearFlag(USARTx, USART_FLAG_TC); } // 发送格式化消息 void SendStatusMessage(uint8_t key_num, uint8_t led_state, uint8_t beeper_state) { char message[60]; if(key_num == 0) { sprintf(message, "按键0: LED %s, 蜂鸣器 %s\r\n", led_state ? "亮起" : "熄灭", beeper_state ? "发声" : "静音"); } else { sprintf(message, "按键1: LED %s, 蜂鸣器 %s\r\n", led_state ? "亮起" : "熄灭", beeper_state ? "发声" : "静音"); } USART_SendString(USART1, message); } int main(void) { // 系统初始化 SystemClock_Config(); // 配置系统时钟为168MHz NVIC_Configuration(); // 配置中断优先级 SysTick_Config(SystemCoreClock / 1000); // 初始化SysTick定时器 gpio_Init(); // 初始化GPIO Beeper_Init(); // 初始化蜂鸣器 USART1_Init(); // 初始化串口 // 初始状态:关闭LED和蜂鸣器 GPIO_SetBits(GPIOF, GPIO_Pin_9); // LED灭 (高电平) GPIO_ResetBits(GPIOF, GPIO_Pin_8); // 蜂鸣器关 (低电平) // 发送启动消息 USART_SendString(USART1, "系统已启动!\r\n"); USART_SendString(USART1, "按键0: 点亮LED, 蜂鸣器发声\r\n"); USART_SendString(USART1, "按键1: 熄灭LED, 蜂鸣器静音\r\n"); // 系统状态 uint8_t led_state = 0; // LED状态 (0:灭, 1:亮) uint8_t beeper_state = 0; // 蜂鸣器状态 (0:关, 1:开) while(1) { // 检测按键0按下 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) // 低电平表示按下 { delay_ms(50); // 精确消抖 // 确认按键仍然按下 if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) { // 点亮LED和开启蜂鸣器 GPIO_ResetBits(GPIOF, GPIO_Pin_9); // LED亮 (低电平) GPIO_SetBits(GPIOF, GPIO_Pin_8); // 蜂鸣器开 (高电平) // 更新状态 led_state = 1; beeper_state = 1; // 发送消息到PC SendStatusMessage(0, led_state, beeper_state); // 等待按键释放 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET); // 添加短暂延迟防止按键弹跳 delay_ms(20); } } // 检测按键1按下 if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == RESET) // 低电平表示按下 { delay_ms(50); // 精确消抖 // 确认按键仍然按下 if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == RESET) { // 关闭LED和蜂鸣器 GPIO_SetBits(GPIOF, GPIO_Pin_9); // LED灭 (高电平) GPIO_ResetBits(GPIOF, GPIO_Pin_8); // 蜂鸣器关 (低电平) // 更新状态 led_state = 0; beeper_state = 0; // 发送消息到PC SendStatusMessage(1, led_state, beeper_state); // 等待按键释放 while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == RESET); // 添加短暂延迟防止按键弹跳 delay_ms(20); } } } } 分析
07-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值