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

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

[复制链接]
大秦正声 发布时间:2015-1-6 12:44
点亮PA5引脚的LED。( o) g$ D7 b$ \7 C9 c. h) K9 v
软件用IAR 7.25 l8 G; v3 D+ x- \( v+ g1 M+ o9 t
/*2 }3 I; H  m" c
stm32f072 nucleo  test program
3 p3 b% j% Z0 j4 @6 ]; l$ j m0 最小系统测试程序* `% q5 u. D' k0 g2 z7 T- p  I
不需要头文件和库函数,很小巧实用!
- a( q) l+ x9 U& k) M 用于I/o口翻转频率测试、跑马灯演示!
1 `  V: \4 {3 f8 h# S# A 作者: 大秦正声,小电子' V6 j- {& `, D3 D& n
日期: 2014.12.21
* m9 Z- I* @  h博客:  
http://yang96381.blog.163.com
" q% I# J* }' {. ?5 O3 F! }5 A邮箱:    yang96381@163.com+ r( U# L: P' ]. w7 Z
*/
" y7 O9 z# O# L: ]
# L; |4 D- D2 g. T& R, i) T7 z  |5 F2 q- H4 h
#define DELAY_COUNT    0xfFFFF
( L- e. W/ @. s  g/ R3 Z! | unsigned long dat;  Q- X: H8 N7 _6 K
void Delay( long int Count): M2 ]5 m- J: C3 t/ u! R
{
! [1 W+ l+ g( p4 H# `+ g2 ?   for(; Count!= 0;Count--);0 x2 o) E( I) R1 I6 l
}
9 w% e2 D( M7 z' p$ m) l) Bint main(void)
& a* ]3 i" x' |/ }% U4 I { : }9 j) O7 T6 u7 i
      *(long*)0x40021014=0x007e0014;//A i/0口使能
2 R( k4 n7 k$ [- ?! i' A; A* X    *(long*)0x48000000=0x28555555;//输出
" B) l+ U+ C+ Y8 l4 g( J  
: Y7 f, j- f5 I" h) j   *(long*)0x48000008=0x0cffffff;//high speed0 V0 m! f$ w( R" G
   *(long*)0x4800000c=0x24555555;//上拉& ?/ ?* k/ L* |
' b2 d3 j! I& _% O) h
   
. R% l  r, P5 S) S8 {* _+ ^   while(1)+ S! o2 W. y/ N# E. \! {
   {*(long*)0x48000014=0xffff;//高
- f# e: I  f3 c3 X* g1 n   Delay(DELAY_COUNT);///延时,翻转测试不用. D# J8 F3 V( [0 d) C* L- j$ M
  *(long*)0x48000014=0x0;//低
4 c( p: F4 Y4 {2 sDelay(DELAY_COUNT);///延时,翻转测试不用
+ L& V6 R! g7 w1 C   }. p; y7 h0 H5 N* E
}

+ A) K' H; G9 L1 N4 }( i
赞 收藏 评论21 发布时间:2015-1-6 12:44

举报

21个回答
大秦正声 回答时间:2015-1-6 14:24:20
本帖最后由 大秦正声 于 2015-1-6 14:29 编辑 , D( `. c9 c# j6 p9 `. z
/ d: I, c# r6 p3 x' O$ H! P
新版本
- y1 z+ D* i5 ^( D, F/*. M. p, Q; @  V8 X" K; l% i
stm32f072 nucleo  test program
5 X5 M0 W; ?* M8 @( m m0 最小系统测试程序: F. q6 a/ M9 U: ]! z
不需要头文件和库函数,很小巧实用!  s' r  P. y* @( Z) L# `
用于I/o口翻转频率测试、跑马灯演示!
/ O' Y+ X" N$ g$ `- n0 Y3 R 作者: 大秦正声,小电子1 `3 T3 W* C' b: Z+ n
日期: 2015.1.6( i" \" y' \# U' Q: w6 ~1 P
博客:  http://yang96381.blog.163.com* U9 M: s, l) g6 S% \, p- c, E
邮箱:    yang96381@163.com* h: q, b6 c7 t9 t6 |+ X
*/
6 K  I$ Y" {( s& T, o+ c
, C6 V4 J. l6 E, x1 a* q& b7 i1 L# }. ]7 v
& A- B: c3 f8 y; B3 |6 y
#define DELAY_COUNT    0xFFFFF" K2 z  e' t" S$ U
#define PA_OUT *(long*)0x48000014# g) t$ K5 ?4 Y0 V/ Q1 M( d
#define PA_SPEED *(long*)0x48000008
9 `% ^" S- n! |" S! a #define RCC_AHBENR *(long*)0x40021014
% o& E+ M$ v* L+ G1 V- S #define PA_MODER *(long*)0x48000000
2 j8 N: k) s8 H2 W- R8 b3 ], d3 X void Delay( long int Count)# W/ Q8 y4 ^2 K
{
# R- P2 R+ L" L( `2 A/ g     for(; Count!= 0;Count--);
$ N  U; C9 ^6 n' S5 i8 G }: E) B$ w; v3 f4 `
int main(void)
% U8 ]* c2 F" ^. T$ P2 g { " I+ r! B1 y' }0 m
      RCC_AHBENR=0x007e0014;//A i/0口使能
/ p0 I8 S, A: `+ `      PA_MODER =0x28555555;//输出9 F" \$ h6 t' E3 o! o
    3 A* e# t  V( K9 e+ w! l
     PA_SPEED=0x0cffffff;//high speed: `8 w$ w' d  s6 N
    ! S- E, q% @7 W* S$ S
    4 r( A7 N6 V! D: c  C; l
     while(1)3 Y0 N6 T2 W! N7 y. v/ `! V
     {PA_OUT=0xffff;//高
- m4 }0 [+ Q+ S( G     Delay(DELAY_COUNT);///延时,翻转测试不用
3 B  l& C7 W6 Q2 @" V, c4 A3 B3 O* @( Y    PA_OUT=0x0000;//低
9 ~! C3 z$ W9 F  D& q* EDelay(DELAY_COUNT);///延时,翻转测试不用' m1 k" p7 x" c7 F5 C3 K1 K  a2 K
     }
9 ?/ |3 X, B: `* `6 l5 O' k }
qianfan 回答时间:2015-1-6 17:14:05
大秦正声 发表于 2015-1-6 16:16: x. s  l9 u0 g- A+ T3 @* C, V' d) Q
已经把地址改成PA_OUT等
" J6 Y, u7 ^# S4 `. M: \就是不标准

. g! E5 {* B1 _* F9 f像你说的这样,GPIOA->ODR,DDR,。。。是不是都需要使用宏声明一下?
9 T; J0 T% f6 ]; f# E4 I而在官方的头文件中,只需要使用结构体的自动偏移就行了。
& u* \) H3 I* b* H这样在传递参数的时候更方便。就像WriteBits,只需要传递一个GPIOA就行了,其余的比如ODR都可以知道,而像你这种方式,ODR,IDR等等寄存器的地址都需要手动计算
qianfan 回答时间:2015-1-6 17:10:42
我是酱油哥 发表于 2015-1-6 16:39' W! [5 P$ x0 ~# i1 x9 s
问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下
) e0 `4 f8 y7 C% l谢了啊 ...

8 B$ I3 D3 G$ q- b. K( {3 w1 D3 `将地址转换成指针访问:
, e; e/ A& A9 K1 H比如:将内存是0XA000_0000处的值写成100:
$ X: \+ {, t1 c9 ?4 F*((volatile uint32_t *)0XA000_0000)=100;
) ]  R. r8 R7 R* B: {千万不要在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
4 J& N- m8 @" d6 n" J这样访问内存好任性,就不能直接使用GPIOx吗?

! `, n$ p, F5 T/ E' g: t5 M/ V7 e( Q谢谢!程序的可读性有待提高!好处是输出速度提高了!
qianfan 回答时间:2015-1-6 13:29:11
大秦正声 发表于 2015-1-6 13:27
' C0 x$ K' ^6 f" X8 h3 O# ~谢谢!程序的可读性有待提高!好处是输出速度提高了!

+ K  c) x9 d) V; X/ y如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。
6 K* n9 s& r/ J6 y8 h说是速度提高了,应该是直接访问寄存器和库函数相比,速度应该提高
大秦正声 回答时间:2015-1-6 13:52:06
QianFan 发表于 2015-1-6 13:29
4 J$ V9 C! w$ ^0 Q如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。
9 }. w7 Y# n9 x: ]) L说是速度提高了,应该是直接访问寄 ...

' u* D; v) R7 g* q+ w' U  i: m说的对!
大秦正声 回答时间:2015-1-6 14:36:52
QianFan 发表于 2015-1-6 13:07
5 v$ w+ n  [0 A- Q这样访问内存好任性,就不能直接使用GPIOx吗?

; u, K7 I2 C) ^+ f* j# ~6 z已经修改了!
qianfan 回答时间:2015-1-6 15:02:09
大秦正声 发表于 2015-1-6 14:36, z3 w" R1 ~( u. W: e* [
已经修改了!

4 ?% S$ Y" ]+ [7 R6 S, u# o这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了
大秦正声 回答时间:2015-1-6 15:06:36
QianFan 发表于 2015-1-6 15:02
0 q1 o3 j6 m) W1 I这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了 ...

- m: K) T6 _* G' I  K2 x0 j可读性提高了啊
qianfan 回答时间:2015-1-6 15:08:19
大秦正声 发表于 2015-1-6 15:06
, r' j; o- X$ g可读性提高了啊
) z6 F* {, P" V; r# s  h3 ?6 ?
。。。万一哪天你忘记了ODR的地址怎么办
( R- `( j& \9 J或者你把ODR的地址写错了怎么办?
大秦正声 回答时间:2015-1-6 16:16:55
QianFan 发表于 2015-1-6 15:08, o' i& h7 z$ F& {
。。。万一哪天你忘记了ODR的地址怎么办
5 h% T3 Y- \& A; E# ]* ]- J或者你把ODR的地址写错了怎么办? ...
6 W: y: w1 z4 X! p
已经把地址改成PA_OUT等! e: ~. H5 ]2 j; D8 O: |
就是不标准
我是酱油哥 回答时间:2015-1-6 16:39:53
问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下- J! i' |' _2 a$ k6 Z$ v1 f7 W
谢了啊
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版