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

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

[复制链接]
大秦正声 发布时间:2015-1-6 12:44
点亮PA5引脚的LED。
: d8 ?5 t- n# Y' B+ ]0 [' g软件用IAR 7.2
* }9 s9 K1 d6 ^/*
) I. L# ?' {5 z5 w, G% A stm32f072 nucleo  test program6 [  O8 p7 Y: R# Z- o; ]
m0 最小系统测试程序
9 ~( Q; w  g( y  ?! C 不需要头文件和库函数,很小巧实用!
; w7 v0 H' T$ G7 C* A) h 用于I/o口翻转频率测试、跑马灯演示!
8 e9 w, _: n# ^  J3 p8 C# ?: R 作者: 大秦正声,小电子
+ C9 b" F9 y( A  c$ \ 日期: 2014.12.211 z1 i, [0 {% Q% E" n$ h8 C
博客:  
http://yang96381.blog.163.com; M+ \# V+ e/ I* y# B0 ?0 @! R$ l" |
邮箱:    yang96381@163.com' z- g1 W  E% K2 e
*/' i! u/ J; F% T
6 J' a  a& c% C, w! N
0 B. l1 Z9 G+ O. b+ I8 |
#define DELAY_COUNT    0xfFFFF
$ d+ J  {, ~' ^1 r* Q2 k unsigned long dat;
" Z# g0 F6 m# z1 ]7 vvoid Delay( long int Count)
7 }' \1 A6 t3 ?7 E {
( `( t- |/ n% Z8 c   for(; Count!= 0;Count--);
& X4 [; }, F/ W }1 ^% a3 R; M) {( L2 U! V. x. w
int main(void)0 {/ p1 G- E, T1 G: G7 l
{
+ Q" Y' D9 T2 Z/ t7 Y: E      *(long*)0x40021014=0x007e0014;//A i/0口使能
' ]0 `0 a1 [/ E) C1 C' l    *(long*)0x48000000=0x28555555;//输出/ I: g( z2 C2 c: c6 @3 P
  
- x- A- W' W6 d2 N   *(long*)0x48000008=0x0cffffff;//high speed
* i/ P& d1 ?5 |1 T& n   *(long*)0x4800000c=0x24555555;//上拉4 J$ t3 s( W& `. b! t
8 L. a5 R, Z, {. Y9 W7 S
   
$ \6 z& G: z, ~' K& i   while(1)
) d' b" X/ S& q6 b   {*(long*)0x48000014=0xffff;//高
6 _+ x! y( b- d   Delay(DELAY_COUNT);///延时,翻转测试不用
$ B" V5 \' T' P, e/ G& l- S" m  *(long*)0x48000014=0x0;//低
9 B( z7 S; N2 v8 ?: NDelay(DELAY_COUNT);///延时,翻转测试不用, [" X  a2 p2 `, c( _# ]
   }
3 T) Z0 m* P3 X, E }

. j) ^7 A& T3 k1 \. I. I; A
收藏 评论21 发布时间:2015-1-6 12:44

举报

21个回答
大秦正声 回答时间:2015-1-6 14:24:20
本帖最后由 大秦正声 于 2015-1-6 14:29 编辑 2 d3 b% N  `+ ^5 x
2 C3 ^: k+ N2 k) N- F: F8 Q' [' o
新版本
9 ]9 Y0 p; x: z/*$ @4 R( o5 ?& P. s8 k- e
stm32f072 nucleo  test program1 ~# p$ R( `" l2 {" O; ]
m0 最小系统测试程序3 _9 I0 J3 T  i6 t" A
不需要头文件和库函数,很小巧实用!
6 T) k. E6 x) D. |4 o 用于I/o口翻转频率测试、跑马灯演示!
' }8 ~$ C$ b/ H6 l! E6 \+ ~ 作者: 大秦正声,小电子
8 n" p. |( `3 H- g- z9 ~ 日期: 2015.1.68 P1 B( T. ]1 t& d" @. R
博客:  http://yang96381.blog.163.com5 M  l; y. y' \" u' \+ H
邮箱:    yang96381@163.com3 Y- E& G5 N6 u/ q4 `' W
*/  i8 d5 \3 }4 n# R2 U4 s' _
$ z, _9 {: h) I$ o
; V$ w2 }% p! W' P0 P& j( q& H

) Q  y' S1 F3 q" e, o0 v#define DELAY_COUNT    0xFFFFF! A6 u2 V5 z. e- U" C
#define PA_OUT *(long*)0x480000149 @7 w! V8 h7 Z- ^/ d& A$ R
#define PA_SPEED *(long*)0x480000085 X% A0 v/ y6 ]& o, f1 N5 g
#define RCC_AHBENR *(long*)0x40021014$ X( p7 _9 F8 U1 o, O
#define PA_MODER *(long*)0x48000000
: D3 A% w2 h3 o void Delay( long int Count)
1 D" O! J( Q; \) p; S6 B" o4 D {- P' O. K2 q& r
     for(; Count!= 0;Count--);
) P) H: M. D. s- r. Y }
1 d. r7 Y4 V9 e3 [int main(void)6 d- G: G4 D! X
{
# r3 ^) L3 L! I* f9 ~, F, m      RCC_AHBENR=0x007e0014;//A i/0口使能
- M7 G0 k: l4 d; _      PA_MODER =0x28555555;//输出) l  B. f; g3 |6 j4 `6 X
   
8 l! G/ U, r8 R, U     PA_SPEED=0x0cffffff;//high speed7 y8 D" G" `6 a$ g7 R5 C
    & K# R$ e: h6 M* K6 A% z' o
   
# P9 K6 }1 s" }1 t2 V1 I     while(1)$ {9 r" V3 L7 S; w
     {PA_OUT=0xffff;//高4 D9 |6 M$ Y0 g; |! U
     Delay(DELAY_COUNT);///延时,翻转测试不用5 j3 s2 a, a0 n/ D+ j2 p2 J4 w6 o# S
    PA_OUT=0x0000;//低
; H7 ~4 e# l' [" g4 I. vDelay(DELAY_COUNT);///延时,翻转测试不用
( g7 R4 m3 W4 I/ }% C: j     }& l  W$ Z# O, V  `
}
qianfan 回答时间:2015-1-6 17:14:05
大秦正声 发表于 2015-1-6 16:16  p: R8 j. F7 H1 r
已经把地址改成PA_OUT等
5 i) u) ^) K( n就是不标准

) _1 z4 r( v, |+ k3 T# L像你说的这样,GPIOA->ODR,DDR,。。。是不是都需要使用宏声明一下?
" s" T; \7 w4 v9 H而在官方的头文件中,只需要使用结构体的自动偏移就行了。
  b- d5 c5 [, I  W0 J& w9 x. z这样在传递参数的时候更方便。就像WriteBits,只需要传递一个GPIOA就行了,其余的比如ODR都可以知道,而像你这种方式,ODR,IDR等等寄存器的地址都需要手动计算
qianfan 回答时间:2015-1-6 17:10:42
我是酱油哥 发表于 2015-1-6 16:39
; A( d4 l( u$ y  {* w- v9 U* ^问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下
. j3 M3 {  f7 L( q4 C6 i' u" T) \谢了啊 ...
9 [: z6 d3 F5 H; t. O
将地址转换成指针访问:, D! v/ N: D. U* l( \, k
比如:将内存是0XA000_0000处的值写成100:
! X6 a+ V! A3 A/ Y*((volatile uint32_t *)0XA000_0000)=100;
- e% D& v, N/ [- Y. P6 F9 c0 K千万不要在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/ h' J" D( D% o7 Z3 d( N9 b
这样访问内存好任性,就不能直接使用GPIOx吗?
) k) v' r! {# x& e' {2 V
谢谢!程序的可读性有待提高!好处是输出速度提高了!
qianfan 回答时间:2015-1-6 13:29:11
大秦正声 发表于 2015-1-6 13:27  ~$ S& s5 i. Y/ ]# M  ?% p6 ^" R
谢谢!程序的可读性有待提高!好处是输出速度提高了!
* ?) c" M, _7 |1 I
如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。4 c$ d: B; x* v$ Y5 y7 P
说是速度提高了,应该是直接访问寄存器和库函数相比,速度应该提高
大秦正声 回答时间:2015-1-6 13:52:06
QianFan 发表于 2015-1-6 13:29
9 p: M  e! Y. ?3 F如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。2 F- [9 c9 Q: y- p7 M
说是速度提高了,应该是直接访问寄 ...

7 q. E( d; n% ~. \/ O7 m说的对!
大秦正声 回答时间:2015-1-6 14:36:52
QianFan 发表于 2015-1-6 13:07) @7 l; L  g2 T# x1 m' A- S1 x+ N
这样访问内存好任性,就不能直接使用GPIOx吗?

, @8 o( F. I: Q已经修改了!
qianfan 回答时间:2015-1-6 15:02:09
大秦正声 发表于 2015-1-6 14:36, T( x' u# X6 O# b) g# F
已经修改了!

9 T9 Y, ~2 H1 t8 ~, G7 a; k, n这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了
大秦正声 回答时间:2015-1-6 15:06:36
QianFan 发表于 2015-1-6 15:025 q8 m% u$ N9 V
这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了 ...
* q- U, {  Q) R+ Y( E
可读性提高了啊
qianfan 回答时间:2015-1-6 15:08:19
大秦正声 发表于 2015-1-6 15:060 I0 L/ Z; z% y+ u
可读性提高了啊
5 F! b" u6 Z( B
。。。万一哪天你忘记了ODR的地址怎么办/ c' O$ e& s; \1 A; P2 \, C
或者你把ODR的地址写错了怎么办?
大秦正声 回答时间:2015-1-6 16:16:55
QianFan 发表于 2015-1-6 15:08
* x+ c" a$ F7 K: x! K+ ]% B) k- ^7 I。。。万一哪天你忘记了ODR的地址怎么办
1 a( v! p! M% r! m或者你把ODR的地址写错了怎么办? ...

$ V/ q( j9 c, C7 n& _9 l7 ~已经把地址改成PA_OUT等
( w. r( k/ d) V就是不标准
我是酱油哥 回答时间:2015-1-6 16:39:53
问一句C语言里 直接访问内存的指令是什么 ?有没有什么资料介绍一下; ]* R( c, g. L5 P
谢了啊
12下一页

所属标签

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