
点亮PA5引脚的LED。6 C( V+ [5 g. @& [& c. ~0 }. ^ 软件用IAR 7.2 /* stm32f072 nucleo test program4 {, [- d* k1 W$ z& Z& l, @- { m0 最小系统测试程序$ t' T- b1 s- j* e- _ 不需要头文件和库函数,很小巧实用!) H; f0 Y; z, }- p 用于I/o口翻转频率测试、跑马灯演示! 作者: 大秦正声,小电子 日期: 2014.12.21 博客: http://yang96381.blog.163.com 邮箱: yang96381@163.com */ 5 r5 m+ F5 f* U: j3 p I 7 s; ?% y- o/ ~( z #define DELAY_COUNT 0xfFFFF unsigned long dat;# t- O; C; m1 g- M! ~ void Delay( long int Count), @8 N* ~( n4 }3 D, O { for(; Count!= 0;Count--); D% F3 m# n2 N }" @: s! T4 p( s: c& i! ?& u$ q int main(void) { & 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;//输出 : D3 C4 L: Q) i1 G *(long*)0x48000008=0x0cffffff;//high speed- I' X( f6 r9 w; `8 C* ~+ z *(long*)0x4800000c=0x24555555;//上拉 while(1); {* {/ P- w2 D {*(long*)0x48000014=0xffff;//高 Delay(DELAY_COUNT);///延时,翻转测试不用 *(long*)0x48000014=0x0;//低 Delay(DELAY_COUNT);///延时,翻转测试不用7 y% E0 k& d! @ }& j1 { r4 u, m% H. ^ L } |
新版本5 [1 m2 _8 v5 q+ ^! l' o, @& s9 t) F# o& E
/*
stm32f072 nucleo test program
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
作者: 大秦正声,小电子
日期: 2015.1.6
博客: http://yang96381.blog.163.com# l* g& s- m# {: R- x7 h) V
邮箱: yang96381@163.com
*/
7 [- R% q0 i* W! H& e0 Z: E5 @
: u7 W1 F# S: K0 a E, a
#define DELAY_COUNT 0xFFFFF
#define PA_OUT *(long*)0x48000014
#define PA_SPEED *(long*)0x480000081 u: o5 n4 k% t) a
#define RCC_AHBENR *(long*)0x40021014
#define PA_MODER *(long*)0x48000000
void Delay( long int Count)' O9 U3 ~. ~: S* L" n# x
{: v. C) d8 w- k+ ?$ P( z9 x) T
for(; Count!= 0;Count--);
}
int main(void)
{
RCC_AHBENR=0x007e0014;//A i/0口使能' ~% q/ P2 J! X' {% X0 B
PA_MODER =0x28555555;//输出
PA_SPEED=0x0cffffff;//high speed: X3 F) W8 m( ~: k
2 B6 w) ~- q" ~# U' q
while(1)) ]5 T- l) P( g/ w: A8 K
{PA_OUT=0xffff;//高
Delay(DELAY_COUNT);///延时,翻转测试不用. e- |# M/ |6 b5 U7 a
PA_OUT=0x0000;//低0 V8 o5 N h/ x5 j, D( ^
Delay(DELAY_COUNT);///延时,翻转测试不用
}0 n5 d8 d& l! u0 S% w
}
像你说的这样,GPIOA->ODR,DDR,。。。是不是都需要使用宏声明一下?" S( C% m" ^5 j- H- m7 ]
而在官方的头文件中,只需要使用结构体的自动偏移就行了。
这样在传递参数的时候更方便。就像WriteBits,只需要传递一个GPIOA就行了,其余的比如ODR都可以知道,而像你这种方式,ODR,IDR等等寄存器的地址都需要手动计算
将地址转换成指针访问:' ~) E( U5 v( E
比如:将内存是0XA000_0000处的值写成100:3 G6 Q0 _2 l/ Z% J$ C& N. W
*((volatile uint32_t *)0XA000_0000)=100;
千万不要在windows上面实验这样的代码,因为他们有内存保护。
谢谢!程序的可读性有待提高!好处是输出速度提高了!
如果直接访问寄存器,使用GPIOX->ODR和这个的输出速度应该没有区别。
说是速度提高了,应该是直接访问寄存器和库函数相比,速度应该提高
说的对!
已经修改了!
这个程序和之前的没有什么区别。是使用GPIOA->ODR,这样就不需要知道ODR的地址了
可读性提高了啊
。。。万一哪天你忘记了ODR的地址怎么办
或者你把ODR的地址写错了怎么办?
已经把地址改成PA_OUT等
就是不标准
谢了啊