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

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

[复制链接]
大秦正声 发布时间:2015-1-6 12:44
点亮PA5引脚的LED。6 C( V+ [5 g. @& [& c. ~0 }. ^
软件用IAR 7.2
0 r: b: q' u! N/*
3 Y! B: T. @. r8 ~+ ]4 t; _ stm32f072 nucleo  test program4 {, [- d* k1 W$ z& Z& l, @- {
m0 最小系统测试程序$ t' T- b1 s- j* e- _
不需要头文件和库函数,很小巧实用!) H; f0 Y; z, }- p
用于I/o口翻转频率测试、跑马灯演示!
) o0 Y5 _# I* I 作者: 大秦正声,小电子
9 j  R! H& m1 n5 o9 i 日期: 2014.12.21
. g9 M9 B' I6 E博客:  
http://yang96381.blog.163.com
1 v7 T( O+ X3 h3 j% ]/ I邮箱:    yang96381@163.com
3 `: f+ [( a4 y) `" C */
% |$ t- b0 E+ D& @( z# T: f# Y8 @3 l5 r5 m+ F5 f* U: j3 p  I
7 s; ?% y- o/ ~( z
#define DELAY_COUNT    0xfFFFF
$ f9 Q! }3 D- d) [# M/ V  F unsigned long dat;# t- O; C; m1 g- M! ~
void Delay( long int Count), @8 N* ~( n4 }3 D, O
{
5 W. `3 r" z8 C- k2 x$ r. R: B+ m% J   for(; Count!= 0;Count--);  D% F3 m# n2 N
}" @: s! T4 p( s: c& i! ?& u$ q
int main(void)
  t( |: ~9 [" x8 `$ L { & q. V( Y/ Y' _6 O4 S. F6 `( m: x/ K; ^
      *(long*)0x40021014=0x007e0014;//A i/0口使能+ u, k) V+ H: P9 m7 ?( X3 `' q" T2 M7 L
    *(long*)0x48000000=0x28555555;//输出
0 y8 v* w  C. }/ c0 A  : D3 C4 L: Q) i1 G
   *(long*)0x48000008=0x0cffffff;//high speed- I' X( f6 r9 w; `8 C* ~+ z
   *(long*)0x4800000c=0x24555555;//上拉
$ U6 {- F8 m) c' U" ]: H: h
# x( \( }) }" _9 y   
: c* d6 ]- Q5 {' z, ^( g2 Q7 n& G; j9 K   while(1); {* {/ P- w2 D
   {*(long*)0x48000014=0xffff;//高
: ?1 c# u- s* L+ F! p9 C   Delay(DELAY_COUNT);///延时,翻转测试不用
9 J% ]6 p) U2 E& J3 y4 f  *(long*)0x48000014=0x0;//低
* U0 x8 Z" L! x* t* rDelay(DELAY_COUNT);///延时,翻转测试不用7 y% E0 k& d! @
   }& j1 {  r4 u, m% H. ^  L
}

9 [8 c2 m/ n3 y( X8 I/ x7 U
收藏 评论21 发布时间:2015-1-6 12:44

举报

21个回答
大秦正声 回答时间:2015-1-6 14:24:20
本帖最后由 大秦正声 于 2015-1-6 14:29 编辑
/ C/ P: [  L2 P( m+ X
# f! u; c4 r0 |4 M0 G4 ]) }& G% S  I新版本5 [1 m2 _8 v5 q+ ^! l' o, @& s9 t) F# o& E
/*
. L; @3 G- r8 e/ F, T, h stm32f072 nucleo  test program
; m( w1 U: X! n' h4 q  s5 u5 ~6 O m0 最小系统测试程序2 o9 r0 O" }) q6 t
不需要头文件和库函数,很小巧实用!8 h$ K. q! J: r% L7 j; ~
用于I/o口翻转频率测试、跑马灯演示!- l* V) x3 H9 B: \* \* z4 o, y
作者: 大秦正声,小电子
' K4 g7 D0 L+ t& Z1 ^. W7 Y% V% H 日期: 2015.1.6
# c9 z) L; F9 a& y! b 博客:  http://yang96381.blog.163.com# l* g& s- m# {: R- x7 h) V
邮箱:    yang96381@163.com
6 [1 y3 N2 n2 L2 U- B4 g4 [! k0 Y */
& g# a: I( x* U 7 [- R% q0 i* W! H& e0 Z: E5 @

2 a9 B% H) k) Y; c1 Y : u7 W1 F# S: K0 a  E, a
#define DELAY_COUNT    0xFFFFF
' t- [( I9 i, F #define PA_OUT *(long*)0x48000014
  z/ G# X% o" ` #define PA_SPEED *(long*)0x480000081 u: o5 n4 k% t) a
#define RCC_AHBENR *(long*)0x40021014
, g, E( _5 x/ x  i  c  v- z7 ~  q #define PA_MODER *(long*)0x48000000
3 S+ ]( V$ L* ^' L2 ]; o2 @* {. | void Delay( long int Count)' O9 U3 ~. ~: S* L" n# x
{: v. C) d8 w- k+ ?$ P( z9 x) T
     for(; Count!= 0;Count--);
9 b1 n; v3 a" {5 P6 M, |2 v }
3 Y5 D! U1 x7 b, Y7 b; e- gint main(void)
: K& e# t4 d; J$ t- m {
5 C; v. \. U9 g1 r; }0 ?6 v5 A      RCC_AHBENR=0x007e0014;//A i/0口使能' ~% q/ P2 J! X' {% X0 B
      PA_MODER =0x28555555;//输出
4 V3 N8 \/ d1 G8 C0 |   
+ _0 s: s6 V2 k8 m8 _- A" @     PA_SPEED=0x0cffffff;//high speed: X3 F) W8 m( ~: k
    2 B6 w) ~- q" ~# U' q
   
: A9 T# c5 W5 L     while(1)) ]5 T- l) P( g/ w: A8 K
     {PA_OUT=0xffff;//高
/ c( p! e0 m8 D& m; F( Z! ^: M0 y2 k) c     Delay(DELAY_COUNT);///延时,翻转测试不用. e- |# M/ |6 b5 U7 a
    PA_OUT=0x0000;//低0 V8 o5 N  h/ x5 j, D( ^
Delay(DELAY_COUNT);///延时,翻转测试不用
( j3 E* o3 Z: H: u3 F6 A. e     }0 n5 d8 d& l! u0 S% w
}
qianfan 回答时间:2015-1-6 17:14:05
大秦正声 发表于 2015-1-6 16:164 W9 T9 \% F2 C+ c
已经把地址改成PA_OUT等( K& V# N! ~! q9 T" W
就是不标准

1 m8 q2 n! Y* @- V. ~& q7 Q像你说的这样,GPIOA->ODR,DDR,。。。是不是都需要使用宏声明一下?" S( C% m" ^5 j- H- m7 ]
而在官方的头文件中,只需要使用结构体的自动偏移就行了。
* h/ Z" O# {; e这样在传递参数的时候更方便。就像WriteBits,只需要传递一个GPIOA就行了,其余的比如ODR都可以知道,而像你这种方式,ODR,IDR等等寄存器的地址都需要手动计算
qianfan 回答时间:2015-1-6 17:10:42
我是酱油哥 发表于 2015-1-6 16:39
. }0 E* N* }( F- E问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下6 n1 l- m: V0 W& I, J; ~# O
谢了啊 ...
( ?1 A) o" p, y) o/ e' k
将地址转换成指针访问:' ~) E( U5 v( E
比如:将内存是0XA000_0000处的值写成100:3 G6 Q0 _2 l/ Z% J$ C& N. W
*((volatile uint32_t *)0XA000_0000)=100;
7 u& F& n6 P4 L千万不要在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
, Z4 _0 n& h! c7 m  |这样访问内存好任性,就不能直接使用GPIOx吗?

3 @& o+ {7 [6 K' o8 C. B谢谢!程序的可读性有待提高!好处是输出速度提高了!
qianfan 回答时间:2015-1-6 13:29:11
大秦正声 发表于 2015-1-6 13:279 _1 S% S; Q" ]* k& y
谢谢!程序的可读性有待提高!好处是输出速度提高了!

: W' j' v0 n2 e. l6 _- c如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。
) Q6 E! q( z; \" c. n/ @( k3 ~说是速度提高了,应该是直接访问寄存器和库函数相比,速度应该提高
大秦正声 回答时间:2015-1-6 13:52:06
QianFan 发表于 2015-1-6 13:29& r% A* @2 p/ _  g
如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。# b  B( U$ u) o4 f) R
说是速度提高了,应该是直接访问寄 ...
1 `  q6 Y$ Y4 @$ H+ v
说的对!
大秦正声 回答时间:2015-1-6 14:36:52
QianFan 发表于 2015-1-6 13:07( f( x- T' J: F: g& d) o* x) [
这样访问内存好任性,就不能直接使用GPIOx吗?

5 c/ M5 S4 E# B' M已经修改了!
qianfan 回答时间:2015-1-6 15:02:09
大秦正声 发表于 2015-1-6 14:36
5 ]3 _" L8 J$ n$ y* ~- [已经修改了!
  i. t2 G4 l" i+ Z" P8 {
这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了
大秦正声 回答时间:2015-1-6 15:06:36
QianFan 发表于 2015-1-6 15:02
# S/ y& ]* s9 {这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了 ...

- {2 Q! M; R. H/ J5 T2 U! C可读性提高了啊
qianfan 回答时间:2015-1-6 15:08:19
大秦正声 发表于 2015-1-6 15:06
9 o8 _8 H9 U7 m, l+ h可读性提高了啊
/ ]0 q1 A$ M1 x) x" g, ^6 b
。。。万一哪天你忘记了ODR的地址怎么办
# b9 y' o$ d% g8 x6 k2 n或者你把ODR的地址写错了怎么办?
大秦正声 回答时间:2015-1-6 16:16:55
QianFan 发表于 2015-1-6 15:08
  w7 P3 ]& ?) p5 ?% T) F。。。万一哪天你忘记了ODR的地址怎么办& [( q! F) t6 N4 y7 w: q
或者你把ODR的地址写错了怎么办? ...

$ q6 N- h3 m  r已经把地址改成PA_OUT等
2 c6 V* }1 V3 P就是不标准
我是酱油哥 回答时间:2015-1-6 16:39:53
问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下
0 }. b4 v! {3 ?) Q2 w, |7 }. Z" d谢了啊
12下一页

所属标签

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