STM32库函数开发&按键库函数开发源码篇

led流水灯
led.h
#ifndef __led_h#define __led_h#include stm32f4xx.hvoid led_init(void);void led1_init(void);void led2_init(void);void led3_init(void);void led4_init(void);#endiftypedef struct{ uint32_t gpio_pin; /* 指定要配置的gpio引脚 */ gpiomode_typedef gpio_mode; /* 指定选定接点的操作模式。*/ gpiospeed_typedef gpio_speed; /* 指定选定接点的速度。*/ gpiootype_typedef gpio_otype; /* 指定选定接点的操作输出类型。*/ gpiopupd_typedef gpio_pupd; /* 指定选定接点的操作上拉/下拉。*/}gpio_inittypedef;led.c
#include led.h// init 4 pinvoid led_init(void){ gpio_inittypedef gpio_initstruct; //使能gpioe组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioe, enable); //使能gpiof组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiof, enable); // gpiof pin9 pin10 gpio_initstruct.gpio_pin = gpio_pin_9|gpio_pin_10; //引脚9/10 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpiof, &gpio_initstruct); // gpioe pin9 pin10 gpio_initstruct.gpio_pin = gpio_pin_13|gpio_pin_14; //引脚13/14 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpioe, &gpio_initstruct);}/*********************************引脚说明:led0 -- pf9**********************************/void led1_init(void){ gpio_inittypedef gpio_initstruct; //使能gpiof组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiof, enable); gpio_initstruct.gpio_pin = gpio_pin_9; //引脚9 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpiof, &gpio_initstruct);}/*********************************引脚说明:led2 -- pf10**********************************/void led2_init(void){ gpio_inittypedef gpio_initstruct; //使能gpiof组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiof, enable); gpio_initstruct.gpio_pin = gpio_pin_10; //引脚10 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpiof, &gpio_initstruct); }/*********************************引脚说明:led3 -- pe13**********************************/void led3_init(void){ gpio_inittypedef gpio_initstruct; //使能gpioe组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioe, enable); gpio_initstruct.gpio_pin = gpio_pin_13; //引脚13 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpioe, &gpio_initstruct);}/*********************************引脚说明:led4 -- pe14**********************************/void led4_init(void){ gpio_inittypedef gpio_initstruct; //使能gpioe组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioe, enable); gpio_initstruct.gpio_pin = gpio_pin_14; //引脚14 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpioe, &gpio_initstruct);}main.c
#include stm32f4xx.h#include led.h// 延时void delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){// led1_init();// led2_init();// led3_init();// led4_init(); led_init(); while(1) { //输出0 led0灯亮 gpio_resetbits(gpiof, gpio_pin_9); delay(1000); //输出1 led0灯灭 gpio_setbits(gpiof, gpio_pin_9); //输出0 led1灯亮 gpio_resetbits(gpiof, gpio_pin_10); delay(1000); //输出1 led1灯灭 gpio_setbits(gpiof, gpio_pin_10); //输出0 led2灯亮 gpio_resetbits(gpioe, gpio_pin_13); delay(1000); //输出1 led2灯灭 gpio_setbits(gpioe, gpio_pin_13); //输出0 led3灯亮 gpio_resetbits(gpioe, gpio_pin_14); delay(1000); //输出1 led3灯灭 gpio_setbits(gpioe, gpio_pin_14); } return 0;}按键控制灯
#ifndef __led_h#define __led_h#include stm32f4xx.h#define led0_on gpio_resetbits(gpiof, gpio_pin_9)#define led0_off gpio_setbits(gpiof, gpio_pin_9)void led_init(void);#endif/* ================================================ */#include led.h/*********************************引脚说明:led0 -- pf9led1 -- pf10led2 -- pe13led3 -- pe14**********************************/void led_init(void){ gpio_inittypedef gpio_initstruct; //使能gpioe组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioe, enable); //使能gpiof组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiof, enable); gpio_initstruct.gpio_pin = gpio_pin_9|gpio_pin_10; //引脚9 10 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpiof, &gpio_initstruct); gpio_initstruct.gpio_pin = gpio_pin_13|gpio_pin_14; //引脚13 14 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_initstruct.gpio_speed = gpio_speed_50mhz; //速度 gpio_init(gpioe, &gpio_initstruct); gpio_setbits(gpiof, gpio_pin_9); gpio_setbits(gpiof, gpio_pin_10); gpio_setbits(gpioe, gpio_pin_13); gpio_setbits(gpioe, gpio_pin_14);}#ifndef __key_h#define __key_h#include stm32f4xx.hvoid key_init(void);#endif#include key.h/*********************************引脚说明:key0--pa0**********************************/void key_init(void){ gpio_inittypedef gpio_initstruct; //使能gpioa组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioa, enable); gpio_initstruct.gpio_pin = gpio_pin_0; //引脚0 gpio_initstruct.gpio_mode = gpio_mode_in; //输入模式 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_init(gpioa, &gpio_initstruct); }main.c
#include stm32f4xx.h#include led.h#include key.hvoid delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){ unsigned char count = 0; key_init(); led_init(); while(1) { /* //应用场景1 //判断按键是否按下 按下为低电平 if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //大约延时20ms 起到消抖作用 delay(20); //判断按键是否按下 按下为低电平 if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //灯状态变更 gpio_togglebits(gpiof, gpio_pin_9); count++; } } //根据按键时长实现不同的功能 if(count == 50) { gpio_resetbits(gpioe, gpio_pin_14); } */ //应用场景2 比如输入银行密码 //判断按键是否按下 按下为低电平 if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //大约延时15ms 起到消抖作用 delay(15); //判断按键是否按下 按下为低电平 if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //等待按键松开 while(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset); //灯状态变更 gpio_togglebits(gpiof, gpio_pin_9); } } } return 0;}按键中断
#ifndef __exti_h#define __exti_h#include stm32f4xx.hvoid exti_pa0_init(void);#endif#include exti.h/*********************************引脚说明:key0--pa0(选择下降沿触发)**********************************/void exti_pa0_init(void){ gpio_inittypedef gpio_initstruct; exti_inittypedef exti_initstruct; nvic_inittypedef nvic_initstruct; //使能syscfg及gpioa时钟: rcc_apb2periphclockcmd(rcc_apb2periph_syscfg, enable); //使能gpioa组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpioa, enable); //初始化io口为输入。 gpio_initstruct.gpio_pin = gpio_pin_0; //引脚0 gpio_initstruct.gpio_mode = gpio_mode_in; //输入模式 gpio_initstruct.gpio_pupd = gpio_pupd_up; //上拉 gpio_init(gpioa, &gpio_initstruct); //设置io口与中断线的映射关系。 syscfg_extilineconfig(exti_portsourcegpioa, exti_pinsource0); exti_initstruct.exti_line = exti_line0; //中断线0 exti_initstruct.exti_mode = exti_mode_interrupt; //中断模式 exti_initstruct.exti_trigger= exti_trigger_falling; //下降触发 exti_initstruct.exti_linecmd= enable; //中断使能 //初始化线上中断,设置触发条件等。 exti_init(&exti_initstruct); nvic_initstruct.nvic_irqchannel = exti0_irqn; //中断通道,可在stm32f4xx.h文件当中查找 nvic_initstruct.nvic_irqchannelpreemptionpriority = 1; //抢占优先级 nvic_initstruct.nvic_irqchannelsubpriority = 1; //响应优先级 nvic_initstruct.nvic_irqchannelcmd = enable; //通道使能 //配置中断分组(nvic),并使能中断。 nvic_init(&nvic_initstruct);}void delays(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}/***************************************************************1、中断服务函数是满足条件后,cpu自行执行的函数不需要主动调用2、中断服务函数是不能传递值与返回值3、stm32的中断服务函数名可在startup_stm32f40_41xxx.s中查找****************************************************************///编写中断服务函数void exti0_irqhandler(void){ //判断标志位是否1 if(exti_getitstatus(exti_line0) == set) { if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //延时一段时间 delays(15); if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { gpio_togglebits(gpiof, gpio_pin_9); } } } //清空中断线0 exti_clearitpendingbit(exti_line0); }main.c
#include stm32f4xx.h#include led.h#include key.hvoid delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){ unsigned char count = 0; key_init(); led_init(); while(1) { //判断按键1是否按下 按下为低电平 if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //大约延时15ms 起到消抖作用 delay(15); //判断按键1是否按下 按下为低电平 if(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset) { //等待按键1松开 while(gpio_readinputdatabit(gpioa, gpio_pin_0) == bit_reset); //灯1状态变更 gpio_togglebits(gpiof, gpio_pin_9); } } //判断按键2是否按下 按下为低电平 if(gpio_readinputdatabit(gpioe, gpio_pin_2) == bit_reset) { //大约延时15ms 起到消抖作用 delay(15); //判断按键2是否按下 按下为低电平 if(gpio_readinputdatabit(gpioe, gpio_pin_2) == bit_reset) { //等待按键2松开 while(gpio_readinputdatabit(gpioe, gpio_pin_2) == bit_reset); //灯2状态变更 gpio_togglebits(gpiof, gpio_pin_10); } } //判断按键3是否按下 按下为低电平 if(gpio_readinputdatabit(gpioe, gpio_pin_3) == bit_reset) { //大约延时15ms 起到消抖作用 delay(15); //判断按键3是否按下 按下为低电平 if(gpio_readinputdatabit(gpioe, gpio_pin_3) == bit_reset) { //等待按键3松开 while(gpio_readinputdatabit(gpioe, gpio_pin_3) == bit_reset); //灯3状态变更 gpio_togglebits(gpioe, gpio_pin_13); } } //判断按键4是否按下 按下为低电平 if(gpio_readinputdatabit(gpioe, gpio_pin_4) == bit_reset) { //大约延时15ms 起到消抖作用 delay(15); //判断按键4是否按下 按下为低电平 if(gpio_readinputdatabit(gpioe, gpio_pin_4) == bit_reset) { //等待按键4松开 while(gpio_readinputdatabit(gpioe, gpio_pin_4) == bit_reset); //灯4状态变更 gpio_togglebits(gpioe, gpio_pin_14); } } } return 0;}作业
#ifndef __beep_h#define __beep_h#include stm32f4xx.hvoid beep_init(void);#endif#include beep.h/************************************引脚说明beep -- pf8************************************/void beep_init(){ gpio_inittypedef gpio_initstruct; //使能gpiof组时钟 rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiof, enable); gpio_initstruct.gpio_pin = gpio_pin_8; //引脚8 gpio_initstruct.gpio_mode = gpio_mode_out; //输出模式 gpio_initstruct.gpio_otype = gpio_otype_pp; //推挽输出 gpio_initstruct.gpio_pupd = gpio_pupd_down; //xia la gpio_initstruct.gpio_speed = gpio_speed_100mhz; //速度 gpio_init(gpiof, &gpio_initstruct);}#include stm32f4xx.h#include beep.hvoid delay(int n){ int i,j; for(i=0; i< n; i++) for(j=0; j< 30000; j++);}int main(void){ beep_init(); while(1) { gpio_resetbits(gpiof, gpio_pin_8); delay(1000); gpio_setbits(gpiof, gpio_pin_8); delay(1000); } return 0;}

中央广播正式宣告央视首个8K超高清电视频道试验开播
AMD RDNA2图形架构与RDNA相比,每瓦性能提高50%
俄罗斯研发出“空中出租车” 计划于2023年至2025年在莫斯科正式启用
定轴轮系传动比计算
电流互感器与变压器的区别、电流互感器可以开路吗?电流互感器可以短路吗?
STM32库函数开发&amp;按键库函数开发源码篇
数控机床机器人是如何循环作业的?
如何进行PCB抄板设计
CS5266设计Typec转HDMI+PD+U2+U3四合一多功能拓展坞方案
一款比苹果还流畅的手机,未来将会成为主流
ADI进博进行时丨4.1号馆必打卡人气展台,全场景客户案例实力出圈!
变阻二极管
EDA技术及发展趋势(一)
人工智能真正的风险在哪里
极视角与百信签署合作协议 推进人工智能技术等领域发展
三维CAD技巧:中望3D快捷键设置
深圳5G基站建设项目已经全面复工
桌面版Intel Kaby Lake处理器将发布 新200系列主板规格曝光
广州尚能丨风光储智慧物联监控系统
电力系统互联的优缺点 电力系统互联的条件