STM32无阻塞按键防抖代码开发教程

需积分: 13 1 下载量 182 浏览量 更新于2025-01-08 1 收藏 339KB ZIP 举报
资源摘要信息:"本资源主要提供了一个使用无阻塞方式实现按键防抖功能的代码开发示例,特别适合于STM32微控制器的学习者和专业人士。以下将详细阐述资源中涉及的关键知识点。 1. STM32微控制器基础:STM32是一类广泛使用的32位ARM Cortex-M微控制器,它在嵌入式应用中非常流行。本资源涉及的初始化代码包括时钟(TIM)、串行通信接口(USART)和LED控制的通用输入输出端口(GPIO)。这些初始化步骤为后续的按键检测和防抖逻辑提供了基础硬件支持。 2. 按键防抖技术:在电子系统中,按键在被按下时会产生机械和电气的抖动,这会导致短时间内产生多次错误的信号。为了解决这一问题,通常会采用防抖技术,以确保系统只在用户真正意图下识别按键动作。无阻塞方式是一种防抖技术,通过软件算法而非硬件电路来实现,从而避免了因阻塞导致的CPU资源浪费。 3. 无阻塞软件设计:无阻塞设计通常涉及到使用状态机或定时器来周期性检查按键状态,并判断是否发生了稳定的按键动作。这需要对系统定时器(TIM)进行配置,以定期执行检测任务,而不会对其他任务产生影响。 4. 宏定义和代码移植:通过修改宏定义可以轻松调整开关时间,这体现了模块化设计的优势。同时,查看头文件能够帮助开发者了解代码结构,并便于将该功能模块移植到不同的硬件平台上。 5. 静态全局变量与全局变量的使用:资源中特别提到了掌握静态全局变量和全局变量的使用方法。静态全局变量在程序的整个运行期间都保持其值不变,它们在多文件项目中的封装和使用是维护和扩展代码时需要注意的一个点。全局变量则提供了跨函数的数据共享能力,但也需要谨慎使用,以免造成数据冲突和资源泄漏。 6. STM32学习与应用:对于STM32的初学者,本资源是一个很好的功能模块学习案例,它涉及到了微控制器的初始化、无阻塞软件设计模式、按键防抖技术以及代码结构与移植。对于从业人员来说,这个示例可以作为功能模块积累的基础,帮助开发者在实际项目中实现更高效和稳定的按键检测逻辑。 7. 详细博客说明:资源中提到的“更加详细说明见博客”,意味着开发者可以访问相关博客文章来获得更深入的解释和指导,这有助于加深对无阻塞按键防抖代码开发的理解。 总结:此资源为STM32微控制器的按键防抖功能开发提供了一个无阻塞方式的实践示例,涉及初始化配置、防抖算法、宏定义使用、全局变量管理以及代码移植等多个知识点,非常适合于STM32的学习者和开发者,以提升他们对无阻塞设计和模块化编程的理解。"

void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 } 这串代码中规定了哪个引脚是usart的rx与tx

131 浏览量

void uart_init(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 }

207 浏览量
218 浏览量

请帮我解释一下下面这串代码”#include "sys.h" #include "delay.h" #include "usart.h" int main(void) { GPIO_SetBits(GPIOC, GPIO_Pin_13); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); //这行代码的作用是将初始化结构体 GPIO_InitStructure 中配置的参数应用到 GPIOA 引脚上,以完成引脚的初始化设置。 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); USART_InitTypeDef USART_InitStructure; //USART 是一种常见的串行通信接口,用于实现与外部设备或其他单片机之间的数据传输。 NVIC_InitTypeDef NVIC_InitStructure; USART_InitStructure.USART_BaudRate=9600; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Cmd(USART2,ENABLE); USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//用于配置 USART 模块的中断功能。 USART_Init(USART2, &USART_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2,ENABLE); while(1) { } } void USART2_IRQHandler(void) { char Res; if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) //接收中断 { Res =USART_ReceiveData(USART2); //读取接收到的数据 if(Res=='a') { GPIO_ResetBits(GPIOC, GPIO_Pin_13); } if(Res=='b') { GPIO_SetBits(GPIOC, GPIO_Pin_13); } } USART_ClearITPendingBit(USART2,USART_IT_RXNE); } “

167 浏览量