目录
ARM 体系结构
GPIO
使用GEC固件库实现GPIO操作(gec_gpio.h)
电机的使用
循迹传感器的使用
中断系统
正文
ARM 体系结构
一个公司的名字(英国)
一种处理器的体系架构(精简指令集RISC==>高性能低功耗)
采用这种架构的处理器
ARM系列 ARM内核 经典芯片
Cortex-M(mcu) M0/M1/M3/M4 STM32F407
Cortex-A(Application) A5/A7/A8/A9/A53 S5P6818
Cortex-R(realtime) R4/R5/R7/R8
STM32是意法半导体公司基于Cortex-M3/M4内核研发的一款微控制器(mcu),
主用应用于控制场合、工控场景。凭借着产品多样化,极高的性价比,
简单易懂的固件库开发方式,STM32在嵌入式领域深受欢迎。
GPIO
1,问题的引入
微控制器通过引脚连接控制输入输出设备
==>
STM32 GPIO的操作
2,STM32 GPIO的概述
GPIO是什么? General Purpose Input Output 通用目的的输入输出口线
其本质就是从芯片内部引出一根复用的口线,而且可以由CPU配置成不同的功能。
如: 输出功能、输入功能,其它的复用功能。
STM32F4XX共有144根GPIO口线,分为9组,记为GPIOA,GPIOB,GPIOC,。。。GPIOI。简写为PA、PB、PC…
PI。每组管理16根GPIO口线,编号为0~15。如GPIOA这一组有16个GPIO口,分别记为GPIOA0,GPIOA1,…
GPIOA15,简写为PA0,PA1,PA2,…PA15。
3,STM32F4XX GPIO内部原理结构(请参考《STM32F4中文参考手册》第7章)
每个GPIO口内部都可以配置成:
(1)输入功能:
CPU可以获取该GPIO口的外部输入的一个电平状态。输入功能也有几种模式:
a. 带上拉的输入(input pull-up):内部接了一个上拉电阻
默认的输入状态是高电平,可以被外部拉低
b. 带下拉的输入(input pull-down):内部接了一个下拉电阻
默认的输入状态是低电平,可以被外部拉高
c. 输入悬空(input floating):内部既没有接上拉电阻,也没有接下拉电阻
输入的信号完全由外部连接决定
(2)输出功能:
CPU可以往GPIO口输出一个电平状态。输出功能也有几种模式
a. 输出推挽(Push-Pull): 即可以输出高电平,也可以输出低电平
设置为输出高电平: 有电流流出,把外部拉高
设置为输出低电平: 电流流入芯片入地,把外部拉低
b. 输出开漏(Open-Drain): 没有输出电流的能力,但是可以输出低电平
设置为输出高电平: 实际上为开路状态
设置为输出低电平: 电流流入芯片入地,把外部拉低
(3)复用功能: Alternate Function
复用功能是指GPIO口用作其它功能的口线,如I2C、UART、SPI等等
每个GPIO口可以配置成多达16种复用功能,记为AF0,AF1,…AF15。
使用GEC固件库实现GPIO操作(gec_gpio.h)
/* Gec_GPIO_Init: 初始化一个GPIO引脚 @GPIOx: 指定GPIO分组,如:GPIOA, GPIOB,… @GPIO_Pin: 指定GPIO引脚编号,如:GPIO_Pin_0, GPIO_Pin_1,… @gpio_mode: 指定GPIO的模式 enum GPIO_MODE { GPIO_MODE_IN_FLOATING, // 输入悬空 GPIO_MODE_IN_PULLUP, //带上拉的输入 GPIO_MODE_IN_PULLDOWN, //带下拉的输入 GPIO_MODE_IN_ANALOG, //模拟输入 GPIO_MODE_OUT_PP, //输出推挽 GPIO_MODE_OUT_OD, //输出开漏 GPIO_MODE_EXTI_Rising, //外部中断 “上升沿中断” GPIO_MODE_EXTI_Falling, //外部中断 “下降沿中断” GPIO_MODE_EXTI_Both, //外部中断,“双边沿中断 上升沿 || 下降沿” GPIO_MODE_UNKOWN, //未知 }; 返回值: 成功返回0 失败返回-1 / void Gec_GPIO_Init(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, enum GPIO_MODE gpio_mode); /* Gec_GPIO_Get_Value: 获取某个GPIO的值 @GPIOx: 指定GPIO分组,如:GPIOA, GPIOB,… @GPIO_Pin: 指定GPIO引脚编号,如:GPIO_Pin_0, GPIO_Pin_1,… 返回值: 0 -> 低电平 1 -> 高电平 / int Gec_GPIO_Get_Value(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin); /* Gec_GPIO_Set_Value: 设置某个GPIO的值 @GPIOx: 指定GPIO分组,如:GPIOA, GPIOB,… @GPIO_Pin: 指定GPIO引脚编号,如:GPIO_Pin_0, GPIO_Pin_1,… @value:要设置的值 0 -> 低电平 1 -> 高电平 返回值: 无。 / void Gec_GPIO_Set_Value(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin, uint16_t value);
电机的使用
(1)电机的分类
1,步进电机,可以精确的控制旋转角度和旋转圈数
2,舵机,也叫伺服机,可以精确的控制旋转角度。旋转角度是有限的,
有90度的,也有180度的。
有一定的力量可以维持某个角度,多用于机械臂或者机器人的关节部位。
3,直流电机,可以精确的调节转速,不能控制旋转角
我们的智能小车是直流电机。
(2)电机驱动模块的连线
La ==> Camera3 ==> PB7
Lb ==> Camera4 ==> PD6
Ra ==> Camera5 ==> PA4
Rb ==> Camera6 ==> PD7
(3) 小车运动控制的实现
前进:
La 高电平 Lb 低电平
Ra 高电平 Rb 低电平
后退:
La 低电平 Lb 高电平
Ra 低电平 Rb 高电平
原地左转:
La 低电平 Lb 高电平
Ra 高电平 Rb 低电平
原地右转:
La 高电平 Lb 低电平
Ra 低电平 Rb 高电平
前进左转:
前进右转:
循迹传感器的使用
当模块检测到前方障碍物信号时,电路板上红色指示灯点亮,同时 OUT
端口持续输出低电平信号,该模块检测距离 2~60cm,检测角度 35°,检测距离可
以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检
测距离减少。
循迹: 当模块在黑色的线路上,OUT输出高电平,指示灯不亮,当模块移除黑色线路范围时,
OUT输出低电平。指示灯亮
避障: 当模块遇到障碍物时,OUT输出低电平,LED灯亮。原理障碍物时,OUT输出高电平,LED灯熄灭
IN1 ==> Camera7 ==> PG15
IN2 ==> Camera8 ==> PC6
IN3 ==> Camera9 ==> PC7
IN4 ==> Camera10 ==> PC8
中断系统
1,问题的引入
按键 ==> 灯
但是CPU并不知道按键何时会被按下?
传统解决办法:
把按键的GPIO配置为输入模式,然后让CPU定时去查询按键的GPIO口的输入状态,从而得到按键
是按下还是弹起的状态。
这种方式称为"轮询",即轮流询问。
轮询有天生的缺陷?
1)会使程序流程阻塞到死循环里
2)浪费CPU资源
有人提出,能不能这样做,按键按下或弹起的时候,外设主动通知CPU。
==> 中断
2,什么是中断呢?
中断我们一般定义为,打断CPU执行顺序的事件。
在芯片中,打断CPU执行顺序的事件,有两种情况:
1)硬件中断(硬件事件)
在CPU指令周期的任何时刻都有可能发生的。
“异步中断” ==> 中断
2)编程错误(系统错误)
在执行某条指令时,产生的一种编程错误/系统错误
也需要打断CPU的执行顺序,去做错误处理。
“同步中断” ==> 异常
中断源: 产生中断的设备。
3,STM32F4 GEC库中断配置
#include “gec_int.h”
//中断函数类型
typedef void (*isr_t) (void);//自定义的中断处理函数类型
//注册用户级的中断处理函数
void Gec_Int_Register(unsigned int int_id, isr_t isr);
@int_id: 中断编号,用来表示是哪个中断
@isr:interrupt service routine,函数指针
//注销用户级的中断处理函数
void Gec_Int_Unregister(unsigned int int_id);
//使能中断函数
void Gec_Int_Enable(unsigned int int_id);
//禁用中断函数
void Gec_Int_Disable(unsigned int int_id);
//外部中断标志位清除函数
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位
##我们智能小车的知识就总结到这啦,如果有所帮助,可以点赞收藏哦,也不忘给笔者点个关注吧