下面是我的程序,我想让一个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);
谢谢你,我现在弄明白了。原因其实很简单,就是我写错了一函数。并且使能了另外一个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学习态度非常认真,做好四轴直升机很有希望
retry++等的语句是超时用的,当判断了201次后,如果while语句还成立,则就超时返回了。
他们的返回值0可能表示当前的调用函数未成功。这是一种不至于使程序出错或卡死(有时程序是一个while(1))的处理方式,试想上述while判断语句一直是true那程序就卡死在这个API函数中了。
你是不是没用Cube啊?我并没有找到SPI_I2S_SendData()之类的API。你用Cube试试。
其它就不知道了,还得请amanda_s给讲解下。
bin哥你从事嵌入式开发的吗?
谢谢你的回答。这个while(1)我把它理解为一个等待函数,以前在51里面比如按键按下,等待按键松开用的就的就while();那在这里的话是等待发送寄存器清空,再把新的数据丢进去。但由于某些原因,这个过程不是绝对可靠。所以要加个retry++ if.......,不然有可能实际上tx寄存器已清空,但程序还在等待。。。。。。大哥你看我这样理解可以吧?
我以前做过MCU的FAE,支持过客户的的项目,不过主要是日系的MCU产品为主,比如78K0,H8,V850,SH系列
您好amanda。在我最近在学习spi。对spi也有了一定的了解了。但我想请问一下,往主机发送寄存器里面赋值了,但没有给从机的发送寄存器赋值。1开始数据传输之后,主机得到的返回数据将是一个什么情况啊?例如主机发送寄存器里是0xee,从机发送寄存器里是0xcc,那发送之后主机得到的返回值就是0xcc,那如果没有给从机寄存器赋值呢?那返回的是一个任意值还是说别的?2如果是只发,就直接把返回的数据忽略掉,只收的时候就不必在乎发送的是一个什么数据,只要有数据发送从而提供主机时钟就可以了?请问我这样的说法对吗?感谢