一、LED灯
首先,Nucleo开发板上一共有8颗LED灯
LED1~3是用户LED :LED1:绿色;LED2蓝色;:LED3:红色
LED4 :三色(绿色,橙色,红色)提供有关ST-LINK的与PC的信息沟通状态。默认颜色是红色的。LD4变成绿色表 示PC与ST-LINK / V2-1之间正在进行通讯,具体如下:
•慢速闪烁红色/熄灭:在USB初始化之前已经接通电源
•快速闪烁红色/熄灭:PC和ST-LINK / V2-1(枚举)之间的第一次正确通信之后的状态,
•红色LED亮起:PC和ST-LINK / V2-1之间的初始化完成时
•绿色LED亮起:通信初始化成功后
•闪烁红色/绿色:通信期间
•绿灯亮起:通信完成并成功
•橙灯亮:通信失败
LED5 :USB电源警告,LD5指示USB供电(U5V)超过500mA,用户必须使用外部电源为电路板供电。
LED6 :PWR,绿色LED指示STM32芯片已上电,CN8引脚9和CN11引脚18上有+5 V电源。
LED7和LED8 :USB FS或设备的指示。
这里我们编程使用的是LED1~LED3。根据用户手册的说明,在Cube里配置引脚:LED1默认在PB0口。
打开原理图发现,这三个用户LED连接的方式不一样,LED2和LED3都是直接接IO口,另一端接地,IO推挽输出高的时候灯被点亮。
但LED1就不一样了,它是通过一个运算放大器来驱动的,型号:TSV631AILT,是ST设计的的轨到轨CMOS运算放大器,可以运行在从1.5到5.5 V的电压范围,而且功耗很低,5V电压时的功耗只有60uA。此电路是一个典型的电压跟随器,同相输入端为高电平时,输出就是高电平,所以当PB0为高时,LED1点亮。以前见到的LED驱动电路大多是直接接IO口,另一端接VDD或VCC,用三极管驱动的都很少,这次竟然见到了用运放驱动的电路,不知道ST这么设计的原因是什么。
配置PB0、PB7、PB14的IO引脚为输出模式
- GPIO outputLevel (管脚输出状态):低电平。
- GPIO mode (管脚模式 ):推挽输出。
- GPIO Pull-up/pull-down(上拉/下拉):不上拉也不下拉。
- Maximum output speed (最大输出速度):高速。
- User Label (用户标签):LED1~3。
设置好后,回到引脚配置界面发现,LED的三个引脚已经自动改成了自己定的标签:
时钟配置在上一篇的工程里已经配置好216MHz的主频了,使用ST_Link的MCO的8MHz输入。
在配置选项里选择CORTEX_M7,
1) Flash Interface:选择 Flash 接口,为 AXI 或者 TCM。
2) ARI ACCLERATOR:使能缓存加速。
3) Instruction Prefetch:使能指令预取。
4) CPU ICache:使能 I-Cache。
5) CPU DCache: 使能 D-Cache。
最后生成代码,
在main.h文件里,有如下的宏定义:
#define LED1_Pin GPIO_PIN_0
#define LED1_GPIO_Port GPIOB
#define LED3_Pin GPIO_PIN_14
#define LED3_GPIO_Port GPIOB
#define LED2_Pin GPIO_PIN_7
#define LED2_GPIO_Port GPIOB
在主函数while(1)添加以下代码:
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
HAL_Delay(500);
配置Debug选项:
下载到开发板,现象如下图所示,三个LED灯循环点亮和熄灭。
二、按键
接着在工程的基础上添加按键(采用查询方式)
用户手册:两个按键,一个用户按键(PC13),一个复位按键。
默认是下拉的,按键按下为高电平。
在Cube中配置如图:
选择GPIO_Input
配置Pin的参数如下图:
生成代码,在main.h函数中,又有了关于KEY的宏定义。GPIO的初始化函数中,也自动生成了按键的初始化程序。
#define KEY_Pin GPIO_PIN_13
#define KEY_GPIO_Port GPIOC
在主函数的while(1)中添加如下代码:
if( HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == GPIO_PIN_SET )
{
Led_Set++;
HAL_Delay(300);
if(Led_Set>=4) Led_Set=1;
if(Led_Set==1)
{
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
else if (Led_Set==2)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
}
else if (Led_Set==3)
{
HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
}
}
下载到开发板里,效果如图所示: