学前班
最后登录1970-1-1
在线时间 小时
注册时间2018-9-27
|
本帖最后由 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]
|
评分
-
查看全部评分
|