下面是我的程序,我想让一个led灯亮灭交替闪烁,然后我在MDK里面仿真的时候,这个IO口电平是会交替变化的,但我把程序写进stm32的时候,它就什么反应都没有了,请问这是为什么啊?麻烦各位帮帮忙看一下程序。
谢谢你们了。
#include <sys.h>
#include "stm32f10x_rcc.h"
#include "stm32f10x_flash.h"
#include "delay.h"
int main (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
delay_init();
delay_ms(10);
while(1)
GPIO_SetBits(GPIOD, GPIO_Pin_2);
delay_ms(100);
Hi Jonny,
请问你用的是哪一款STM32 MCU。硬件仿真平台是什么?
Best Regards,
Ben
Song Bin的回复太官僚了把?感觉你这种询问楼主的问题是无穷尽且实质性不强的,直至楼主失去信心。我想这也是本论坛比较冷清的原因之一吧!
我来简单跟楼主提出如下建议:
1.请确定你真是烧写成功了!如果不成功请注意烧写算法是否正确?
2.感觉你的延时函数不能看API接口是100ms就一定是100ms,PC仿真时CPU是GHz级别的,你的板子是MHz级别的,不能一概而论,请注意这个地方。
3.如果上述1、2都不行,你就单步调试,看问题到底出在何处!
Hi moyanming2013,
多谢你帮忙回复啊。
首先你谢谢你对我工作的指正,我今后要注意自己的发言,不好意思啊。
因为上次请Partner的朋友帮忙解决问题的时候,他们就提醒过我让我了解一下基本信息以后告诉他们,这样回答起来比较有的放矢。
所以我想先了解一下情况,不好意思。
本来是想提高工作效率的,不过的确有官僚主义的嫌疑,今后一定改正
另外我们很欢迎用户帮助用户,如果帮助用户回答问题多的朋友可以获得社区纪念品
嗯,了解客户的基本情况也很重要,可以先告知基本的解决思路,然后如果对方再需要进一步的信息就得先告知更详细的资料,这样可以循序渐进。
我想ST不可能去模拟用户的情况,然后再回复吧?这样周期太长,用户可能是一个非常简单的错误导致的,但周期长导致回复慢反而觉得问题总是得不到解决。
ST的工程师应该经验丰富些,首先就该用经验告知基本的解决思路比较好些。
是的,多谢你的建议,我觉得很有道理,能帮助别人解决问题,是最重要的,很多用户也是看得起我们社区才来提问的,所以我一直想让大家尽量都能收到满意的答复。
我以后只要是我知道的,肯定第一时间回复大家,肯定不会打太极拳。
但是我自己知识结构上也有很多欠缺的地方,有些我不是100%肯定的地方我就只能请别的工程师来帮忙了。因为我们内部自己给自己定的准则就是如果你不是这方面肯定懂,就不能乱答。
这点请见谅了。
这个问题和你提的问题,我已经请ST的amanda_s来帮忙看一下,希望给大家最好的回复。
hello 宋斌:
谢谢你的建议,我现在把问题搞明白了。我在配置RCC的时候有一函数写错了。而且设置GPIO的时候使能的跟我要用的不一样。我用的是stm32f103rc,keil mdk编写的。
我对自己犯这种低级错误其实也很无奈。这么说来MDK的仿真并不是完全靠谱的。
谢谢你,我现在弄明白了。原因其实很简单,就是我写错了一函数。并且使能了另外一个IO口,这自学stm32的路感觉不太好走呢,哈哈。
不好意思,最近比较忙。
知道你已经找到问题所在就好了。
在使能外设的时钟的时候,其实还有一个问题以后也要注意一下,初学者可能会忽略。
同一类外设在不同的芯片上并不都是挂在相同的总线上的。就算同一类外设,在同一个芯片型号上也有可能在不同的总线上,比如F1的定时器,就有在APB1上的,也有在APB2上的。
对应的寄存器不一样,调用的接口函数也不一样。
所以Song Bin问的也不能说是官僚了,多了解点用户的信息,对解决问题也有帮助。:)
有条件的话,还是搞块板子试比较好,仿真和实际在板子上跑还是不一样的。
多谢amanda_s帮忙,最近我们和ST合作很多,包括大学课程的设置,昨天我也发了博客,希望今后能和ST在在线平台有更多合作
我知道有多个定时器,而这多个定时器可能不是挂在相同的总线上,但是同一类型号的MCU应该定时器的数量、及其挂在的总线位置应该是相同的吧?因为一个系列的,比如STM32F4XX都是有相同的参考手册,里面讲述了定时器数量及挂载的位置,这个说的比较全面了,难道还有特殊的情况?
如果使用Cube里面的HAL层,然后使用相应的.H .C基本可以排除寄存器使用的错误吧?当然也会带来移植的便利性。
说前面那段话,是因为之前遇到过,有人在使能timer时钟时,只是简单的将例程的TIMx,换成了他想要的TIMy, 没有注意TIMy和TIMx并不在一条总线上,不能用同一个接口函数,因为他们需要操作的寄存器不一样。
你好amanda,我明白了,非常感谢你的回答。在之前,我看到了stm32f103_spi.c里面有SPI_I2S_SendData和SPI_I2S_ReceiveData这两个函数的。但是呢,在我买的开发板所带的例子里面,设计者并没有用stm32自带的收发程序哦,他用的是(如下),他还加上了一些别的语句。等待发送区清空之后为什么还搞个retry++呢,感觉像是一个延时似得,为什么还要return一个0哦。这我就不理解了。与SPI_I2S_SendData和SPI_I2S_ReceiveData就多了个判断嘛,那直接使用SPI_I2S_SendData和SPI_I2S_ReceiveData可以吗?哦,还有他们配置完spi之后还加了一句SPI_ReadWriteByte(0xff);的说什么提供八个时钟周期,又说可以不加这一句。我搞不懂为什么无缘无故给从设备传几个1过去,我10101010这样发不行吗?然后没有找到关于这一点的讲解。现在在疑惑当中。。。
u 8 SPIx_ReadWriteByte(u8 TxData)
u8 retry=0;
while((SPI1->SR&1<<1)==0)//等待发送区空
retry++;
if(retry>200)return 0;
SPI1->DR=TxData; //发送一个byte
retry=0;
while((SPI1->SR&1<<0)==0) //等待接收完一个byte
return SPI1->DR; //返回收到的数据
到今天为止我学习stm32已经有将近两个月了。我想做个四轴飞行器出来,感觉路还很长
加油加油,好的开始是成功的一半,我在2013年看到大学生电子竞赛中,很多同学用4天3夜时间制作了四轴自控飞行器,虽然飞的不稳,但是大部分都能成功起飞和降落。
我觉得LZ学习态度非常认真,做好四轴直升机很有希望