4223|2

2781

帖子

417

TA的资源

五彩晶圆(中级)

楼主
 

【晒心得】STM32F03开发板--点亮LEDS(寄存器操作) [复制链接]

昨天在CoIDE环境下使用固件库写的程序,今天想用一下操作寄存器的方法,跟51msp430单片机一样配置寄存器。
STM32F0308开发-LED的电路图:
从图中可以看出两个发光二极管负极接地,那么要点亮LED,只需要将STM32PC8PC9的相应引脚上输出高电平。
那怎么设置才能输出高电平呢,先来看一下数据手册:第8General-purpose I/Os (GPIO))
GPIOx_MODER:端口模式选择寄存器。有4中模式:输入模式、通用输出模式、复用功能模式、模拟输入模式。
Bits 2y+1:2yMODERy[1:0]:Port x configuration bits (y = 0..15)可知,y的取值范围为0~15,正好16个引脚,每个引脚由两个位控制(2y+1:2y)。
GPIOx_OTYPER:端口输出类型寄存器。有两种类型,Output push-pull推挽式输出),Output open-drain(开漏输出)。
关于两者的区别这里就不详细解释了,网上也有详细的说明。
GPIOx_OSPEEDR:端口输出速度寄存器。个人理解为引脚响应的速度。有低速、中速、高速三种速度。
GPIOx_ODR:端口输出数据寄存器。顾名思义,输出1即高电平。
GPIOx_BSRR:端口置位/复位寄存器。低16位是置位寄存器,高16位是复位寄存器。
这里需要注意的是,寄存器写1有效。
其他的寄存器暂时用不到,就不介绍了。
下面开始编写用寄存器控制LED的程序了!
CoIDE下步骤如下:


程序代码:
  1. #define GPIOC_MODER   (*(volatile unsigned int *)0x48000800) //端口配置模式寄存器
  2. #define GPIOC_OTYPER  (*(volatile unsigned int *)0x48000804) //端口配置类型寄存器
  3. #define GPIOC_OSPEEDR (*(volatile unsigned int *)0x48000808) //端口配置速度寄存器
  4. #define GPIOC_ODR     (*(volatile unsigned int *)0x48000814) //端口配置输出数据寄存器
  5. #define RCC_AHBENR    (*(volatile unsigned int *)0x40021014) // 端口时钟寄存器
  6. /* 简单延时函数*/
  7. void delay(void)
  8. {
  9.         unsigned int i;
  10.         for(i=0;i<500000;i++);
  11. }
  12. /* 主函数*/
  13. int main()
  14. {
  15.         int i;
  16.         /*打开 GPIOC 的时钟*/
  17.         RCC_AHBENR |= 1<<19;
  18.         /* 配置PC8,PC9为输出模式*/
  19.         GPIOC_MODER = (GPIOC_MODER & 0xfff0ffff) | 0xfff5ffff;
  20.         /* 配置PC8,PC9速度为 高速*/
  21.         GPIOC_OSPEEDR = 0xffffffff;
  22.         /* 配置 PC8,PC9 为通用推挽模式*/
  23.         GPIOC_OTYPER = (GPIOC_OTYPER & 0xf0ff ) | 0xfcff;
  24.         while(1)
  25.         {
  26.                 for(i=8;i<=9;i++)
  27.                 {
  28.                         /* 在 PC8,PC9引脚轮流输出高电平 */
  29.                         GPIOC_ODR = (GPIOC_ODR & 0xf0ff) | (1<
  30.                         delay();
  31.                 }
  32.         }
  33. }
复制代码
程序中的宏定义怎么弄呢?其实很简单,查看数据手册:
首先要明确GPIOC的时钟总线在哪儿:
GPIOC的起始地址:0x48000800
再看数据手册的第8章相关寄存器的详细部分:拿寄存器GPIOx_OSPEEDR举例

途中偏移地址为0x08,那么我们可以定宏:
#define GPIOC_OSPEEDR (*(volatile unsigned int *)0x48000800 + 0x08)
至于为什么要这样定义,看C语言吧。
此帖出自stm32/stm8论坛

最新回复

学习了, 感谢分享  详情 回复 发表于 2013-11-17 00:04
点赞 关注(1)
个人签名
 

回复
举报

2781

帖子

417

TA的资源

五彩晶圆(中级)

沙发
 
【晒心得】STM32F0308开发板--点亮LEDS(寄存器操作).pdf (714.75 KB, 下载次数: 18)
此帖出自stm32/stm8论坛
 
个人签名
 

回复

662

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
学习了, 感谢分享
此帖出自stm32/stm8论坛
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表