OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3779|回复: 3

[miniF103] 分享:mini板子地址操作跑马灯

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-12-6 18:54:51 | 显示全部楼层 |阅读模式
本帖最后由 1208 于 2019-11-7 17:40 编辑

参考中文参考手册
思路:
1)要先打开AHB的APB2使能时钟
2)端口配置CNFO[1:0]和MODE0[1:0]模式,如推挽模式和输出速度,控制GPIOx_CRL寄存器
3)端口输出模式,如拉低电平,控制GPIOx_ODR寄存器
方法:
以GPIOD为例
通过存储映像找到AHB的0x4002 1000,再对应找到APB2ENR时钟的偏移地址: 0x18,即0x40021018
通过GPIOx_CRL寄存器,先找到存储映像GPIOD的0x4001 1400 ,选择低位GPIOx_CRL寄存器的偏移地址: 0x00,即0x40011400
QQ截图20181208203327.png
控制GPIOx_ODR 寄存器,先先找到存储映像GPIOD的0x4001 1400,选择GPIOx_ODR 寄存器的地址偏移: 0C,即0x4001140C
QQ截图20181206185111.png
总结:
1)置位 |=,  清0  &=~
2) *( unsigned int * )指编译器要把它看做地址,强制的数据类型转换,加*表示指针,括号外加*识别指针操作
3)( (1) << 5 )指1左移5位, &=  ~( (0x0f) << (4*2) )指CNFO[1:0]和MODE0[1:0]左移4*2=8位,先变为1,后面取为0,即都置0
[mw_shl_code=c,true]int main (void)
{
    //PD2亮
    // 打开 GPIOD 端口的时钟
    *( unsigned int * )0x40021018 |=  ( (1) << 5 ); //打开RCC的APB2
      
    // 配置IO口为输出 低寄存器控制着低八位 16个IO ,CNFO[1:0]和MODE0[1:0]控制着一个IO口
    *( unsigned int * )0x40011400 &=  ~( (0x0f) << (4*2) );  // CNFO[1:0]和MODE0[1:0]都置0,
    *( unsigned int * )0x40011400 |=  ( (3) << (4*2) );     //推挽输出模式CNFO[1:0]=00,MODE0[1:0]=11 ,0011代表2进制,即第0位,以4个为一组
                                                           
    // 控制 ODR 寄存器   1左移0位 ,是到GPIOD的位置
    *( unsigned int * )0x4001140C &= ~(1<<2);      //端口数据ODR,PD2由ODR2控制,这个位写0
                                                   //输出低电平  
     
   
    //GPIOA 时钟  PA8亮
    *( unsigned int * )0x40021018 |=  ( (1) << 2 );
   
    // 配置IO口为输出  高寄存器控制着高八位
    *( unsigned int * )0x40010804 &=  ~( (0x0f) << (4*0) );  // 置0
    *( unsigned int * )0x40010804 |=  ( (1) << (4*0) );
   
    // 控制 ODR 寄存器 GPIOA.8
    *( unsigned int * )0x4001080C &= ~(1<<8);      //低电平
}[/mw_shl_code]
QQ截图20181206185027.png

MINISTM32 地址操作跑马灯.zip

2.49 MB, 下载次数: 26

业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2018-12-26 20:44:07 | 显示全部楼层
//IO方向设置
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}    输入
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}  输出
//IO操作函数         
#define IIC_SCL    PBout(6) //SCL
#define IIC_SDA    PBout(7) //SDA         
#define READ_SDA   PBin(7)  //输入SDA
GPIOB->CRL&=0X0FFFFFFF;这句这样写的目的是将28-31的引脚清零,好进行操作赋值
GPIOB->CRL|=(u32)8<<28指将原来的位置CNF0[1:0]和MODE0[1:0]通过左移28位到CNF7[1:0]和MODE7[1:0],8二进制1000代表CNF0[1:0]=10,MODE0[1:0]=00,即输入模式的上拉方式
GPIOB->CRL|=(u32)3<<28指3的二进制0011代表CNF0[1:0]=00,MODE0[1:0]=11对应位29:28的输出模式,最大速度50MHz
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2018-12-7 13:44:23 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2018-12-10
在线时间
0 小时
发表于 2018-12-10 14:45:24 | 显示全部楼层
谢谢分享,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 22:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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