下面是我的程序,我想让一个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);
我知道有多个定时器,而这多个定时器可能不是挂在相同的总线上,但是同一类型号的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; //返回收到的数据
retry++等的语句是超时用的,当判断了201次后,如果while语句还成立,则就超时返回了。
他们的返回值0可能表示当前的调用函数未成功。这是一种不至于使程序出错或卡死(有时程序是一个while(1))的处理方式,试想上述while判断语句一直是true那程序就卡死在这个API函数中了。
你是不是没用Cube啊?我并没有找到SPI_I2S_SendData()之类的API。你用Cube试试。
其它就不知道了,还得请amanda_s给讲解下。
谢谢你的回答。这个while(1)我把它理解为一个等待函数,以前在51里面比如按键按下,等待按键松开用的就的就while();那在这里的话是等待发送寄存器清空,再把新的数据丢进去。但由于某些原因,这个过程不是绝对可靠。所以要加个retry++ if.......,不然有可能实际上tx寄存器已清空,但程序还在等待。。。。。。大哥你看我这样理解可以吧?
您好amanda。在我最近在学习spi。对spi也有了一定的了解了。但我想请问一下,往主机发送寄存器里面赋值了,但没有给从机的发送寄存器赋值。1开始数据传输之后,主机得到的返回数据将是一个什么情况啊?例如主机发送寄存器里是0xee,从机发送寄存器里是0xcc,那发送之后主机得到的返回值就是0xcc,那如果没有给从机寄存器赋值呢?那返回的是一个任意值还是说别的?2如果是只发,就直接把返回的数据忽略掉,只收的时候就不必在乎发送的是一个什么数据,只要有数据发送从而提供主机时钟就可以了?请问我这样的说法对吗?感谢