C stm32f103板不闪烁

C stm32f103板不闪烁,c,embedded,stm32,gpio,C,Embedded,Stm32,Gpio,我不能让我的新stm32f103c8t6板闪烁一个简单的led。我什么都试过了。我已经将裸机直接写入寄存器,也使用了GPIO库,但它仍然不起作用。我在用凯尔。我的led连接在一个1k电阻的试验板上。我还测试了输出引脚上的电压,但它并不重要。请问有什么问题?下面的代码 #include "stm32f10x.h" GPIO_InitTypeDef GPIO_InitStructure; void delay(int a) { for (int i = 0; i < a; i++)

我不能让我的新stm32f103c8t6板闪烁一个简单的led。我什么都试过了。我已经将裸机直接写入寄存器,也使用了GPIO库,但它仍然不起作用。我在用凯尔。我的led连接在一个1k电阻的试验板上。我还测试了输出引脚上的电压,但它并不重要。请问有什么问题?下面的代码

#include "stm32f10x.h"

GPIO_InitTypeDef GPIO_InitStructure;

void delay(int a)
{
    for (int i = 0; i < a; i++)
    {

    }

}
int main(void)
{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, 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);

    /* To achieve GPIO toggling maximum frequency, the following  sequence is mandatory. 
     You can monitor PD0 or PD2 on the scope to measure the output signal. 
     If you need to fine tune this frequency, you can add more GPIO set/reset 
     cycles to minimize more the infinite loop timing.
     This code needs to be compiled with high speed optimization option.  */
    while (1)
    {
        /* Set PD0 and PD2 */
        GPIOA->BSRR = 0x00000005;
        delay(1000000);
        /* Reset PD0 and PD2 */
        GPIOA->BRR = 0x00000005;
        delay(1000000);

    }
}
#包括“stm32f10x.h”
GPIO_InitTypeDef GPIO_InitStructure;
无效延迟(INTA)
{
for(int i=0;iBSRR=0x00000005;
延迟(1000000);
/*重置PD0和PD2*/
GPIOA->BRR=0x00000005;
延迟(1000000);
}
}
几个选项:

错误的延迟实现和编译器优化代码输出:

void delay(volatile int a) {
    //Added volatile in a and in i
    for (volatile int i = 0; i < a; i++);
}
void延迟(volatile int a){
//在a和i中添加挥发性物质
for(volatile int i=0;i

与您的情况一样,初始化错误。您初始化了
GPIOD
,但使用了
GPIOA

几个选项:

错误的延迟实现和编译器优化代码输出:

void delay(volatile int a) {
    //Added volatile in a and in i
    for (volatile int i = 0; i < a; i++);
}
void延迟(volatile int a){
//在a和i中添加挥发性物质
for(volatile int i=0;i

与您的情况一样,初始化错误。您初始化了
GPIOD
但使用了
GPIOA

您初始化了
GPIOD
但使用的是
GPIOA
…由于优化器的原因,延迟函数可能不会生成代码。顺便说一句,这不是延迟的方式……是的,我纠正了GPIOD错误仍然不起作用1)STlib/HAL只是臃肿的软件。它没有优点,但有许多缺点。不要用它。2)
延迟
可能无效。3) 为硬件的初始测试从调试器中写入寄存器。很抱歉,Olaf,但是在您的生活中似乎存在一些真正的编程问题。或者,如果您这么说,您从未使用过此选项。您初始化了
GPIOD
,但您使用的是
GPIOA
…由于优化器的原因,您的延迟函数可能不会生成代码。顺便说一句,这不是延迟的方式……是的,我纠正了GPIOD错误仍然不起作用1)STlib/HAL只是臃肿的软件。它没有优点,但有许多缺点。不要用它。2)
延迟
可能无效。3) 为硬件的初始测试从调试器中写入寄存器。很抱歉,Olaf,但是在您的生活中似乎存在一些真正的编程问题。或者,如果您这么说的话,您从来没有使用过这个。使用
GPIO\u WritePin
函数进行测试,而不是直接进行寄存器写入。由于启用了GPIOA时钟,请确保使用GPIOA。是的,gpio问题解决了,但延迟不起作用,延迟功能可能有什么问题?我试过了,但没有,在for循环之后是否有任何问题?\@ched:STM32配备了硬件计时器,Cortex-M也有一个核心系统时钟,这两个时钟中的任何一个都比一个简单的忙循环更好、更准确。@tilz0R:“…如果时钟设置为它应该的样子。”-你怎么知道这种特殊设计的时钟频率是多少?STM32支持多个时钟源,PLL可编程为宽范围。设计可能出于各种原因使用特定频率,例如USB时钟精度、EMC兼容性、节能或使用与其他设备共享的振荡器。最终,您不知道循环将花费多长时间,并且需要针对代码所使用的每个新设计进行调整。不幸的是,这是一个常见但不明智的习惯用法。使用
GPIO\u WritePin
函数进行测试,而不是直接进行寄存器写入。由于启用了GPIOA时钟,请确保使用GPIOA。是的,gpio问题解决了,但延迟不起作用,延迟功能可能有什么问题?我试过了,但没有,在for循环之后是否有任何问题?\@ched:STM32配备了硬件计时器,Cortex-M也有一个核心系统时钟,这两个时钟中的任何一个都比一个简单的忙循环更好、更准确。@tilz0R:“…如果时钟设置为它应该的样子。”-你怎么知道这种特殊设计的时钟频率是多少?STM32支持多个时钟源,PLL可编程为宽范围。设计可能出于各种原因使用特定频率,例如USB时钟精度、EMC兼容性、节能或使用与其他设备共享的振荡器。最终,您不知道循环将花费多长时间,并且需要针对代码所使用的每个新设计进行调整。不幸的是,这是一个常见但不明智的成语。