本人初学者,使用板子 f0discovery, 芯片号f051
想通过GPIO_SetBits与GPIO_ResetBits实现led的闪烁,现在发现GPIO_ResetBits不起作用
分别使用代码:
GPIO_SetBits(GPIOC, GPIO_Pin_9);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
与有延迟的代码:
for(i=1;i<30;i++)
{GPIO_SetBits(GPIOC, GPIO_Pin_9);}
for(i=1;i<30;i++)
{GPIO_ResetBits(GPIOC, GPIO_Pin_9);}
运行后,灯一直都是亮着并没有出现闪烁的效果为什么呢?如何解决?谢谢各位!
其GPIO初始化如下:
GPIO_InitTypeDef GPIO_InitS;
GPIO_InitS.GPIO_Pin = GPIO_Pin_9;
GPIO_InitS.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitS.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(GPIOC,&GPIO_InitS);
2
|
|
|
|
学习一下吧!!!!!!!!嵌入式培训www.arm8.net
|
|
|
|
|
开启了啊,没开启的话SetBit也运行不,LED也亮不了吧
|
|
|
|
|
本帖最后由 afox2001 于 2016-8-24 20:33 编辑
@曲终人散@ 发表于 2016-8-24 08:37
时钟开启了么,各种配置配置好了么
我干脆把整个代码贴上来吧
#include "stm32f0xx.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_flash.h"
#include "stm32f0xx_cec.h"
#include "stm32f0xx_gpio.h"
#include
void RCC_Config(void)
{
RCC_DeInit();
RCC_HSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) != SET) /* check out, if HSI ready */
{
}
FLASH_PrefetchBufferCmd(ENABLE);
FLASH_SetLatency(FLASH_Latency_1);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLKConfig(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); /* PLLCLK = HSI/2 * 16 = 64 MHz */
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) != SET) /* check out, if PLL ready */
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /* SYSCLK = PLLCLK = 64 MHz -> APB1 = 32 MHz, APB2 = 64 MHz */
while (RCC_GetSYSCLKSource() != 0x08) /* check out, if SYSCLK uses PLLCLK */
{
}
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitS;
GPIO_InitS.GPIO_Pin = GPIO_Pin_9;
GPIO_InitS.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitS.GPIO_Mode = GPIO_Mode_OUT;
/* GPIO_InitS.GPIO_OType = GPIO_OType_PP; */
GPIO_Init(GPIOC,&GPIO_InitS);
}
int main(void)
{
int i = 0;
while(1)
{
RCC_Config();
GPIO_Config();
while (1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_9);
/*
for(i=1;i<30;i++)
*/
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
}
}
}
|
|
|
|
|
你的程序有几个问题
1.头文件不需要包含这么多,只包含stm32f0xx.h就可以了,会自动连接其他头文件
2.据我所知,F0的时钟最高为48M,配置为64M就是超频使用,会不会出问题天知道了。其实你不需要配置时钟,在启动文件里调用了Systeminit()这个函数,已经把时钟配置好了,如果没有HSE则自动使用HSI,配置为48M
3.main里面的第一个while是多余的
4.GPIO_InitS.GPIO_OType = GPIO_OType_PP这句为什么要注释掉?推挽输出是正确的
5.你的第二个while(1)里面将IO拉高又马上拉低,LED等根本反应不过来的,你应该把延时弄长点,这样写 GPIO_SetBits(GPIOC, GPIO_Pin_9);
for(i=1;i<30000;i++);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
for(i=1;i<30000;i++);
|
|
|
|
|
meimengxing2014 发表于 2016-8-25 08:37
你的程序有几个问题
1.头文件不需要包含这么多,只包含stm32f0xx.h就可以了,会自动连接其他头文件
2.据我所知,F0的时钟最高为48M,配置为64M就是超频使用,会不会出问题天知道了。其实你不需要配置时钟,在启动文件里调用了Systeminit()这个函数,已经把时钟配置好了,如果没有HSE则自动使用HSI,配置为48M
首先,谢谢这位高手的详细解答,我又尝试了一下,有如下结果
1. 头文件那貌似就得用这么多,我看一下网络下的说法,都是说只要那个h文件就够了,但我这边不知道为什么,一直提示gpio或者是RCC的命令是错误的,一定要加上其他文件才没有了错误提示
2. 我刚又翻了一下文件....才发现我一直看的都是f1的说明,而不是f0.....你是对的,f0只有48M,还好这里gpio用的引脚连接的都是APB1的主线,也就是32M,所以没有什么问题,为了其他地方不出问题,我把这个地方改了,而Systeminit这个命令我在网上也见过,但我这边用的时候keil会提示说,这个命令在C99里是无效的,为什么呢?
3. 已改
4. 我初学,为什么说这里推挽是正确的呢?看网上的说明也似懂非懂,能说明一下吗?谢谢
5. 按你的方案我修改了一下我的程序,发现没什么变化,后来我改成3000000,终于能用了....谢谢!
|
|
|
|
|
1.如果你用的F1,那GPIO就不是这么配置的,F1的固件库名字为STM32F10x_StdPeriph_Lib_V3.5.0,GPIO是这么配置的 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
你那种配置我见过的是在F0和F4中配置的。
2.关于头文件的问题,你再看下,F1的固件库里有个文件stm32f10x_conf.h已经包含了所有的外设头文件了
3.Systeminit()不是命令,是一个配置时钟的函数,在system_stm32f10x.c文件中,在启动文件(.s)中该函数被调用,意思就是只要你启动程序,就自动调用,自动开启时钟。看看是不是你的启动文件有问题,启动文件F1的为startup_stm32f10x_md.s(flash中等容量的),startup_stm32f10x_hd.s(flash大容量的)等
4.你看下STM32的几种输出,然后在网上查查推挽、开漏、复用输出等作用,先记住用法,然后在用的过程中慢慢体会,我以前也是这么做的
5.我怀疑你的工程有问题,或是keil的配置有问题,或是库文件用错了,你再好好查查看。关于stm32几乎所有的问题都可以在网上查到。我也是刚学没多久,根本配不上你说的“高手”
|
|
|
|
|
哦,我突然想起来了,你用的F1为什么会包含F0的头文件?
|
|
|
|
|
不是,我用的是f0,但是我拿错了f1的说明书,所以设置了64MHz。。。
现在网上大部分教程都是用f1做例子,开发板也是f1多,f0的资料没多少,用的人感觉没几个,所以有时候就拿f1的资料当参考了
|
|
|
|
|
F1和F0差不多,我们公司用的F072,你在网上找找,F0的资料也不少,上次我传了一份F0的英文资料到百度,你可以去看看
|
|
|
|
|
没事的,我当时学习的时候也有很多人帮助我,所以我也愿意帮助别人
|
|
|
|
|
好的!
|
|
|
|
|
GPIO_SetBits(GPIOC, GPIO_Pin_9);
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
这两句代码中间,加上一句延时代码,就可以了;
GPIO_SetBits(GPIOC, GPIO_Pin_9);
Delay(300);//具体的延时函数自己编写
GPIO_ResetBits(GPIOC, GPIO_Pin_9);
|
|
|
|
|