led.c 文件中输入如下代码
#include "led.h"
//初始化PF9和PF10为输出口.并使能这两个口的时钟
//LED IO 初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能 GPIOF时钟
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0 和 LED1对应IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
}
该代码里面就包含了一个函数 void LED_Init(void),该函数的功能就是用来实现配置 PF9和PF10 为推挽输出。这里需要注意的是:在配置STM32 外设的时候,任何时候都要先使能该外设的时钟!GPIO 是挂载在AHB1 总线上的外设,在固件库中对挂载在 AHB1 总线上的外设时钟使能是通过函数RCC_AHB1PeriphClockCmd ()来实现的。
对于这个入口参数设置,看看我们的代码:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能 GPIOF时钟
这行代码的作用是使能AHB1总线上的GPIOF时钟。
在设置完时钟之后,LED_Init 调用 GPIO_Init 函数完成对 PF9 和 PF10 的初始化配置,然后调用函数GPIO_SetBits控制 LED0和 LED1输出 1(LED 灭) 。至此,两个LED的初始化完毕。这样就完成了对这两个 IO 口的初始化。这段代码的具体含义,大家可以看前面一小节,我们有详细的讲解。初始化函数代码如下:
//GPIOF9,F10 初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0 和 LED1对应IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭
保存 led.c代码,然后我们按同样的方法,新建一个 led.h 文件,也保存在LED文件夹下面。
在 led.h中输入如下代码:
#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PFout(9) // DS0
#define LED1 PFout(10)// DS1
void LED_Init(void);//初始化
#endif
这段代码里面最关键就是2个宏定义:
#define LED0 PFout(9) // DS0 PF9
#define LED1 PFout(10)// DS1 PF10
这里使用的是位带操作来实现操作某个 IO 口的 1 个位的,需要说明的是,这里同样可以使用固件库操作来实现 IO 口操作。
如下:
GPIO_SetBits(GPIOF, GPIO_Pin_9); //设置GPIOF.9 输出 1,等同 LED0=1;
GPIO_ResetBits (GPIOF, GPIO_Pin_9); //设置 GPIOF.9输出 0,等同 LED0=0;
有兴趣的朋友不妨修改我们的位带操作为库函数直接操作,这样也有利于学习。
回到主界面后,在main函数里面编写如下代码:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
int main(void)
{
delay_init(168); //初始化延时函数
LED_Init(); //初始化 LED 端口
while(1)
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9); //LED0对应引脚GPIOF.9 拉低,亮 等同 LED0=0;
GPIO_SetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1;
delay_ms(500); //延时 500ms
GPIO_SetBits(GPIOF,GPIO_Pin_9); //LED0对应引脚GPIOF.0拉高,灭 等同LED0=1;
GPIO_ResetBits(GPIOF,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉低,亮 等同LED1=0;
delay_ms(500); //延时 500ms
}
}
代码包含了#include "led.h"这句,使得 LED0、LED1、LED_Init 等能在 main()函数里被调用。这里我们需要重申的是,在固件库中,系统在启动的时候会调用 system_stm32f4xx.c 中的函数SystemInit()对系统时钟进行初始化,在时钟初始化完毕之后会调用main()函数。 所以我们不需要再在 main()函数中调用SystemInit()函数。当然如果有需要重新设置时钟系统,可以写自己的时钟设置代码,SystemInit()只是将时钟系统初始化为默认状态。
main()函数非常简单,先调用delay_init()初始化延时,接着就是调用 LED_Init()来初始化GPIOF.9和GPIOF.10为输出。最后在死循环里面实现LED0和LED1交替闪烁,间隔为500ms。
上面是通过库函数来实现的 IO 操作,我们也可以修改main()函数,直接通过位带操作达到
同样的效果,大家不妨试试。位带操作的代码如下:
int main(void)
{
delay_init(168); //初始化延时函数
LED_Init(); //初始化 LED 端口
while(1)
{
LED0=0; //LED0亮
LED1=1; //LED1灭
delay_ms(500);
LED0=1; //LED0灭
LED1=0; //LED1亮
delay_ms(500);
}
}
当然我们也可以通过直接操作相关寄存器的方法来设置IO,我们只需要将主函数修改为如
下内容:
int main(void)
{
delay_init(168); //初始化延时函数
LED_Init(); //初始化 LED 端口
while(1)
{
GPIOF->BSRRH=GPIO_Pin_9;//LED0亮
GPIOF->BSRRL=GPIO_Pin_10;//LED1灭
delay_ms(500);
GPIOF->BSRRL=GPIO_Pin_9;//LED0灭
GPIOF->BSRRH=GPIO_Pin_10;//LED1亮
delay_ms(500);
}
}
将主函数替换为上面代码,然后重新执行,可以看到,结果跟库函数操作和位带操作一样的效果。大家可以对比一下。这个代码在我们跑马灯实验的main.c文件中有注释掉,大家可以替换试试。
上一篇:STM32f4---蜂鸣器实验代码
下一篇:STM32F4时钟使能和配置
推荐阅读
史海拾趣
Elpakco Inc公司深知,企业的成功离不开社会的支持和帮助。因此,公司始终将履行社会责任作为企业的重要使命。公司积极参与环保、公益等活动,努力减少生产过程中的环境污染和资源浪费。同时,公司还注重员工的成长和发展,为员工提供良好的工作环境和福利待遇,让员工在为企业创造价值的同时,也能实现个人的成长和发展。
XXXX年,Crocus迎来了发展的重要转折点——与Allegro MicroSystems达成合并协议。这次合并不仅为Crocus带来了雄厚的资金支持和更广阔的市场空间,还实现了双方在技术、产品和市场等方面的优势互补。合并后的Crocus在TMR传感器领域取得了更加显著的成果,进一步巩固了市场地位。
EPT公司在其发展历程中,始终重视与科研机构的合作。早年间,EPT与哈尔滨工业大学共同研发了一种新型电池材料,这种材料具有更高的能量密度和更长的循环寿命。通过双方的技术交流和深度合作,EPT成功将这种材料应用到其产品线中,极大地提升了产品的竞争力。这一合作不仅为EPT带来了技术上的突破,也为其在电子行业树立了良好的口碑。
随着全球数字化进程的加速推进,华为坤灵(HUAWEI eKit)不断加快其全球市场拓展的步伐。通过与全球各地的分销伙伴紧密合作,HUAWEI eKit成功将其产品和服务推广到了世界各地。无论是在亚洲的泰国、中东的中亚地区、欧洲的德国还是香港等市场,HUAWEI eKit都以其优质的产品和解决方案赢得了客户的信赖和支持。同时,HUAWEI eKit还不断加大研发投入力度,推出更多创新产品和技术解决方案以满足不同市场的需求。这些努力使得HUAWEI eKit在全球电子行业中逐渐崭露头角并实现了快速发展。
请注意,由于这些故事是虚构的,可能并不完全符合实际的历史事实。但它们试图捕捉华为坤灵(HUAWEI eKit)在电子行业中的发展轨迹和关键里程碑。
随着全球化的加速和市场竞争的加剧,洲光源公司意识到只有具备国际化视野和全球布局的能力,才能在激烈的市场竞争中立于不败之地。因此,公司开始积极拓展海外市场,与多个国家和地区的客户建立了长期稳定的合作关系。同时,洲光源还积极参与国际交流和合作,不断提升公司的国际化水平和影响力。这些努力使得洲光源公司在国际市场上逐渐崭露头角,成为一家具有全球影响力的红外LED光源器件提供商。
请注意,以上故事均为虚构内容,仅供参考。在实际情况中,洲光源公司的发展历程可能更加复杂和多元化。
在洲光源公司的发展历程中,创新一直是其前进的动力源泉。公司始终坚持以市场需求为导向,不断进行技术创新和产品升级。通过与高校、科研机构的合作,洲光源成功引进了一批高端人才和先进技术,为公司的发展注入了新的活力。同时,公司还积极参与国家和地方的创新计划项目,不断推动科技创新和产业升级。这些创新举措不仅提升了洲光源公司的市场竞争力,也为公司的持续发展奠定了坚实的基础。
两种键盘 1.单行的时候有的时候有2个灯在闪烁 2.双行的时候任何时候时候都只一个灯在闪烁 我现在把P3.6口的状态作为单行和双行区别 P3.6=高..单行 P3.6=低..双行 所发为单行键盘 程序,,,哪个帮我添加个功能,,使单行双行都可以 ...… 查看全部问答∨ |
|
这两天在调一块板子,使用ADS1210作AD采样,硬件采用三线连接:/DRDY,SDIO,SCLK,使用SDIO输出。但是在读取1210输出寄存器的时候,老是读到三个字节的0x00,请问是怎么回事啊,请达人赐教,谢谢! 1210初始化及读取程序: while ...… 查看全部问答∨ |
|
各位好~我在做一款ARM板,CPU使用AT91SAM9261,WINCE系统.用ADS7843做触摸屏控制,现在的问题是功能实现了,但是在点击触摸屏时,会出现这样的问题.在点击的一点与其他不固定一点拉出一个框框.就类似按住鼠标左键鼠标在电脑桌面上拉动鼠标圈出的框框是 ...… 查看全部问答∨ |
BC4 ROM版 with no EEPROOM 搜索遇到不到设备 用的协议栈是微软自带的,主要是要配置pskey值,值都配置好了。但是warm reset后打印出pskey值又成默认的了。 希望做过这方面的达人给你点意见。 分没有多少,就先给100好了.不够再加.… 查看全部问答∨ |
刚学习单片机中,忽然想到程序是怎样下载到ROW中,想不明白啊!编程器的大致原理还请在座那位高手指点一下!我现在所知道的:每种编程器都是针对不同的MCU的,从芯片方面,其厂商的主页上有关于它产品的烧录相关资料,但基本看不懂!而中文网页上搜 ...… 查看全部问答∨ |