你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f072 NUCLEO I/O口寄存器直接操作编程!

[复制链接]
大秦正声 发布时间:2015-1-6 12:44
点亮PA5引脚的LED。
软件用IAR 7.2
/*
stm32f072 nucleo  test program
m0 最小系统测试程序
不需要头文件和库函数,很小巧实用!
用于I/o口翻转频率测试、跑马灯演示!
作者: 大秦正声,小电子
日期: 2014.12.21
博客:  
http://yang96381.blog.163.com
邮箱:    yang96381@163.com
*/


#define DELAY_COUNT    0xfFFFF
unsigned long dat;
void Delay( long int Count)
{
   for(; Count!= 0;Count--);
}
int main(void)
{
      *(long*)0x40021014=0x007e0014;//A i/0口使能
    *(long*)0x48000000=0x28555555;//输出
  
   *(long*)0x48000008=0x0cffffff;//high speed
   *(long*)0x4800000c=0x24555555;//上拉

   
   while(1)
   {*(long*)0x48000014=0xffff;//高
   Delay(DELAY_COUNT);///延时,翻转测试不用
  *(long*)0x48000014=0x0;//低
Delay(DELAY_COUNT);///延时,翻转测试不用
   }
}

收藏 评论21 发布时间:2015-1-6 12:44

举报

21个回答
大秦正声 回答时间:2015-1-6 14:24:20
本帖最后由 大秦正声 于 2015-1-6 14:29 编辑

新版本
/*
stm32f072 nucleo  test program
m0 最小系统测试程序
不需要头文件和库函数,很小巧实用!
用于I/o口翻转频率测试、跑马灯演示!
作者: 大秦正声,小电子
日期: 2015.1.6
博客:  http://yang96381.blog.163.com
邮箱:    yang96381@163.com
*/



#define DELAY_COUNT    0xFFFFF
#define PA_OUT *(long*)0x48000014
#define PA_SPEED *(long*)0x48000008
#define RCC_AHBENR *(long*)0x40021014
#define PA_MODER *(long*)0x48000000
void Delay( long int Count)
{
     for(; Count!= 0;Count--);
}
int main(void)
{
      RCC_AHBENR=0x007e0014;//A i/0口使能
      PA_MODER =0x28555555;//输出
   
     PA_SPEED=0x0cffffff;//high speed
   
   
     while(1)
     {PA_OUT=0xffff;//高
     Delay(DELAY_COUNT);///延时,翻转测试不用
    PA_OUT=0x0000;//低
Delay(DELAY_COUNT);///延时,翻转测试不用
     }
}
qianfan 回答时间:2015-1-6 17:14:05
大秦正声 发表于 2015-1-6 16:16
已经把地址改成PA_OUT等
就是不标准

像你说的这样,GPIOA->ODR,DDR,。。。是不是都需要使用宏声明一下?
而在官方的头文件中,只需要使用结构体的自动偏移就行了。
这样在传递参数的时候更方便。就像WriteBits,只需要传递一个GPIOA就行了,其余的比如ODR都可以知道,而像你这种方式,ODR,IDR等等寄存器的地址都需要手动计算
qianfan 回答时间:2015-1-6 17:10:42
我是酱油哥 发表于 2015-1-6 16:39
问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下
谢了啊 ...

将地址转换成指针访问:
比如:将内存是0XA000_0000处的值写成100:
*((volatile uint32_t *)0XA000_0000)=100;
千万不要在windows上面实验这样的代码,因为他们有内存保护。
大秦正声 回答时间:2015-1-6 13:01:30
欢迎大家指正!
qianfan 回答时间:2015-1-6 13:07:19
这样访问内存好任性,就不能直接使用GPIOx吗?
大秦正声 回答时间:2015-1-6 13:27:15
QianFan 发表于 2015-1-6 13:07
这样访问内存好任性,就不能直接使用GPIOx吗?

谢谢!程序的可读性有待提高!好处是输出速度提高了!
qianfan 回答时间:2015-1-6 13:29:11
大秦正声 发表于 2015-1-6 13:27
谢谢!程序的可读性有待提高!好处是输出速度提高了!

如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。
说是速度提高了,应该是直接访问寄存器和库函数相比,速度应该提高
大秦正声 回答时间:2015-1-6 13:52:06
QianFan 发表于 2015-1-6 13:29
如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。
说是速度提高了,应该是直接访问寄 ...

说的对!
大秦正声 回答时间:2015-1-6 14:36:52
QianFan 发表于 2015-1-6 13:07
这样访问内存好任性,就不能直接使用GPIOx吗?

已经修改了!
qianfan 回答时间:2015-1-6 15:02:09

这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了
大秦正声 回答时间:2015-1-6 15:06:36
QianFan 发表于 2015-1-6 15:02
这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了 ...

可读性提高了啊
qianfan 回答时间:2015-1-6 15:08:19

。。。万一哪天你忘记了ODR的地址怎么办
或者你把ODR的地址写错了怎么办?
大秦正声 回答时间:2015-1-6 16:16:55
QianFan 发表于 2015-1-6 15:08
。。。万一哪天你忘记了ODR的地址怎么办
或者你把ODR的地址写错了怎么办? ...

已经把地址改成PA_OUT等
就是不标准
我是酱油哥 回答时间:2015-1-6 16:39:53
问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下
谢了啊
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版