基于stm32f030水温控制1

po-1-1.jpg

前言

这篇博客是基于我老师布置的项目”stm32f030水温控制”所写的,我会把每个模块的基本配置为大家进行讲解.好啦闲话不多说,进入我们的正题.

LED和蜂鸣器的配置

LED或者是蜂鸣器(BEEP)基本上是我们学习32的基础,配置这方面十分简单,所以我会简单的略过一些配置.

我的板上LED和蜂鸣器与单片机相连的IO口有三个,分别是LED1-PA11 LED2-PA12 BEEP-PA0,接下来我们就说一下如何配置.

首先,我们需要定义GPIO结构体与PA口的时钟,这里有别与F1系列的配置,F0PA口上的时钟是在AHB总线上,而F1PA口上的时钟是APB2,所以这里我们要区分一下,否则会报错.
1.png

配置完时钟,我们就可以对IO口进行配置了,这里我设置了IO口为推挽输出,速度为50MHz,

2.jpg

这里要强调的是,F0区别与F1的是,IO口配置这边,不能直接像F1一样推挽和输出是同时配置的,F0是分别配置的,还有就是右击IO口速度那里,我们可以看到:

3.jpg
4.jpg
可以看出,如果我们使用GPIO_Speed_Level_3也可以代替GPIO_Speed_50MHz,可以更直观的看出IO口速度,具体怎样选择,还是得看个人选择.

最后,在配置一下GPIO_Init函数就基本配置完成.

那么,我们如何使得LED翻转呢,这里就可以用到GPIO_SetBits和GPIO_ResetBits两个函数,不过我还是喜欢用F1的位带操作.所以等一下,我们讲一下如何配置F0来实现位带操作.

5.jpg

位带操作的配置

位带操作,可以使我们输出高低电平时给1 or 0来实现,这样可以方便我们操控IO口,而且方便快捷,如果用操作函数的方式,翻转IO口就有点麻烦,所以这里我们设置下位带操作.

我们可以在所在的工程中添加stm32f0xx_sys.h的头文件来存放,当我们需要使用位带操作时,直接调用就可以了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80


#define __STM32F0xx_SYS_H

typedef struct{
unsigned short int b0 : 1;
unsigned short int b1 : 1;
unsigned short int b2 : 1;
unsigned short int b3 : 1;
unsigned short int b4 : 1;
unsigned short int b5 : 1;
unsigned short int b6 : 1;
unsigned short int b7 : 1;
unsigned short int b8 : 1;
unsigned short 大专栏  基于stm32f030水温控制1yword">int b9 : 1;
unsigned short int b10 : 1;
unsigned short int b11 : 1;
unsigned short int b12 : 1;
unsigned short int b13 : 1;
unsigned short int b14 : 1;
unsigned short int b15 : 1;
}REG16_TypeDef;



#define GPIOA_ODR_Addr (GPIOA_BASE+0x14) //0x48000014

#define GPIOB_ODR_Addr (GPIOB_BASE+0x14) //0x48000414

#define GPIOC_ODR_Addr (GPIOC_BASE+0x14) //0x48000814

#define GPIOD_ODR_Addr (GPIOD_BASE+0x14) //0x48000C14

#define GPIOE_ODR_Addr (GPIOE_BASE+0x14) //0x48001014

#define GPIOF_ODR_Addr (GPIOF_BASE+0x14) //0x48001414

#define GPIOA_IDR_Addr (GPIOA_BASE+0x10) //0x48000010

#define GPIOB_IDR_Addr (GPIOB_BASE+0x10) //0x48000410

#define GPIOC_IDR_Addr (GPIOC_BASE+0x10) //0x48000810

#define GPIOD_IDR_Addr (GPIOD_BASE+0x10) //0x48000C10

#define GPIOE_IDR_Addr (GPIOE_BASE+0x10) //0x48001010

#define GPIOF_IDR_Addr (GPIOF_BASE+0x10) //0x48001410

//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout ((volatile REG16_TypeDef *)GPIOA_ODR_Addr) //输出

#define PAin ((volatile REG16_TypeDef *)GPIOA_IDR_Addr) //输入

#define PBout ((volatile REG16_TypeDef *)GPIOB_ODR_Addr) //输出

#define PBin ((volatile REG16_TypeDef *)GPIOB_IDR_Addr) //输入

#define PCout ((volatile REG16_TypeDef *)GPIOC_ODR_Addr) //输出

#define PCin ((volatile REG16_TypeDef *)GPIOC_IDR_Addr) //输入

#define PDout ((volatile REG16_TypeDef *)GPIOD_ODR_Addr) //输出

#define PDin ((volatile REG16_TypeDef *)GPIOD_IDR_Addr) //输入

#define PEout ((volatile REG16_TypeDef *)GPIOE_ODR_Addr) //输出

#define PEin ((volatile REG16_TypeDef *)GPIOE_IDR_Addr) //输入

#define PFout ((volatile REG16_TypeDef *)GPIOF_ODR_Addr) //输出

#define PFin ((volatile REG16_TypeDef *)GPIOF_IDR_Addr) //输入

typedef unsigned char u8;
typedef unsigned short int u16;
typedef unsigned int u32;

#endif

这样位带操作就已经配置好了.

结语

因为时间的问题,我没有办法把整个工程一次性讲完,所以我会分篇讲解,今天就先说的这里,我只是个学生,如果在文章中有什么错误的地方,请不吝指教,谢谢!

猜你喜欢

转载自www.cnblogs.com/dajunjun/p/11711177.html