当前位置: 首页 > news >正文

STM32入门(1)

STM32入门(1)

项目1:实现LED灯闪烁

// 项目:实现LED灯闪烁#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main()
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);// 配置GPIOC_13GPIO_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);// 最小系统板 PC_13口LED灯低电平点亮//GPIO_SetBits(GPIOC,GPIO_Pin_13);      // 设置为高电平  LED熄灭//GPIO_ResetBits(GPIOC,GPIO_Pin_13);		// 设置为低电平  LED点亮while(1){GPIO_ResetBits(GPIOC,GPIO_Pin_13);		// 设置为低电平  LED点亮Delay_ms(500);												// 延时GPIO_SetBits(GPIOC,GPIO_Pin_13);      // 设置为高电平  LED熄灭Delay_ms(500);									      // 延时}
}

项目2:实现LED流水灯

// 项目:实现LED流水灯#include "stm32f10x.h"                  // Device header
#include "Delay.h" int main()
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 配置GPIOAGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);// GPIO_Init(); 函数初始化后默认引脚为低电平// 硬件电路设计的是低电平点亮LED,所以上电后会出现所有LED被点亮// 将 GPIOA 端口的全部16个引脚都设为高电平// 0xFFFF 的二进制是 1111 1111 1111 1111,所有位都是1GPIO_Write(GPIOA, 0xFFFF);// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);   // 低电平点亮PA0端口LEDwhile(1){// 实现流水灯GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);}
}	

项目3:蜂鸣器(低电触发)

// 项目:蜂鸣器(低电触发)#include "stm32f10x.h"                                             // Device header
#include "Delay.h"#define BEEP_ON()   GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);    // 蜂鸣器鸣响
#define BEEP_OFF()  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);      // 蜂鸣器关闭int main() 
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置GPIOB_3端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);// GPIO_WriteBit(GPIOB,GPIO_Pin_3,Bit_RESET);// PB13 是JTDO接口,如果没有配置不能直接使用,换成PB12// GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);    	 // 蜂鸣器鸣响while(1){//GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);    // 蜂鸣器鸣响//GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);    	 // 蜂鸣器关闭BEEP_ON();Delay_ms(100);BEEP_OFF();Delay_ms(100);BEEP_ON();Delay_ms(100);BEEP_OFF();Delay_ms(500);}
}

项目4:按键控制LED

// 项目:按键控制LED#include "stm32f10x.h"      // Device header
#include "Delay.h" 
#include "LED.h" 
#include "Key.h" uint8_t KeyNum = 0;        // 设置键码值变量int main()
{// 初始化 LED模块、按键模块LED_Init();Key_Init();while(1){KeyNum = Key_GetNum();if(KeyNum == 1){LED1_turn();}if(KeyNum == 2){LED2_turn();}}}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"/*** 函    数:按键初始化* 参    数:无* 返 回 值:无*/
void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);      // 开启时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;             // 设置为下拉模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/*** 函    数:按键获取键码* 参    数:无* 返 回 值:按下按键的键码值,范围:0~2,返回0代表没有按键按下* 注意事项:此函数是阻塞式操作,当按键按住不放时,函数会卡住,直到按键松手*/
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;   // 定义变量,默认键码值为0if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == SET){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == SET);Delay_ms(20);KeyNum = 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == SET){Delay_ms(20);while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == SET);Delay_ms(20);KeyNum = 2;}return KeyNum;
}
#ifndef __KEY_H_
#define __KEY_H_void Key_Init(void);
uint8_t Key_GetNum(void);#endif
#include "stm32f10x.h"                  // Device header/*** 函    数:LED初始化* 参    数:无* 返 回 值:无*/
void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   // 开启GPIOA时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);
}/*** 函    数:LED1 (高电平)点亮* 参    数:无* 返 回 值:无*/
void LED1_ON(void)
{GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
}/*** 函    数:LED1 (低电平)熄灭* 参    数:无* 返 回 值:无*/
void LED1_OFF(void)
{GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);
}/*** 函    数:LED1 电平反转* 参    数:无* 返 回 值:无*/
void LED1_turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0) == SET)    // 读取输出寄存器,如果为高电平{GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);					 // 则修改为低电平}else{GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);						 // 否则修改为高电平}
}/*** 函    数:LED2 (高电平)点亮* 参    数:无* 返 回 值:无*/
void LED2_ON(void)
{GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);
}/*** 函    数:LED2 (低电平)熄灭* 参    数:无* 返 回 值:无*/
void LED2_OFF(void)
{GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);
}/*** 函    数:LED1 电平反转* 参    数:无* 返 回 值:无*/
void LED2_turn(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == SET)    // 读取输出寄存器,如果为高电平{GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET);					 // 则修改为低电平}else{GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET);						 // 否则修改为高电平}
}
#ifndef __LED_H_
#define __LED_H_void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED1_turn(void);void LED2_ON(void);
void LED2_OFF(void);
void LED2_turn(void);#endif
#include "stm32f10x.h"/*** @brief  微秒级延时* @param  xus 延时时长,范围:0~233015* @retval 无*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;				//设置定时器重装值SysTick->VAL = 0x00;					//清空当前计数值SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器while(!(SysTick->CTRL & 0x00010000));	//等待计数到0SysTick->CTRL = 0x00000004;				//关闭定时器
}/*** @brief  毫秒级延时* @param  xms 延时时长,范围:0~4294967295* @retval 无*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief  秒级延时* @param  xs 延时时长,范围:0~4294967295* @retval 无*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 
#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif

项目5:光敏电阻控制蜂鸣器

// 项目:光敏传感器控制蜂鸣器#include "stm32f10x.h"      // Device header
#include "Delay.h" 
#include "LED.h" 
#include "Buzzer.h"
#include "LightSensor.h" uint8_t LightS_Num = 0;        // 设置光敏传感器状态变量int main()
{// 初始化 光敏传感器模块、蜂鸣器模块LightSensor_Init();Buzzer_Init();while(1){LightS_Num = LightSensor_Get();if(LightS_Num == 1){Buzzer_ON();}else{Buzzer_OFF();}}
}
#include "stm32f10x.h"                                             // Device header
#include "Delay.h"#define BEEP_ON()   GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);    // 蜂鸣器鸣响
#define BEEP_OFF()  GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);      // 蜂鸣器关闭/*** 函    数:蜂鸣器初始化* 参    数:无* 返 回 值:无*/
void Buzzer_Init(void)
{// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// 配置GPIOB_3端口GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);BEEP_OFF();    // 把GPIOB_12设置为高电平,防止蜂鸣器上电鸣响
}/*** 函    数:开启蜂鸣器* 参    数:无* 返 回 值:无*/
void Buzzer_ON(void)
{BEEP_ON();
}/*** 函    数:关闭蜂鸣器* 参    数:无* 返 回 值:无*/
void Buzzer_OFF(void)
{BEEP_OFF();
}
#ifndef __BUZZER_H_
#define __BUZZER_H_void Buzzer_Init(void);
void Buzzer_ON(void);
void Buzzer_OFF(void);#endif
#include "stm32f10x.h"                  // Device header/*** 函    数:光敏传感器初始化* 参    数:无* 返 回 值:无*/
void LightSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;     // 设置为下拉模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/*** 函    数:获取当前光敏传感器输出的高低电平* 参    数:无* 返 回 值:光敏传感器输出的高低电平,范围:0/1*/
uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);     // 返回GPIOB_13端口的输入值
}
#ifndef __LIGHT_SENSOR_H_
#define __LIGHT_SENSOR_H_void LightSensor_Init(void);
uint8_t LightSensor_Get(void);#endif
http://www.jsqmd.com/news/447781/

相关文章:

  • YOLO26改进73:全网首发--c3k2模块添加PoolingFormerCGLU创新模块
  • 鼎捷T100开发实战:CURSOR在Genero BDL中的高效数据查询技巧
  • OpenAI开源计划:开发者免费享半年ChatGPT Pro订阅
  • 2026年DeepSeek写的论文AI率太高?这几款降AIGC率工具帮你搞定 - 还在做实验的师兄
  • Unity游戏开发必备:TMP中文字体导入全攻略(附免费商用字体推荐)
  • 8253/8254定时器在嵌入式系统中的应用:从原理到实战代码解析
  • MCP ????
  • 高阻态不是玄学!用万用表实测单片机引脚悬浮状态(避坑指南)
  • 避坑指南:PINN在常微分方程积分中的常见问题及解决方案
  • ProM插件开发实战:从Hello World到多线程任务管理(附完整代码示例)
  • 金蝶K3跨网段卡顿?3步TCP调优搞定ERP服务器响应慢问题
  • ABC 448 A - D 题解
  • 告别Logitech Option崩溃烦恼:XMouseButtonControl鼠标宏配置全攻略(含自启动设置)
  • SpringBoot+若依:Swagger接口文档的权限控制实战(从入门到精通)
  • Leaflet地图性能优化指南:5个技巧让你的聚类图层流畅渲染(含高德地图适配)
  • CPU中的ACC累加器:为什么它比普通寄存器更快?从硬件设计角度解析
  • MySQL 8.0 vs 5.6实战避坑指南:从性能优化到安全配置的全面对比
  • 终极指南:如何通过Paddle-Lite线程池实现3倍并发推理性能提升
  • Scaffold-GS实战:从点云到3D高斯渲染的完整配置流程(附避坑指南)
  • Email地址大小写不敏感?这些特殊字符你最好别用!
  • IMU标定中的5个常见误区与解决方案:从Allan方差到四元数表示法
  • Winform主菜单实战:从拖拽控件到动态生成,哪种方式更适合你?
  • 5分钟搞懂高斯函数:从图像处理到机器学习中的实际应用
  • BMS测试效率翻倍秘诀:用18串模拟器一键模拟电池组故障状态(含CAN通讯配置)
  • 科研效率翻倍!Python+BeautifulSoup实现arXiv论文自动抓取与PDF下载(附完整代码)
  • ABAP实战:如何高效从A003和KONP表中获取税率(附性能优化技巧)
  • PINN实战:用Python代码实现物理约束神经网络(附Burgers方程案例)
  • VTK初学者大礼包:数据+文档+源码三件套的配置指南(附仿真案例)
  • 关于mybatis的路径下未配置导致网址出现错误代码:500的问题
  • Python语音助手开发实战:用PyAudio实现智能麦克风监听(附环境噪音过滤技巧)