野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11701|回复: 1

【交作业】火哥指南者视频第7讲《使用寄存器点亮LED》作业:点亮其他颜色LED,闪烁LED

[复制链接]
发表于 2018-9-27 19:10:10 | 显示全部楼层 |阅读模式
本帖最后由 amengde 于 2018-9-27 19:08 编辑

【题外话】最近刚拿到指南者开发板,感觉火哥视频资料讲得特别好。特意开贴记录一下学习路程,有问题请指正哈,多谢!在第7讲,主要针对51单片机的编程惯例(寄存器编程),用stm32类比此流程进行编程,便于直观体会51与stm32的异同,快速从51进入stm32。
用51编程点亮LED时,由于reg52.h头文件内已经完成了寄存器映射,比如我们可以直接用P0,P1^1等寄存器别名直接使用IO口,并没有涉及繁琐的内存地址;
用stm32编程点亮LED时,此时并没有做寄存器映射的工作,因此,我们直接操作内存。

在指南者开发板上PB0----Green_LED,PB1----Blue_LED,PB5----Red_LED,因此我们要对GPIOB的第0、1、5号引脚进行操作。
与51区别的是,我们在控制stm32的IO时候并不是单纯的像51一样直接给用到的IO的寄存器内存置1或清0,比如:[mw_shl_code=c,true]#include<reg51.h>
sbit LED = P0^0;

void main()
{
     while(1)
     {
       LED = 1;//高电平点亮

     }

}

[/mw_shl_code]
而是要对几个寄存器进行处理:
RCC_APB2ENR(APB2外设时钟使能寄存器,打开GPIO端口的时钟),
GPIOX_CRL寄存器(端口配置低寄存器,4位一组,配置IO口为推挽输出),
GPIOX_ODR寄存器(端口输出数据寄存器,设置要控制的ODR位);
由于此处是为了类比51编程,所以直接操作寄存器对应的内存单元,具体地址参考stm32f10x系列中文手册。
以下为实现R,G,B三色循环点亮的程序,可更改延时参数改变闪烁频率,此处仅做实验之用,并没有对RGB进行组合实现其他颜色。
[例程][mw_shl_code=c,true]/**************stm32类比51编程流程进行操作点亮led并延时闪烁**********************/



#include"stm32f10x.h"//类比51,需要自行添加stm32f10x.h头文件
typedef unsigned int uint32_t;

#define __IO    volatile
#define DELAY Delay(0xfffff)//改变此参数,可改变闪烁频率


void Delay(__IO uint32_t nCount)         //简单的延时函数
{
        for(; nCount != 0; nCount--);
}


int main(void)
{
        while(1)
        {        
  
/*点亮PB0绿灯*/
        *(unsigned int*)0x40021018 |= ((1) << 3);//打开GPIO端口的时钟,即操作RCC_APB2ENR寄存器(APB2外设时钟使能寄存器)
        
        *(unsigned int*)0x40010c00 |= ((1) << (4*0));//配置IO口为推挽输出,即操作GPIOX_CRL寄存器(端口配置低寄存器,4位一组)
  
        *(unsigned int*)0x40010c0c &=~ (1 << 0);//设置ODR位,即操作GPIOX_ODR寄存器(端口输出数据寄存器)由于开发板PB0连接LED,因此操作GPIOB_ODR的第0位
   
                DELAY;
        *(unsigned int*)0x40010c00  &= ~( 0x0F<< (4*0));//清空控制PB0的端口位


/*点亮PB1蓝灯*/
  *(unsigned int*)0x40021018 |= ((1) << 3);//打开GPIO端口的时钟,即操作RCC_APB2ENR寄存器(APB2外设时钟使能寄存器)
        
        *(unsigned int*)0x40010c00 |= ((1) << (4));//配置IO口为推挽输出,即操作GPIOX_CRL寄存器(端口配置低寄存器,4位一组)
  
        *(unsigned int*)0x40010c0c &=~ (1 << 1);//设置ODR位,即操作GPIOX_ODR寄存器(端口输出数据寄存器)由于开发板PB1连接LED,因此操作GPIOB_ODR的第1位
  
                DELAY;
        *(unsigned int*)0x40010c00  &= ~( 0x0F<< (4));//清空控制PB1的端口位


/*点亮PB5红灯*/
  *(unsigned int*)0x40021018 |= ((1) << 3);//打开GPIO端口的时钟,即操作RCC_APB2ENR寄存器(APB2外设时钟使能寄存器)
        
        *(unsigned int*)0x40010c00 |= ((1) << (20));//配置IO口为推挽输出,即操作GPIOX_CRL寄存器(端口配置低寄存器,4位一组)
  
        *(unsigned int*)0x40010c0c &=~ (1 << 5);//设置ODR位,即操作GPIOX_ODR寄存器(端口输出数据寄存器)由于开发板PB5连接LED,因此操作GPIOB_ODR的第5位
  
          DELAY;
        *(unsigned int*)0x40010c00  &= ~( 0x0F<< (20));//清空控制PB5的端口位


  }

}


void SystemInit(void)
{
//函数体为空,目的是骗过编译器使其不报错

}

[/mw_shl_code]

评分

参与人数 1火花 +10 收起 理由
嘉嘉佳佳 + 10

查看全部评分

回复

使用道具 举报

发表于 2018-9-27 22:21:58 来自手机 | 显示全部楼层
不错不错
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-27 10:12 , Processed in 0.032711 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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