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

嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)

嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)

  • 开发涉及工具
  • 控制端口配置
    • 端口的设定与确认
    • 端口配置方法
    • 实现点亮LED
    • 程序下载与仿真

有工程实例,链接在最底部。

开发涉及工具

开发环境(IDE):IAR-ARM8.32.4
开发板:STM32_F4VE_V2.0
下载器:J-Link
固件库版本:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

控制端口配置

端口的设定与确认

首先确认好LED是连接在单片机的哪一个端口,例如我使用的开发板上面设计有LED,那么我们就从其原理图上查找端口连接方式,如下图所示,可得的信息有:
1.此开发板有两颗可控制LED
2.D2_LED是连接在PA6上。D3_LED连接在PA7上。
3.两颗LED共阳极连接,接3.3V,控制信号为低电平时才点亮。
在这里插入图片描述

端口配置方法

然后根据已得信息,我们查找固件库中关于GPIO配置的例程,我使用的固件库版本在STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Project\STM32F4xx_StdPeriph_Examples\GPIO\GPIO_IOToggle路径中,点开其main.c和main.h文件,

在这里插入图片描述

在这里插入图片描述
通过简单分析可整理成如下GPIO配置步骤:
1.定义GPIO配置的结构体变量;
2.要开启相应GPIO端口的时钟;
3.指定端口的PIN脚;
4.配置引脚的模式;
5.配置引脚的频率;
6.配置引脚的输出方式;
7.配置引脚是上拉还是下拉;
8.然后将所有配置初始化给引脚;
整合代码如下:

void LED_IOConf(void)
{GPIO_InitTypeDef GPIO_InitStructure;//新建一个配置GPIO的结构体变量RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//GPIOA挂载在AHB1总线上,在这里开启它的时钟GPIO_InitStructure.GPIO_Pin           = GPIO_Pin_6;//确认好LED是连接在哪一个引脚GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_OUT;//控制LED灯引脚是输出模式GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;//这个是引脚的输出频率配置,没有特别的要求一般选最高100MGPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;//端口用作控制信号输出一般情况都设置为推挽输出GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_UP;//配置引脚是上拉还是下拉GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化引脚配置
}

实现点亮LED

从前面的分析我们已知,现在给LED一个低电平就会让它点亮,那么如何使端口输出低电平呢?
我们可以从stm32f4xx.gpio.h里面找到相应的函数,封装到自己的函数中然后调用,方式如下:

void LED_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_6);//引脚输出高电平,LED不亮
}
void LED_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_6);//引脚输出低电平,LED亮
}

点亮我们则调用void LED_ON(void),例如:

void main()
{LED_IOConf();//调用配置函数LED_OFF();//让LED的最初状态为不亮while(1){LED_ON();//点亮LED}
}

我们也可以让LED闪烁起来,加上延时功能,简单的延时函数可以这样写:

void Delay_us(uint16_t xus)
{uint16_t i = 0;for(i = xus;i > 0;i --){__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();}
}void Delay_ms(uint16_t xms)
{uint16_t i = 0;for(i = xms;i > 0;i --){Delay_us(1000);}
}void Delay_s(uint16_t xs)
{uint16_t i = 0;for(i = xs;i > 0;i --){Delay_ms(1000);}
}

在主函数中如下方式调用:

void main()
{LED_IOConf();//调用配置函数LED_OFF();//让LED的最初状态为不亮while(1){LED_ON();//点亮LEDDelay_ms(500);//等待500毫秒LED_OFF();//熄灭LEDDelay_ms(500);//等待500毫秒}
}

程序下载与仿真

1.首先在工程名上鼠标右键选择Options
在这里插入图片描述
2.点击General Optons -->Target–>Dervice
在这里插入图片描述
3.点击后面的小控件选择好自己使用的芯片;
在这里插入图片描述
在这里插入图片描述
4.再点击左侧Debugger–>Setup,在Driver的下拉框中选择仿真器,我使用的J-Link所以选择它,点击OK;
在这里插入图片描述
5.在菜单栏选择绿色的控件点击后等待程序下载和调试界面加载
在这里插入图片描述
6.加载完成后,可点击如下控件进行逐句调试,直接运行就点旁边白色控件,关闭调试点击红色X号控件;
在这里插入图片描述
工程实例链接:https://download.csdn.net/download/qq_45100839/88423150

http://www.lryc.cn/news/192455.html

相关文章:

  • 智能呼叫中心系统的未来发展趋势:为企业开启全新服务模式
  • UE5中实现沿样条线创建网格体2-SplineMesh版本
  • 实现Element Select选择器滚动加载
  • C++ 之 Vector 和 List
  • 力扣-448.找到所有数组中消失的数字
  • 常用gdb调试命令
  • 【动手学深度学习-Pytorch版】BERT预测系列——用于预测的BERT数据集
  • 【数据结构-字符串 三】【栈的应用】字符串解码
  • Stm32_标准库_10_TIM_显示时间日期
  • 10-SRCNN-使用CNN实现超分辨成像
  • cmd/bat 输出符,控制台日志输出到文件
  • ODrive移植keil(七)—— 插值算法和偏置校准
  • 【肌电信号】OpenSignals使用方法 --- 肌电信号采集及导入matlab
  • STM32 多功能按键中断
  • Linux-文件管理命令
  • JS DataTable中导出PDF右侧列被截断的问题解决
  • 学习笔记-MongoDB(复制集,分片集集群搭建)
  • Servlet与设计模式
  • Python学习基础笔记六十五——布尔值
  • ChatGPT生产力|实用指令(prompt)
  • 【大数据Hive】hive select 语法使用详解
  • Android---java线程优化 偏向锁、轻量级锁和重量级锁
  • 处理机调度
  • Webpack 解决:ReferenceError: dist is not defined 的问题
  • MySQL的index merge(索引合并)导致数据库死锁分析与解决方案 | 京东云技术团队
  • 第四章 网络层 | 计算机网络(谢希仁 第八版)
  • 课题学习(八)----卡尔曼滤波动态求解倾角、方位角
  • 仿真软件Proteus8.9 SP2 Pro 下载、安装、汉化详细图文教程
  • 振弦传感器和无线振弦采集仪在隧道安全监测的解决方案
  • c# xml 参数读取的复杂使用