找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6198|回复: 9
打印 上一主题 下一主题
收起左侧

STM32 LED灯闪烁程序无错但没有闪烁效果

[复制链接]
跳转到指定楼层
楼主
ID:371529 发表于 2019-7-15 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我写的程序

#include "stm32f10x.h"

typedef unsigned int u16;

void delay(u16 i)
{
        while(i--);       
}

int main (void)//亮蓝光
{
        #if 0   //条件编译屏蔽此部分代码
        //打开GPIOB端口的时钟
  *(unsigned int*)0x40021018 |=((1)<<3);
       
        //配置IO口为输出
  *(unsigned int*)0x40010C00 |=((1)<<(4*1)); //置1操作,10进制的1
       
        //控制ODR寄存器 PB1
        *(unsigned int*)0x40010C0C &=~(1<<1);//清零操作

       
        #else
       
        //打开GPIOB端口的时钟
        RCC_APB2ENR  |=((1)<<3);
       
        //配置IO口为输出
        GPIO_CRL &=~((0x0f)<<(4*1)); // 将原状态全部清零
        GPIO_CRL |=((1)<<(4*1));
       
        //控制ODR寄存器 PB1
        while(1)
        {
        GPIO_ODR  &=~(1<<1); //亮
          delay(500000);
        GPIO_ODR  &=~(0<<1);//灭
                 delay(500000);
        }
       
        #endif
}




void SystemInit(void)//start_stm32f10x_hd.s中启动汇编时调用了SystemInit
{

}


不知道哪里有问题,编译无错误无警告,但烧入单片机中却仍只亮灯不闪烁。求解答。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

来自 3#
ID:388197 发表于 2019-7-16 00:47 | 只看该作者
建议还是用库函数吧,现在HAL库结合CUBE,一些基本的设置代码都是机器生成了,作为学习者重点只需要放在了解相关概念即可,花费大量精力去死记硬背这些东西根本不值得,我到现在,32最基本的配置个IO口,如果我不查资料不复制,就算使用库函数,直接用键盘敲估计我都敲不出来.更不要说配置其他的,但这根本不影响我使用32,只要我看看例程,我就知道我改哪里就能达到我需要的效果,然后直接复制即可,或者干脆整理下,下次直接#include,学习单片机,没有任何东西是需要死记硬背的,虽然学习的时候看下寄存器是好事,但是实际中,这种代码可读性太差了,不要说别人写的,就算自己写的,隔个几天再看也难看懂,就算要写寄存器风格的,起码也写在函数里,然后函数名用个一看就懂的名字(其实库函数也是这么干的),实际项目也远非点亮个LED这么简单.你试想你拿到几千上万行这种风格的代码会是如何感受?对于寄存器,当故事书一样,看一看即可.初学32,多半是51过来的,建议你试试把以前51的代码,移植过来,这既能帮你复习以前掌握的,又能对你初步了解32起一定帮助作用.
回复

使用道具 举报

沙发
ID:584691 发表于 2019-7-15 20:47 | 只看该作者
没有运行那部分代码
回复

使用道具 举报

地板
ID:371529 发表于 2019-7-16 09:01 | 只看该作者
cjm82 发表于 2019-7-16 00:47
建议还是用库函数吧,现在HAL库结合CUBE,一些基本的设置代码都是机器生成了,作为学习者重点只需要放在了解相 ...

嗯嗯好的,非常感谢您的回复!
回复

使用道具 举报

5#
ID:123289 发表于 2019-7-16 09:57 | 只看该作者
即然“程序无错”,就应该是天气不好,天运来了就好了。
回复

使用道具 举报

6#
ID:584881 发表于 2019-7-16 10:13 | 只看该作者
抱歉,兄弟,我学的是库函数板,而且还没学几天
回复

使用道具 举报

7#
ID:424805 发表于 2019-7-16 10:20 | 只看该作者
我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR。
void LED_Init(void) {  RCC->APB2ENR|=1<<3;    //使能 PORTB 时钟        RCC->APB2ENR|=1<<6;    //使能 PORTE 时钟         GPIOB->CRL&=0XFF0FFFFF;   GPIOB->CRL|=0X00300000;//PB.5 推挽输出          GPIOB->ODR|=1<<5;      //PB.5 输出高             GPIOE->CRL&=0XFF0FFFFF;  GPIOE->CRL|=0X00300000;//PE.5 推挽输出  GPIOE->ODR|=1<<5;      //PE.5 输出高  }  
回复

使用道具 举报

8#
ID:73666 发表于 2019-7-16 11:00 | 只看该作者
GPIO_ODR  &=~(1<<1); //亮           delay(500000);         GPIO_ODR  &=~(0<<1);//灭
回复

使用道具 举报

9#
ID:73666 发表于 2019-7-16 11:00 | 只看该作者
  1. GPIO_ODR  &=~(1<<1); //亮
  2. delay(500000);
  3. GPIO_ODR  &=~(0<<1);//灭
复制代码

这是什么鬼
回复

使用道具 举报

10#
ID:371529 发表于 2019-7-17 16:53 | 只看该作者
感谢各位,现已解决,附代码见下。
啊吐槽一句32果然比51复杂多了,配置寄存器真是脑壳疼。

#include "stm32f10x.h"//从底层学习
#include "stm32f10x_gpio.h"//从头文件中调用函数

typedef unsigned int u16;
void delay(u16 i)
{
        while(i--);       
}

//此为工程模版

int main (void)//亮蓝光
{
        #if 0
       
        //打开GPIOB端口的时钟
  RCC_APB2ENR  |=((1)<<3);
       
        //配置IO口为输出
  GPIO_CRL &=~((0x0f)<<(4*1)); // 将原状态全部清零
        GPIO_CRL |=((1)<<(4*1));
       
        //控制ODR寄存器 PB1
       
   #elif 0
               
        //打开GPIOB端口的时钟
  RCC->APB2ENR  |=((1)<<3);
       
        //配置IO口为输出
  GPIOB->CRL &=~((0x0f)<<(4*1)); // 将原状态全部清零
        GPIOB->CRL |=((1)<<(4*1));//置1操作,10进制的1  0001
       
        //控制ODR寄存器 PB1
        GPIOB->ODR  &=~(1<<1);//清零操作
       
        #elif 1
        GPIO_InitTypeDef  GPIO_InitStructure;//变量定义位于函数开头,靠近大括号
       
//  GPIO_InitStructure.GPIO_Pin        =GPIO_Pin_0;
//  GPIO_InitStructure.GPIO_Mode        =GPIO_Mode_OUT_PP;
//        GPIO_InitStructure.GPIO_Speed        =GPIO_Speed_50MHz;
//        //配置好后将这些值写入寄存器中 此时调用GPIO_Init函数
//        GPIO_Init( GPIOB, &GPIO_InitStructure);//变量取地址用&

/*需要先打开时钟再配置IO口,否则无反应*/

    //打开GPIOB端口的时钟
  RCC->APB2ENR  |=((1)<<3);
       
   GPIO_InitStructure.GPIO_Pin        =GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode        =GPIO_Mode_OUT_PP;
        GPIO_InitStructure.GPIO_Speed        =GPIO_Speed_50MHz;
        //配置好后将这些值写入寄存器中 此时调用GPIO_Init函数
        GPIO_Init( GPIOB, &GPIO_InitStructure);//变量取地址用&
       
  //置位取1,灯灭
  GPIO_SetBits(GPIOB,GPIO_Pin_5);//传入第一个形参GPIOB,5脚亮红光   
  
  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
       
        while (1)
        {
        GPIO_SetBits(GPIOB,GPIO_Pin_5);
                delay(0xFFFF);
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    delay(0xFFFF);               
        }
       
       
    #endif
}




void SystemInit(void)//start_stm32f10x_hd.s中启动汇编时调用了SystemInit
{
  //函数体为空,目的是为了骗过编译器不报错
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表