第二章 添加相关功能
本项目需要用到的板载资源包括:GPIO、串口3路、定时器中断、外部中断、
- GPIO配置
- 串口配置
- 串口初始化 下面给出三路串口的接收和发送对应的IO口:
串口号 | 发送(TX) | 接收(RX) |
---|---|---|
debugUsart(USART1) | PA9 | PA10 |
printUsart(USART2) | PA2 | PA3 |
lcdUsart(USART3) | PB10 | PB11 |
表 1串口管脚分布
在BSP.c文件中定义如下三个串口初始化函数,同时将这三行添加到BSP.h文件里,对函数进行声明:
(1) void debugUsartInit(u32 bound);
(2) void printUsartInit(u32 bound);
(3) void Usart3Init(u32 bound);
每段初始化函数里的内容可以直接复制粘贴例程里面的程序,这里只给出程序的截图,不再赘述其具体程序写法。
debugUsartInit()函数:
这里我们看到很多错误,这是因为与GPIO和USART相关的库还未添加进去的缘故,现在我们把这两个库添加到工程里来。步骤如下图:
保存,然后重新编译:
如图,发现仍有错误:
按照上面的办法把stm32f10x_rcc的.c和.h文件加进来,同时取消stm32f10x_conf.h中的注释,之后再重新编译,没有错误。
printUsartInit()
需要注意的是:串口1时钟挂载在RCC_APB2PeriphClock上,而串口2和串口3挂载在RCC_APB1PeriphClock上,所以初始化时记得区分。另外,图画中红色方框里的内容每个串口不同,需要注意。
Usart3Init()
- 串口中断 接下来为三个串口编写串口服务程序: 在新建工程模板章已经讲过,各个中断函数主要写在stm32f10x_it.c文件中下面分别介绍这三者的中断服务程序 debugUsart: 这部分主要做调试用,因此中断服务程序可以直接用正点原子例程中的程序,在这里不再赘述。 需要注意的是这几个参数的定义:
printUsart:
lcdUsart:
- 添加printf打印功能 在BSP.c中添加如下代码,并勾选use Microlib选项;
- 测试串口功能
- debugUsart: 代码: 现象:
- printUsart/lcdUsart 代码: 现象:
- sys功能 这个部分在例程里的SYSTEM下的sys文件夹下,只需要把sys.c和sys.h里的内容拷贝到BSP.c和BSP.h里即可。
- delay功能 本项目只需要用到毫秒级延时,而且不需要支持操作系统(OS),故本部分代码不需要完全拷贝例程里的代码,只需要以下两个函数:
在.c文件中也只需要加入相关函数的代码即可,把关于支持OS的代码全部阉割掉。代码如下:
配置好后进行测试: 主函数: 实验现象:
- 定时器中断 把例程里定时器中断里的初始化函数拷贝到BSP.c中,发现很多错误:
这是没有导入定时器的相关库导致的,按照亲前面介绍的方法把库导进去,然后把stm32f10x_conf.h中的定时器相关的宏定义取消注释,问题即可解决。
然后在stm32f10x_it.c中添加定时器的中断处理函数,代码如下:
定时器到这里就可以了。
- RTC实时时钟
RTC部分按照例程里面的代码添加就可以了,与上面的过程相同,同样,例程里的代码不一定全部都要,可以选择性舍弃。
如下是需要添加的函数的函数声明:
下面是实验结果:
- ADC部分
这部分同样直接按例程里的代码来添加,不再详细介绍,结果如下:
- FLASH模拟EPROM 同以上步骤,具体代码和结果不再赘述。
- 水阀和马达配置(GPIO) 头文件代码:
源文件代码:
管脚配置说明:
TAP0àPE8 | MOTOR0àPE10 |
---|---|
TAP1àPE9 | MOTOR1àPE11 |
TAP2àPA5 | MOTOR2àPB5 |
TAP3àPA6 | MOTOR3àPB6 |
TAP4àPA7 | MOTOR4àPB7 |
TAP5àPA8 | MOTOR5àPB9 |
StosteMOTORàPE7 |
表 2 水阀和马达管脚分配表
- 颜色传感器配置
该项目共需要用到6路颜色传感器,每路颜色传感器共6个引脚,关于颜色传感器具的介绍和工作原理在这里不做具体介绍,下面列出具体管脚配置:
ColorSen0 | S0àPC0 |
---|---|
S1àPC1 | |
S2àPC2 | |
S3àPC4 | |
OUTàPA0 | |
ColorSen1 | S0àPD0 |
S1àPD1 | |
S2àPD2 | |
S3àPD4 | |
OUTàPB1 | |
ColorSen2 | S0àPE0 |
S1àPE1 | |
S2àPE2 | |
S3àPE4 | |
OUTàPB2 | |
ColorSen3 | S0àPF0 |
S1àPF1 | |
S2àPF2 | |
S3àPF4 | |
OUTàPG3 | |
ColorSen4 | S0àPG0 |
S1àPG1 | |
S2àPG2 | |
S3àPG4 | |
OUTàPA4 | |
ColorSen5 | S0àPD7 |
S1àPD8 | |
S2àPD9 | |
S3àPD10 | |
OUTàPE7 |
表 3 颜色传感器管脚分配
头文件:
S0-S3:
EXTI:
源文件:
S0-S3:
EXTI:
S0-S3 GPIO高低电平控制
iColor表示传感器编号, iPinx表示S0_S3的序号,iSwitch表示IO口高低电平控制;
白平衡:
读取R、G、B三个通道的值:
读取颜色:
中断处理函数:
颜色识别模块说明:
该模块主要分为三个部分:
第一部分:颜色传感器初始化,主要分为GPIO的配置和外部中断的配置两个部分;其中GPIO的配置和前面的水阀和马达配置相同,外部中断配置则主要分为三个部分,首先要配置好每个外部中断输入口的GPIO,因为该传感器是是检测到脉冲上升沿而开始触发中断的,所以在配置该GPIO时需要把输入输出方式配置为上升沿输入(而非推挽输出);其次是要配置外部中断的中断线,要求六个传感器之间不会相互干扰,故最好每个传感器的中断配置在不同的中断线上;最后还要配置中断相关的一些要求,比如中断优先级之类的;
第二部分:白平衡,就是告诉系统颜色是白色,给定一个白色环境,让颜色传感器读取这个白色并将其设置为标准的白色,然后读取其他颜色时,都以这个颜色为基准进行读取;
第三部分:读取颜色。
本项目需要用到的主要外设的配置,主要就是面这些内容了,还有串口屏和打印机的使用这里先不详细介绍,这两个部分,将在后面的章节进行说明。